华为|前端人必看的JS面试题汇总( 二 )


7、不能删除变量delete prop , 会报错 , 只能删除属性delete global[prop

8、eval不会在它的外层作用域引入变量
9、eval和arguments不能被重新赋值
10、arguments不会自动反映函数参数的变化
11、不能使用arguments.callee
12、不能使用arguments.caller
13、禁止this指向全局对象
14、不能使用fn.caller和fn.arguments获取函数调用的堆栈
15、增加了保留字(比如protected、static和interface)
十、es6新增
1、新增模板字符串
2、箭头函数
3、for-of(用来遍历数据—例如数组中的值 。 )
4、ES6 将 Promise 对象纳入规范 , 提供了原生的 Promise 对象 。
5、增加了 let 和 const 命令 , 用来声明变量 。
6、引入 module 模块的概念
十一、attribute 和 property 的区别
attribute 是 dom 元素在文档中作为 html 标签拥有的属性 , 而property 就是 dom 元素在 JS 中作为对象拥有的属性 。 对于 html 的标准属性来说 , attribute 和 property 是同步的 , 是会自动更新的 , 但是对于自定义的属性来说 , 他们是不同步的 。
十二、let和const 的区别
let和const很相似 , 但是let 命令不存在变量提升 , 如果在 let 前使用 , 会导致报错 。 如果块区中存在 let 和 const 命令 , 就会形成封闭作用域 。 不允许重复声明 。 const定义的是常量 , 不能修改 , 但是如果定义的是对象 , 可以修改对象内部的数据 。
十三、内存泄漏
内存泄漏指的是程序中己动态分配的堆内存由于某种原因程序未释放或无法释放引发的各种问题 。
内存泄漏结果:变慢 , 崩溃 , 延迟大等
内存泄漏原因:全局变量 , dom 清空时 , 还存在引用 , 定时器未清除 , 子元素存在引起的内存泄露 。
十四、数组(array)方法
map : 遍历数组 , 返回回调返回值组成的新数组
forEach : 无法 break, 可以用 try/catch 中 throw new Error 来停止
filter : 过滤
some : 有一项返回 true, 则整体为 true
every: 有一项返回 false, 则整体为 false
join: 通过指定连接符生成字符串
push / pop: 末尾推入和弹出 , 改变原数组 ,返回推入/弹出项
unshift / shift: 头部推入和弹出 , 改变原数组 , 返回操作项
sort(fn) / reverse : 排序与反转 , 改变原数组
concat : 连接数组 , 不影响原数组 ,浅拷贝
slice(start end): 返回截断后的新数组 , 不改变原数组
splice(startnumbervalue…): 返回删除元素组成的数组 , value 为插入项 , 改变原数组
indexOf / lastIndexOf(value fromIndex) : 查找数组项 , 返回对应的下标
reduce / reduceRight(fn(prev cur), defaultPrev) : 两两执行 , prev 为上次化简函数的return 值 , cur 为当前值(从第二项开始)
十五、JavaScript 深浅拷贝
浅拷贝:Object.assign
深拷贝:可以通过 JSON.parse(JSON.stringify(object)) 来解决
十六、异步编程的实现方式
1、回调函数
优点:简单、容易理解
缺点:不利于维护、代码耦合高
2、事件监听
优点:容易理解 , 可以绑定多个事件 , 每个事件可以指定多个回调函数
缺点:事件驱动型 , 流程不够清晰
3、发布/订阅(观察者模式)
类似于事件监听 , 但是可以通过‘消息中心’ , 了解现在有多少发布者 , 多少订阅者
4、Promise 对象
优点:可以利用 then 方法 , 进行链式写法;可以书写错误时的回调函数
缺点:编写和理解 , 相对比较难
5、Generator 函数
优点:函数体内外的数据交换、错误处理机制
缺点:流程管理不方便