9.對象的擴展
1.屬性的簡潔表示法
es6允許直接寫入變量和函數(shù)回季,作為對象的屬性和方法--為了簡潔
2.屬性名表達式
字面量定義對象厕怜,除es5中的標(biāo)識符定義屬性外纺讲,es6新增 表達式放到方括號內(nèi) 來作為對象的屬性名/方法名。
注意:
3.方法的name屬性
函數(shù)的name屬性矛辕,返回函數(shù)名笑跛。對象方法也是函數(shù),因此也有name屬性聊品。
注意點:
1.使用了取值函數(shù)(getter)和存值函數(shù)(setter)飞蹂,會在name前加上‘get/set’
2.特殊情況1:bind方法創(chuàng)造的函數(shù),name屬性返回bound加上原函數(shù)的名字
3.特殊情況2:如果對象的方法是一個 Symbol 值翻屈,那么name屬性返回的是這個 Symbol 值的描述
4.Object.is()
用于比較兩個值是否嚴(yán)格相等陈哑;彌補===的兩個缺陷:
1)+0===-0? //true
2)NaN===NaN? //false
5.Object.assign()
用于對象的合并,將源對象(source)的所有可枚舉屬性惊窖,復(fù)制到目標(biāo)對象(target)用于對象的合并刽宪,將源對象(source)的所有可枚舉屬性,復(fù)制到目標(biāo)對象(target)界酒;例如:Object.assign(target,source1,source2);
特點:
1)若出現(xiàn)同名屬性圣拄,則后面的屬性會覆蓋前面的屬性
2)Object.assign(obj)===obj // true
如果只有一個參數(shù),Object.assign會直接返回該參數(shù)毁欣。
3)
4)source無法轉(zhuǎn)換成對象(null,undefined)庇谆,則會被跳過處理;
? 其他類型的值(即數(shù)值、字符串和布爾值)不在首參數(shù)凭疮,也不會報錯饭耳。但是,除了字符串會以數(shù)組形式执解,拷貝入目標(biāo)對象寞肖,其他值都不會產(chǎn)生效果。
5)Object.assign拷貝的屬性是有限制的材鹦,只拷貝源對象的自身屬性(不拷貝繼承屬性)逝淹,也不拷貝不可枚舉的屬性(enumerable: false)
6)屬性名為 Symbol 值的屬性,也會被Object.assign拷貝
Object.assign({ a: 'b' }, { [Symbol('c')]: 'd' })
// { a: 'b', Symbol(c): 'd' }
注意點:
1)淺拷貝
如果源對象某個屬性的值是對象桶唐,那么目標(biāo)對象拷貝得到的是這個對象的引用
2)同名屬性是替換而非添加
3)數(shù)組的處理
4)取值函數(shù)的處理
Object.assign只能進行值的復(fù)制栅葡,如果要復(fù)制的值是一個取值函數(shù),那么將求值后再復(fù)制
Object.assign()方法的常見用途:
1)為對象添加屬性
2)為對象添加方法
3)克隆對象
4)合并多個對象
5)為屬性指定默認值
6.屬性的可枚舉性和遍歷
可枚舉性
描述對象的enumerable屬性尤泽,稱為”可枚舉性“欣簇,如果該屬性為false,就表示某些操作會忽略當(dāng)前屬性坯约。
目前熊咽,有四個操作會忽略enumerable為false的屬性。
for...in循環(huán):只遍歷對象自身的和繼承的可枚舉的屬性闹丐。
Object.keys():返回對象自身的所有可枚舉的屬性的鍵名横殴。
JSON.stringify():只串行化對象自身的可枚舉的屬性。
Object.assign(): 忽略enumerable為false的屬性卿拴,只拷貝對象自身的可枚舉的屬性衫仑。
總的來說,操作中引入繼承的屬性會讓問題復(fù)雜化堕花,大多數(shù)時候文狱,我們只關(guān)心對象自身的屬性。所以缘挽,盡量不要用for...in循環(huán)瞄崇,而用Object.keys()代替呻粹。
遍歷
es6的5種方法遍歷屬性:
1)for...in
2)Object.keys()
3)Object.ownKeys()
4)Object.getOwnPropertyNames(obj)
5)Object.getOwnPropertySymbols(obj)
以上的 5 種方法遍歷對象的鍵名,都遵守同樣的屬性遍歷的次序規(guī)則苏研。
首先遍歷所有數(shù)值鍵等浊,按照數(shù)值升序排列。
其次遍歷所有字符串鍵楣富,按照加入時間升序排列凿掂。
最后遍歷所有 Symbol 鍵,按照加入時間升序排列纹蝴。
7.Object.getOwnPropertyDescriptors()
Object.getOwnPropertyDescriptor方法會返回某個對象屬性的描述對象(descriptor)庄萎。ES2017 引入了Object.getOwnPropertyDescriptors方法,返回指定對象所有自身屬性(非繼承屬性)的描述對象
8.原型鏈對象的操作方法:__proto__屬性塘安,Object.setPrototypeOf(),Object.getPrototypeOf()
(1)__proto__屬性:
讀取或設(shè)置當(dāng)前對象的prototype對象(原型對象)
標(biāo)準(zhǔn)明確規(guī)定糠涛,只有瀏覽器必須部署這個屬性,其他運行環(huán)境不一定需要部署兼犯,而且新的代碼最好認為這個屬性是不存在的忍捡。
無論從語義的角度,還是從兼容性的角度切黔,都不要使用這個屬性砸脊,而是使用下面的Object.setPrototypeOf()(寫操作)、Object.getPrototypeOf()(讀操作)纬霞、Object.create()(生成操作)代替
實現(xiàn)上凌埂,__proto__調(diào)用的是Object.prototype.__proto__
(2)Object.setPrototypeOf()
用來設(shè)置一個對象的prototype對象,返回參數(shù)對象本身(ES6 正式推薦的設(shè)置原型對象的方法)
注意:
1)第一個參數(shù)不是對象時伏恐,會自動轉(zhuǎn)成對象孩哑,但方法返回的時第一個參數(shù)本身,所以不會有變化
2)若第一個參數(shù)是undefined或null,無法轉(zhuǎn)成對象翠桦,則會報錯
(3)Object.getPrototypeOf()
用來讀取對象的prototype對象? 格式:Object.getPrototypeOf(obj)
注意點同Object.setPrototypeOf()
9.super關(guān)鍵字
this關(guān)鍵字總是指向函數(shù)所在的當(dāng)前對象横蜒,ES6 又新增了另一個類似的關(guān)鍵字super,指向當(dāng)前對象的原型對象
JavaScript 引擎內(nèi)部,super.foo等同于Object.getPrototypeOf(this).foo(屬性)或Object.getPrototypeOf(this).foo.call(this)(方法)闻鉴。
10.Object.keys(),Object.values(),Object.entries()--鍵,值茂洒,鍵值對
Object.keys():ES5中引入的孟岛,返回一個數(shù)組,成員是參數(shù)對象自身的(不含繼承的)所有可遍歷(enumerable)屬性的鍵名;
后兩個方法也是不含繼承的渠羞,可遍歷的斤贰;返回數(shù)組的成員順序,與本章的《屬性的遍歷》部分介紹的排列規(guī)則一致
ES2017 引入了跟Object.keys配套的Object.values和Object.entries次询,作為遍歷一個對象的補充手段荧恍,供for...of循環(huán)使用。
11.對象的擴展運算符...
ES2017 將這個運算符引入了對象屯吊;? 和數(shù)組的擴展運算符很相似
用于:(1)解構(gòu)賦值--擴展運算符的解構(gòu)賦值送巡,不能復(fù)制繼承自原型對象的屬性
(2)擴展運算符--用于取出參數(shù)對象的所有可遍歷屬性,拷貝到當(dāng)前對象之中