对象的扩展
属性的简洁表示法
ES6 允许直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁。
属性名表达式
JavaScript 定义对象的属性,有两种方法
方法一是直接用标识符作为属性名,方法二是用表达式作为属性名,这时要将表达式放在方括号之内
注意,属性名表达式如果是一个对象,默认情况下会自动将对象转为字符串[object Object]
方法的 name 属性
函数的name属性,返回函数名。对象方法也是函数,因此也有name属性
如果对象的方法使用了取值函数(getter)和存值函数(setter),则name属性不是在该方法上面,而是该方法的属性的描述对象的get和set属性上面,返回值是方法名前加上get和set
bind方法创造的函数,name属性返回bound加上原函数的名字;
Function构造函数创造的函数,name属性返回anonymous
如果对象的方法是一个 Symbol 值,那么name属性返回的是这个 Symbol 值的描述
Object.is()
用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致
不同之处只有两个:一是 0不等于-0,二是NaN等于自身
Object.assign()
Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)
如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性
如果非对象参数出现在源对象的位置(即非首参数),那么处理规则有所不同。首先,这些参数都会转成对象,如果无法转成对象,就会跳过
这意味着,如果undefined和null不在首参数,就不会报错
Object.assign拷贝的属性是有限制的,只拷贝源对象的自身属性(不拷贝继承属性),也不拷贝不可枚举的属性(enumerable: false)
Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用
浅拷贝