属性简介表达(一)
一句话,对象的属性如果是一个变量,那么值就是这个变量代表的值
let name = 'uzi';
let user = {name};
user // {name: "uzi"}
// 对于对象中方法也一样
let test = {
tt() {}
};
// 等同于
let test = {
tt: function () {}
}
属性名表达式
使用字面量方式定义对象(使用大括号),则在 ES5 中只能使用方法 (标识
符)定义属性。
let obj = {
name: 'uzi'
}
ES6 允许字面量定义对象时用表达式作为对象 属性名,把属性名放在[]内
let pro = 'name';
let obj = {
[pro]: 'uzi'
}
// 与上面es5定义的相同
注意:属性名表达式和属性简介表达不能同时使用,会报错
let pro = 'name';
let obj = {
[pro]
}; //Uncaught SyntaxError: Unexpected token }
Object.is()
es5中有两种判断相等的运算符:相等运算符(==)、严格相等运算符(===)。 他们都有自己的缺点,相等运算符会自动进行类型转换,严格相等运算符中存在NaN不等于自身,+0等于-0的问题。es6提出了“ Same-value equality ”(同值相等)算法,即在所有环境中,只要连个值一样,就相等,Object.is()就是部署在这个算法上的新方法。
Object.is(NaN, NaN); // true
Object.is(+0, -0); // false
Object.assign()
用于合并对象,第一个参数是目标对象,后面的参数是源对象(别合并),如果目标对象和源对象中有相同的属性,后者将覆盖前者。
// 目标对象
let target = {};
// 源对象1
let source1 = {
a: 'a'
};
// 源对象2
let source2 = {
b: 'b'
};
Object.assign(target, source1, source2);
target; // {a: "a", b: "b"}
注意:Object.assign()在合并对象时,如果源对象中没有属性是对象的时候,其实是深拷贝,当源对象中存在属性为对象时,第一层是深拷贝,后面为浅拷贝。
// 目标对象
let target = {};
// 源对象1
let source1 = {
a: 'a',
obj: {
b: 'a'
}
};
Object.assign(target, source1);
target; //{a: "a",obj: {b: "a"}}
// 改变源对象第一层
source1.a = 'b';
// 发现目标对象没有改变(深拷贝)
target; //{a: "a",obj: {b: "a"}}
// 改变源对象第二层
source1.obj.b = 'b';
// 发现目标对象发生改变(浅拷贝)
target; //{a: "a",obj: {b: "b"}}