屬性簡介表達(一)
一句話,對象的屬性如果是一個變量,那麼值就是這個變量代表的值
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"}}