下列说法正确的是
- 使用Object.assign(obj1, obj2)可以实现对象的浅拷贝
- for ... in 循环只能遍历对象上的可枚举属性
- Object。keys( ) 不可以遍历出对象原型链上的属性
ES5 引入了Object。keys方法, 成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键名。
for ... in循环对象的所有枚举属性(包括原型上), 然后在使用hasOwenProperty()方法来忽略继承属性
严格模式
- this不再强制封装为一个对象, 若没有指定this的话则是indefined。
- 给一个未声明的变量赋值会触发ReferenceError错误, 而不再自动声明为全局变量
- 给对象的不可写属性或只读属性赋值, 给不可拓展的对象新属性赋值, 试图删除对象中不可删除的属性会抛出TypeError错误, 而不再静默失败
- 对象属性重名, 函数参数重名均为语法错误
- 无法使用以0开头的八进制表示数字的语法
- 为原始值设置属性将抛出TypeError错误
- 禁用with语法
- 禁止删除声明的变量
- 函数中arguments对象的属性值与函数参数值不再同步改变
- 增加了一些保留字无法被作为变量名或形参名使用
== 比较
null == undefined
0.1 + 0.2 == 0.3
typeof NaN
typeof Function
typeof Object
typeof {}
'a' + 1
'a' - 1
Function instanceof Object
Object instanceof Function
true
false
'number'
'function
'function'
'object'
'a1'
NaN
true
true
0.1 + 0.2 是一个无线接近 0.3的值, 它不等于0.3
在JavaScript中的二进制的浮点数0.1和0.2并不是十分精确,在他们相加的结果并非正好等于0.3,而是一个比较接近的数字 0.30000000000000004 ,所以条件判断结果为false
严格模式和this指针
'use strict'
var name = 'Jay'
var person ={
name : 'Wang',
pro:{
name:'Michael',
getName:function(){
return this.name;
}
}
}
console.log(person.pro.getName());
var pepole = person.pro.getName;
console.log(pepole());
'Michael'
throw Error
person.pro调用了getName(), getName()里面的this指向了personpro, 所以这里this.name = ‘Michael’
将person.pro.getName方法赋给了pepole, 然后再全局执行上下文中调用了people() 因为是在严格模式下执行, 所以pepole()是指向undefined, undefined又获取name属性, 最后导致报错
严格模式不同(再记忆一次)
- 不允许不适用var关键字去创建全局变量, 抛出ReferenceError
- 不允许对变量使用delete操作符, 抛ReferenceError
- 不可对对象的只读属性赋值, 不可对对象的不可配置属性使用delete操作符, 不可为不可拓展的对象添加属性, 均抛TypeError
- 对象属性名必须唯一
- 函数中不可有重名参数
- 在函数中不可有重名参数
- 在函数内部对修改参数不会反应到arguments中
- 淘汰arguments.callee和arguments.caller
- 不可在if内部声明函数
- 抛弃with语句