javascript--Object操做

摘自ES6入門-阮一峯

Object.is()

ES5 比較兩個值是否相等,只有兩個運算符:相等運算符(==)和嚴格相等運算符(===)。它們都有缺點,前者會自動轉換數據類型,後者的NaN不等於自身,以及+0等於-0es6

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()

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方法),能夠獲得深拷貝的合併。

相關文章
相關標籤/搜索