北京建设工程协会网站,企业信息管理系统下载,工信部备案查询网官网,河北建设工程信息网中标公示计算属性和watch有什么区别?以及它们的运用场景?
// 区别computed 计算属性#xff1a;依赖其它属性值#xff0c;并且computed的值有缓存#xff0c;只有它依赖的属性值发生改变#xff0c;下一次获取computed的值时才会重新计算computed的值。watch 侦听器#xff1a…计算属性和watch有什么区别?以及它们的运用场景?
// 区别computed 计算属性依赖其它属性值并且computed的值有缓存只有它依赖的属性值发生改变下一次获取computed的值时才会重新计算computed的值。watch 侦听器更多的是观察的作用,无缓存性,类似与某些数据的监听回调,每当监听的数据变化时都会执行回调进行后续操作
//运用场景当需要进行数值计算,并且依赖与其它数据时,应该使用computed,因为可以利用computed的缓存属性,避免每次获取值时都要重新计算。当需要在数据变化时执行异步或开销较大的操作时,应该使用watch,使用watch选项允许执行异步操作访问一个API),限制执行该操作的频率并在得到最终结果前设置中间状态。这些都是计算属性无法做到的。
如何根据设计稿进行移动端适配
移动端适配主要有两个维度
适配不同像素密度 针对不同的像素密度使用 CSS 媒体查询选择不同精度的图片以保证图片不会失真适配不同屏幕大小 由于不同的屏幕有着不同的逻辑像素大小所以如果直接使用 px 作为开发单位会使得开发的页面在某一款手机上可以准确显示但是在另一款手机上就会失真。为了适配不同屏幕的大小应按照比例来还原设计稿的内容。
为了能让页面的尺寸自适应可以使用 rememvwvh 等相对单位。
JS 数据类型
基本类型Number、Boolean、String、null、undefined、symbolES6 新增的BigIntES2020 引用类型Object对象子类型ArrayFunction
Vue通信
1.props和$emit
2.中央事件总线 EventBus(基本不用)
3.vuex(官方推荐状态管理器)
4.$parent和$children
当然还有一些其他办法但基本不常用或者用起来太复杂来。 介绍来通信的方式还可以扩展说一下使用
场景如何使用注意事项之类的。
new 一个构造函数如果函数返回 return {} 、 return null return 1 return true 会发生什么情况
如果函数返回一个对象那么new 这个函数调用返回这个函数的返回对象否则返回 new 创建的新对象
宏任务和微任务分别有哪些
微任务包括 promise 的回调、node 中的 process.nextTick 、对 Dom 变化监听的 MutationObserver。宏任务包括 script 脚本的执行、setTimeout setInterval setImmediate 一类的定时事件还有如 I/O 操作、UI 渲染等。
参考 前端进阶面试题详细解答
ES6新特性
1.ES6引入来严格模式变量必须声明后在使用函数的参数不能有同名属性, 否则报错不能使用with语句 (说实话我基本没用过)不能对只读属性赋值, 否则报错不能使用前缀0表示八进制数,否则报错 (说实话我基本没用过)不能删除不可删除的数据, 否则报错不能删除变量delete prop, 会报错, 只能删除属性delete global[prop]eval不会在它的外层作用域引入变量eval和arguments不能被重新赋值arguments不会自动反映函数参数的变化不能使用arguments.caller (说实话我基本没用过)不能使用arguments.callee (说实话我基本没用过)禁止this指向全局对象不能使用fn.caller和fn.arguments获取函数调用的堆栈 (说实话我基本没用过)增加了保留字比如protected、static和interface2.关于let和const新增的变量声明3.变量的解构赋值4.字符串的扩展includes()返回布尔值表示是否找到了参数字符串。startsWith()返回布尔值表示参数字符串是否在原字符串的头部。endsWith()返回布尔值表示参数字符串是否在原字符串的尾部。
5.数值的扩展Number.isFinite()用来检查一个数值是否为有限的finite。Number.isNaN()用来检查一个值是否为NaN。
6.函数的扩展函数参数指定默认值
7.数组的扩展扩展运算符
8.对象的扩展对象的解构
9.新增symbol数据类型10.Set 和 Map 数据结构 ES6 提供了新的数据结构 Set。它类似于数组但是成员的值都是唯一的没有重复的值。 Set 本身是一个构造函数用来生成 Set 数据结构。Map它类似于对象也是键值对的集合但是“键”的范围不限于字符串各种类型的值包括对象都可以当作键。
11.ProxyProxy 可以理解成在目标对象之前架设一层“拦截”外界对该对象的访问都必须先通过这层拦截因此提供了一种机制可以对外界的访问进行过滤和改写。Proxy 这个词的原意是代理用在这里表示由它来“代理”某些操作可以译为“代理器”。Vue3.0使用了proxy
12.PromisePromise 是异步编程的一种解决方案比传统的解决方案——回调函数和事件——更合理和更强大。特点是对象的状态不受外界影响。一旦状态改变就不会再变任何时候都可以得到这个结果。
13.async 函数 async函数对 Generator 函数的区别1内置执行器。Generator 函数的执行必须靠执行器而async函数自带执行器。也就是说async函数的执行与普通函数一模一样只要一行。2更好的语义。async和await比起星号和yield语义更清楚了。async表示函数里有异步操作await表示紧跟在后面的表达式需要等待结果。3正常情况下await命令后面是一个 Promise 对象。如果不是会被转成一个立即resolve的 Promise 对象。4返回值是 Promise。async函数的返回值是 Promise 对象这比 Generator 函数的返回值是 Iterator 对象方便多了。你可以用then方法指定下一步的操作。
14.Class class跟let、const一样不存在变量提升、不能重复声明...ES6 的class可以看作只是一个语法糖它的绝大部分功能ES5 都可以做到新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。
15.ModuleES6 的模块自动采用严格模式不管你有没有在模块头部加上use strict;。import和export命令以及export和export default的区别
代码输出结果
var length 10;
function fn() {console.log(this.length);
}var obj {length: 5,method: function(fn) {fn();arguments[0]();}
};obj.method(fn, 1);
输出结果 10 2
解析
第一次执行fn()this指向window对象输出10。第二次执行arguments[0]相当于arguments调用方法this指向arguments而这里传了两个参数故输出arguments长度为2。
代码输出结果
Promise.reject(err!!!).then((res) {console.log(success, res)}, (err) {console.log(error, err)}).catch(err {console.log(catch, err)})
输出结果如下
error err!!!
我们知道.then函数中的两个参数
第一个参数是用来处理Promise成功的函数第二个则是处理失败的函数
也就是说Promise.resolve(1)的值会进入成功的函数Promise.reject(2)的值会进入失败的函数。
在这道题中错误直接被then的第二个参数捕获了所以就不会被catch捕获了输出结果为error err!!!
但是如果是像下面这样
Promise.resolve().then(function success (res) {throw new Error(error!!!)}, function fail1 (err) {console.log(fail1, err)}).catch(function fail2 (err) {console.log(fail2, err)})
在then的第一参数中抛出了错误那么他就不会被第二个参数不活了而是被后面的catch捕获到。
对事件委托的理解
1事件委托的概念
事件委托本质上是利用了浏览器事件冒泡的机制。因为事件在冒泡过程中会上传到父节点父节点可以通过事件对象获取到目标节点因此可以把子节点的监听函数定义在父节点上由父节点的监听函数统一处理多个子元素的事件这种方式称为事件委托事件代理。
使用事件委托可以不必要为每一个子元素都绑定一个监听事件这样减少了内存上的消耗。并且使用事件代理还可以实现事件的动态绑定比如说新增了一个子节点并不需要单独地为它添加一个监听事件它绑定的事件会交给父元素中的监听函数来处理。
2事件委托的特点
减少内存消耗
如果有一个列表列表之中有大量的列表项需要在点击列表项的时候响应一个事件
ul idlistliitem 1/liliitem 2/liliitem 3/li......liitem n/li
/ul
如果给每个列表项一一都绑定一个函数那对于内存消耗是非常大的效率上需要消耗很多性能。因此比较好的方法就是把这个点击事件绑定到他的父层也就是 ul 上然后在执行事件时再去匹配判断目标元素所以事件委托可以减少大量的内存消耗节约效率。
动态绑定事件
给上述的例子中每个列表项都绑定事件在很多时候需要通过 AJAX 或者用户操作动态的增加或者去除列表项元素那么在每一次改变的时候都需要重新给新增的元素绑定事件给即将删去的元素解绑事件如果用了事件委托就没有这种麻烦了因为事件是绑定在父层的和目标元素的增减是没有关系的执行到目标元素是在真正响应执行事件函数的过程中去匹配的所以使用事件在动态绑定事件的情况下是可以减少很多重复工作的。
// 来实现把 #list 下的 li 元素的事件代理委托到它的父层元素也就是 #list 上
// 给父层元素绑定事件
document.getElementById(list).addEventListener(click, function (e) {// 兼容性处理var event e || window.event;var target event.target || event.srcElement;// 判断是否匹配目标元素if (target.nodeName.toLocaleLowerCase li) {console.log(the content is: , target.innerHTML);}
});
在上述代码中 target 元素则是在 #list 元素之下具体被点击的元素然后通过判断 target 的一些属性比如nodeNameid 等等可以更精确地匹配到某一类 #list li 元素之上
3局限性
当然事件委托也是有局限的。比如 focus、blur 之类的事件没有事件冒泡机制所以无法实现事件委托mousemove、mouseout 这样的事件虽然有事件冒泡但是只能不断通过位置去计算定位对性能消耗高因此也是不适合于事件委托的。
当然事件委托不是只有优点它也是有缺点的事件委托会影响页面性能主要影响因素有
元素中绑定事件委托的次数点击的最底层元素到绑定事件元素之间的DOM层数
在必须使用事件委托的地方可以进行如下的处理
只在必须的地方使用事件委托比如ajax的局部刷新区域尽量的减少绑定的层级不在body元素上进行绑定减少绑定的次数如果可以那么把多个事件的绑定合并到一次事件委托中去由这个事件委托的回调来进行分发。
用过 TypeScript 吗它的作用是什么
为 JS 添加类型支持以及提供最新版的 ES 语法的支持是的利于团队协作和排错开发大型项目
代码输出结果
const promise1 new Promise((resolve, reject) {setTimeout(() {resolve(success)}, 1000)
})
const promise2 promise1.then(() {throw new Error(error!!!)
})
console.log(promise1, promise1)
console.log(promise2, promise2)
setTimeout(() {console.log(promise1, promise1)console.log(promise2, promise2)
}, 2000)
输出结果如下
promise1 Promise {pending}
promise2 Promise {pending}Uncaught (in promise) Error: error!!!
promise1 Promise {fulfilled: success}
promise2 Promise {rejected: Error: error!!}
正向代理和反向代理的区别
正向代理
客户端想获得一个服务器的数据但是因为种种原因无法直接获取。于是客户端设置了一个代理服务器并且指定目标服务器之后代理服务器向目标服务器转交请求并将获得的内容发送给客户端。这样本质上起到了对真实服务器隐藏真实客户端的目的。实现正向代理需要修改客户端比如修改浏览器配置。
反向代理
服务器为了能够将工作负载分不到多个服务器来提高网站性能 (负载均衡)等目的当其受到请求后会首先根据转发规则来确定请求应该被转发到哪个服务器上然后将请求转发到对应的真实服务器上。这样本质上起到了对客户端隐藏真实服务器的作用。 一般使用反向代理后需要通过修改 DNS 让域名解析到代理服务器 IP这时浏览器无法察觉到真正服务器的存在当然也就不需要修改配置了。
正向代理和反向代理的结构是一样的都是 client-proxy-server 的结构它们主要的区别就在于中间这个 proxy 是哪一方设置的。在正向代理中proxy 是 client 设置的用来隐藏 client而在反向代理中proxy 是 server 设置的用来隐藏 server。
行内元素有哪些块级元素有哪些 空(void)元素有那些
行内元素有a b span img input select strong块级元素有div ul ol li dl dt dd h1 h2 h3 h4 h5 h6 p
空元素即没有内容的HTML元素。空元素是在开始标签中关闭的也就是空元素没有闭合标签
常见的有br、hr、img、input、link、meta鲜见的有area、base、col、colgroup、command、embed、keygen、param、source、track、wbr。
说一下SPA单页面有什么优缺点
优点1.体验好不刷新减少 请求 数据ajax异步获取 页面流程2.前后端分离3.减轻服务端压力4.共用一套后端程序代码适配多端缺点1.首屏加载过慢2.SEO 不利于搜索引擎抓取
说一下怎么取出数组最多的一项
// 我这里只是一个示例
const d {};
let ary [赵, 钱, 孙, 孙, 李, 周, 李, 周, 周, 李];
ary.forEach(k !d[k] ? d[k] 1 : d[k]);
const result Object.keys(d).sort((a, b) d[b] - d[a]).filter((k, i, l) d[k] d[l[0]]);
console.log(result)
代码输出结果
const promise new Promise((resolve, reject) {console.log(1);console.log(2);
});
promise.then(() {console.log(3);
});
console.log(4);
输出结果如下
1
2
4
promise.then 是微任务它会在所有的宏任务执行完之后才会执行同时需要promise内部的状态发生变化因为这里内部没有发生变化一直处于pending状态所以不输出3。
代码输出结果
var a 10
var obj {a: 20,say: () {console.log(this.a)}
}
obj.say() var anotherObj { a: 30 }
obj.say.apply(anotherObj)
输出结果10 10
我么知道箭头函数时不绑定this的它的this来自原其父级所处的上下文所以首先会打印全局中的 a 的值10。后面虽然让say方法指向了另外一个对象但是仍不能改变箭头函数的特性它的this仍然是指向全局的所以依旧会输出10。
但是如果是普通函数那么就会有完全不一样的结果
var a 10
var obj { a: 20, say(){console.log(this.a) }
}
obj.say()
var anotherObj{a:30}
obj.say.apply(anotherObj)
输出结果20 30
这时say方法中的this就会指向他所在的对象输出其中的a的值。
闭包
首先说明什么是闭包闭包简单来说就是函数嵌套函数内部函数引用来外部函数的变量从而导致垃圾回收
机制没有把当前变量回收掉这样的操作带来了内存泄漏的影响当内存泄漏到一定程度会影响你的项目运行
变得卡顿等等问题。因此在项目中我们要尽量避免内存泄漏。
原型
构造函数是一种特殊的方法主要用来在创建对象时初始化对象。每个构造函数都有prototype(原型)(箭头函数以及Function.prototype.bind()没有)属性
这个prototype(原型)属性是一个指针指向一个对象这个对象的用途是包含特定类型的所有实例共享的
属性和方法即这个原型对象是用来给实例对象共享属性和方法的。每个实例对象的__proto__都指向这个
构造函数/类的prototype属性。面向对象的三大特性继承/多态/封装关于new操作符1. new执行的函数, 函数内部默认生成了一个对象2. 函数内部的this默认指向了这个new生成的对象3. new执行函数生成的这个对象, 是函数的默认返回值ES5例子
function Person(obj) {this.name obj.namethis.age obj.age
}
// 原型方法
Person.prototype.say function() {console.log(你好,, this.name )
}
// p为实例化对象new Person()这个操作称为构造函数的实例化
let p new Person({name: 番茄, age: 27})
console.log(p.name, p.age)
p.say()ES6例子
class Person{constructor(obj) {this.name obj.namethis.age obj.age}say() {console.log(this.name)}
}let p new Person({name: ES6-番茄, age: 27})
console.log(p.name, p.age)
p.say()