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