#8.1 屬性的簡潔表示
let a = 'a1';
let b = { a }; // b => { a : 'a1' }
// 等同于
let b = { a : a };
function f(a, b){
return {a, b};
}
// 等同于
function f (a, b){
return {a:a ,b:b};
}
let a = {
fun () {
return 'leo';
}
}
// 等同于
let a = {
fun : function(){
return 'leo';
}
}
#8.2 屬性名表達式
JavaScript
提供2種方法定義對象的屬性。
// 方法1 標識符作為屬性名
a.f = true;
// 方法2 字符串作為屬性名
a['f' + 'un'] = true;
延伸出來的還有:
let a = 'hi leo';
let b = {
[a]: true,
['a'+'bc']: 123,
['my' + 'fun'] (){
return 'hi';
}
};
// b.a => undefined ; b.abc => 123 ; b.myfun() => 'hi'
// b[a] => true ; b['abc'] => 123 ; b['myfun'] => ? ['my' + 'fun'] (){ return 'hi'; }
注意:
屬性名表達式不能與簡潔表示法同時使用作谚,否則報錯。
// 報錯
let a1 = 'aa';
let a2 = 'bb';
let b1 = {[a1]};
// 正確
let a1 = 'aa';
let b1 = { [a1] : 'bb'};
#8.3 Object.is()
Object.is()
用于比較兩個值是否嚴格相等庵芭,在ES5時候只要使用相等運算符(==
)和嚴格相等運算符(===
)就可以做比較妹懒,但是它們都有缺點,前者會自動轉(zhuǎn)換數(shù)據(jù)類型双吆,后者的NaN
不等于自身眨唬,以及+0
等于-0
会前。
Object.is('a','a'); // true
Object.is({}, {}); // false
// ES5
+0 === -0 ; // true
NaN === NaN; // false
// ES6
Object.is(+0,-0); // false
Object.is(NaN,NaN); // true
#8.4 Object.assign()
Object.assign()
方法用于對象的合并,將原對象的所有可枚舉屬性復(fù)制到目標對象匾竿。
基礎(chǔ)用法:
第一個參數(shù)是目標對象瓦宜,后面參數(shù)都是源對象。
let a = {a:1};
let b = {b:2};
Object.assign(a,b); // a=> {a:1,b:2}
注意:
- 若目標對象與源對象有同名屬性岭妖,則后面屬性會覆蓋前面屬性临庇。
let a = {a:1, b:2};
let b = {b:3, c:4};
Object.assign(a, b); // a => {a:1, b:3, c:4}
- 若只有一個參數(shù),則返回該參數(shù)昵慌。
let a = {a:1};
Object.assign(a) === a; // true
- 若參數(shù)不是對象假夺,則先轉(zhuǎn)成對象后返回。
typeof Object.assign(2); // 'object'
- 由于
undefined
或NaN
無法轉(zhuǎn)成對象废离,所以做為參數(shù)會報錯侄泽。
Object.assign(undefined) // 報錯
Object.assign(NaN); // 報錯
-
Object.assign()
實現(xiàn)的是淺拷貝礁芦。
Object.assign()
拷貝得到的是這個對象的引用蜻韭。這個對象的任何變化,都會反映到目標對象上面柿扣。
let a = {a: {b:1}};
let b = Object.assign({},a);
a.a.b = 2;
console.log(b.a.b); // 2
- 將數(shù)組當做對象處理肖方,鍵名為數(shù)組下標,鍵值為數(shù)組下標對應(yīng)的值未状。
Object.assign([1, 2, 3], [4, 5]); // [4, 5, 3]