1.屬性的簡潔表示:
// ES5定義對象屬性時(shí):
let name = 'jianshu';
let age = 18;
let obj1 = {
name:name,
age:age
}
//ES6中如果key和value的值是一樣的惧盹,可以直接寫成:
let obj2 = {
name,
age
}
console.log(obj1,obj2) // {name: "jianshu", age: 18} {name: "jianshu", age: 18} //結(jié)果相同
2.屬性名表達(dá)式:
若有需求需要將對象中key設(shè)置為變量,則可以用中括號包裹變量的方式 [key] 來表達(dá),例:
let s = 'company'
let obj = {
name,
age,
[s]:'簡書'
}
console.log(obj) //{name: "jianshu", age: 18, company: "簡書"}
3.Object.is(data1,data2) 判斷
//Object.is()的作用其實(shí)與'==='類似,都是判斷,例:
console.log(Object.is(1,'1')) //false
// Object.is()與 '==='的異同
Object(NaN,NaN) 判斷結(jié)果為true
NaN == NaN 判斷結(jié)果為false
4.拓展運(yùn)算符與assign()對對象的拷貝與合并:
// let obj1 = {
// a:1,
// b:2
// }
// let obj2 ={
// c:3,
// d:4
// }
// let obj3 = {...obj1,...obj2}
// let obj4 = Object.assign(obj1,obj2) {a:1,b:2,c:3,b:4}
// console.log(obj3,obj4)
// 注意:若合并對象有相同的屬性絮宁,則后拷貝對象的屬性會覆蓋前一個(gè)拷貝對象的屬性:
// 例:
// let obj1 = {
a: 1,
b: 2
}
let obj2 = {
b: 3,
c: 4
}
let obj3 = { ...obj1,...obj2} //{a: 1, b: 3, c: 4}
let obj4 = Object.assign(obj1, obj2) //{a: 1, b: 3, c: 4}
// 需注意的是拓展運(yùn)算符對淺層的基本數(shù)據(jù)類型都可以實(shí)現(xiàn)深拷貝,拷貝后的對象與原對象互不影響服协,但是绍昂,對于復(fù)雜數(shù)據(jù)類型,比如對象內(nèi)再套對象偿荷,數(shù)組治专,這些數(shù)據(jù),無法實(shí)現(xiàn)深拷貝遭顶,故,該方法不適用于復(fù)雜對象的拷貝泪蔫,
例:
let obj1 = {
a:1,
b:{
f:2
}
}
let obj2 = {
c:3,
d:4
}
let obj3 = {...obj1,...obj2}
obj1.a = 5;
obj1.b.f = 8;
console.log(obj1) //{a: 5, b:{f:8}} 可發(fā)現(xiàn)我們對obj1做的更改都已經(jīng)成功
console.log(obj3) //{a: 1,b: {f: 8},c: 3,d: 4} 第一層的a值的修改并未影響obj3中的a的值棒旗,但是b中的f跟隨obj1的修改做了修改
而assign()的拷貝,也存在以下問題
let obj1 = {
a:1,
b:2,
c:{
d:5,
h:12,
e:{
f:6,
g:7
}
}
}
let obj2 = {
a:1,
b:2,
c:{
e:{
f:8,
g:9
}
}
}
let obj3 = Object.assign(obj1,obj2)
// console.log(obj3) //{a: 1,b: 2,c:e:{f: 8,g: 9}} 輸出結(jié)果中撩荣,objc3拷貝自原obj1中c下面的d跟h消失了铣揉,也就是說,obj2餐曹,覆蓋了obj1