"Code tailor",爲前端開發者提供技術相關資訊以及系列基礎文章,微信關注「小和山的菜鳥們」公衆號,及時獲取最新文章。
在開始學習以前,咱們想要告訴您的是,本文章是對阮一峯《ECMAScript6 入門》一書中 "對象的擴展" 章節的總結,若是您已掌握下面知識事項,則可跳過此環節直接進入題目練習javascript
若是您對某些部分有些遺忘,👇🏻 已經爲您準備好了!前端
對象的擴展學習java
ES6
容許在大括號裏面,直接寫入變量和函數,做爲對象的屬性和方法
let birth = '1999/01/01' const Person = { name: '李四', //等同於birth: birth birth, // 等同於hello: function ()... hello() { console.log('個人名字是', this.name) }, }
Symbol
屬性)。Symbol
屬性)的鍵名。Symbol
屬性,可是包括不可枚舉屬性)的鍵名。Symbol
屬性的鍵名。Symbol
或字符串,也無論是否可枚舉。以上的 5 種方法遍歷對象的鍵名,都遵照一樣的屬性遍歷的次序規則。es6
Symbol
鍵,按照加入時間升序排列。指向當前對象的原型對象
const proto = { foo: 'hello', } const obj = { foo: 'world', find() { return super.foo }, } Object.setPrototypeOf(obj, proto) obj.find() // "hello" //上面代碼中,對象obj.find()方法之中,經過super.foo引用了原型對象proto的foo屬性。
注意,super
關鍵字表示原型對象時,只能用在對象的方法之中,用在其餘地方都會報錯。數組
1. 解構賦值微信
對象的解構賦值用於從一個對象取值,至關於將目標對象自身的全部可遍歷的(
enumerable
)、但還沒有被讀取的屬性,分配到指定的對象上面。全部的鍵和它們的值,都會拷貝到新對象上面。
let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 } x // 1 y // 2 z // { a: 3, b: 4 } //變量z是解構賦值所在的對象。它獲取等號右邊的全部還沒有讀取的鍵(a和b) //將它們連同值一塊兒拷貝過來。
注意: 函數
undefined
或 null
,就會報錯,由於它們沒法轉爲對象。let obj = { a: { b: 1 } } let { ...x } = obj obj.a.b = 2 x.a.b // 2
1. 擴展運算符學習
取出參數對象的全部可遍歷屬性,拷貝到當前對象之中。
let z = { a: 3, b: 4 } let n = { ...z } n // { a: 3, b: 4 }
注意: this
let foo = { ...['a', 'b', 'c'] } foo // {0: "a", 1: "b", 2: "c"}
{...{}, a: 1} // { a: 1 }
// 等同於 {...Object(1)} {...1} // {}
Object.assign()
方法。let aClone = { ...a } // 等同於 let aClone = Object.assign({}, a)
一: 使用擴展運算符,進行深拷貝,將 obj1 的內容拷貝到 obj2 中(不考慮對象嵌套的問題).code
二: 如下哪一種方式爲不正確的定義字面量對象的方法?
A.
var obj = { foo: true, abc: 123, }
B.
let propKey = 'foo' let obj = { [propKey]: true, ['a' + 'bc']: 123, }
C.
const foo = 'bar' const baz = { [foo]: 'abc' }
D.
const foo = 'bar'; const bar = 'abc'; const baz = { [foo] };
三: 如下三個對象使用擴展運算符進行拼接,輸出結果是什麼?
let obj1 = { name: 'hzq', age: 18 } let obj2 = { name: 'yry', age: 19 } let obj3 = { name: 'ljj', age: 20, role: 'boss' } let obj4 = { ...obj1, ...obj2, ...obj3 } console.log(obj4) // {name: 'ljj', age: 20, role: 'boss'}
1、
Answer:
let obj1 = { name: 'hzq', age: 18 } let obj2 = { ...obj1 }
對象中的擴展運算符(...)
用於取出參數對象中的全部可遍歷屬性,拷貝到當前對象之中
2、
Answer:D
A 選項爲標準的 ES5
定義字面量對象的方法。B 選項爲 ES6
中,在大括號中,容許使用表達式做爲對象屬性名。C 選項如同 B 選項。D 選項的錯誤在於,屬性名錶達式與簡潔表示法沒法同時使用。
3、
Answer:
擴展運算符的使用將obj1,obj2,obj3
三個變成{name: 'hzq', age: 18, name: 'yry', age:19, name: 'ljj', age:20, role:'boss'}
這裏有一個注意點就是:若是是對象的拼接,對於同一個 key 的鍵值對,後面的會覆蓋前面的
因此最終結果變就是{name: 'ljj', age:20, role:'boss'}