ES5 比較兩個值是否相等,只有兩個運算符:相等運算符(==
)和嚴格相等運算符(===
)。它們都有缺點,前者會自動轉換數據類型,後者的NaN
不等於自身,以及+0
等於-0
。es6
ES6 提出「Same-value equality」(同值相等)算法,用來解決這個問題。Object.is
就是部署這個算法的新方法。它用來比較兩個值是否嚴格相等,與嚴格比較運算符(===)的行爲基本一致,不一樣之處只有兩個:一是+0
不等於-0
,二是NaN
等於自身。算法
Object.is(NaN, NaN) // true Object.is(+0, -0) // false
ES5 能夠經過下面的代碼,部署Object.is
。數組
Object.defineProperty(Object, 'is', { value: function(x, y) { if (x === y) { // 針對+0 不等於 -0的狀況 return x !== 0 || 1 / x === 1 / y; } // 針對NaN的狀況 return x !== x && y !== y; }, configurable: true, enumerable: false, writable: true });
Object.assign
方法用於對象的合併,將源對象(source)的全部可枚舉屬性,複製到目標對象(target)。函數
Object.assign(target, source1, source2, ...);
Object.assign
方法的第一個參數是目標對象,後面的參數都是源對象。spa
若是非對象參數出如今源對象的位置(即非首參數),那麼處理規則有所不一樣。首先,這些參數都會轉成對象,若是沒法轉成對象,就會跳過。code
非對象類型的值,除了字符串會以數組形式,拷貝入目標對象,其餘值都不會產生效果。對象
{ "0": "h", "1": "i", "2": "!" }
Object.assign({b: 'c'}, Object.defineProperty({}, 'invisible', { enumerable: false, value: 'hello' }) )
Object.defineProperty用於定義對象屬性具體狀況get set value enumerable等屬性描述符。字符串
(1)淺拷貝部署
Object.assign
方法實行的是淺拷貝,而不是深拷貝。也就是說,若是源對象某個屬性的值是對象,那麼目標對象拷貝獲得的是這個對象的引用。get
(2)同名屬性的替換
對於這種嵌套的對象,一旦遇到同名屬性,Object.assign
的處理方法是替換,而不是添加。
(3)數組的處理
Object.assign
能夠用來處理數組,可是會把數組視爲對象。
Object.assign
把數組視爲屬性名爲 0、一、2 的對象,後邊加上的數組會進行覆蓋。
(4)取值函數的處理
Object.assign
只能進行值的複製,若是要複製的值是一個取值函數,那麼將求值後再複製。
一些函數庫提供Object.assign
的定製版本(好比 Lodash 的_.defaultsDeep
方法),能夠獲得深拷貝的合併。