### 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}
~~~