### Object
* Object的實例屬性和實例方法
* Object的定義方式
* Object.is 對象對比
* Object.assign 對象合并
* * * * *
> ECMAScript中的對象其實就是一組數據和功能的集合,對象可以通過new操作符后跟要創建的對象名來創建,而創建Object類型的實列并為其添加屬性和方法,就可以創建自定義對象,如下:
~~~
let o = new Object()
~~~
#### Object的實例屬性和實例方法:
* constructor : 保存著用于創建當前對象的函數。對于上面的例子而言,構造函數(constructor)就是Object
* hasOwnProperty(propertyName) : 用于檢查給定的屬性是否存在于在對象中的實例中(不是對象的原型鏈中),其中,作為參數的屬性名(propertyName)必須以字符串的形式指定,如:o.hasOwnProperty("name")
* isPrototypeOf(Object) : 用于檢查傳入的對象是否是當前對象的原型
* propertyIsEnumerable(propertyName) : 用于檢查給定的屬性是否能用for...in語句來枚舉,用法與hasOwnProperty一樣
* toLocaleString() : 返回對象的字符串表示
* toString() : 作用同上
* valueOf() : 返回對象的字符串/數值或布爾值表示,通常與toString()的返回值一致
> 雖然Object對象實例不具備多少功能,但對于應用程序中存儲和傳輸數據而言,它確實是最理想的選擇。
#### Object的定義方式
> 創建Object對象實例有兩種方式,如下:
~~~
//第一種:
let andy = new Object()
andy.age =22
andy.height =183
//第二種:
let andy = {
age:"22",
height:183
}
//或者(同屬第二種方法)
let andy = {}
andy.age =22
andy.height =183
~~~
> 上面代碼中通過第二種方式(對象字面量)定義對象時,實際上并不會調用Object()構造函數。
ES6允許直接寫入變量和函數,作為對象的屬性和方法。這樣的書寫更加簡潔。如下:
~~~
let foo = 'bar';
let baz = {foo};
baz // {foo: "bar"}
// 等同于
let baz = {foo: foo};
~~~
> 除了上面定義屬性屬性的簡寫外,對象的方法也可以簡寫。如下:
~~~
let o = {
method() {
return "Hello!";
}
};
// 等同于
let o = {
method: function() {
return "Hello!";
}
};
~~~
#### Object.is 對象對比
> ES5比較兩個值是否相等,只有兩個運算符:相等運算符(==)和嚴格相等運算符(===)。它們都有缺點,前者會自動轉換數據類型,后者的NaN不等于自身,以及+0等于-0。ES6提出“Same-value equality”(同值相等)算法,用來解決這個問題。
**Object.is**就是部署這個算法的新方法。它用來比較兩個值是否嚴格相等,與嚴格比較運算符(===)的行為基本一致。如下:
~~~
Object.is('foo', 'foo')
// true
Object.is({}, {})
// false
Object.is(+0, -0)
// false
Object.is(NaN, NaN)
// true
~~~
#### Object.assign 對象合并
> **Object.assign**方法用于對象的合并,將源對象(source)的所有可枚舉屬性,復制到目標對象(target)。代碼如下:
~~~
let target = { a: 1 };
let source1 = { b: 2 };
let source2 = { c: 3 };
Object.assign(target, source1, source2);
target // {a:1, b:2, c:3}
~~~