对象的扩展

1、属性方法的简洁表示

属性简写

var foo='foo';

var goo= {'foo':foo};可以写成const goo={foo};

方法简写

var obj={

    fun:function(){

        return 'test';

    }

};

可以写成

var obj={

    fun(){return 'test';}

};

2、属性名表达式 

var obj={

    "name":"cc",

    "age":22

};

var fieldc = "field"+3;

如果其中有属性为表达式,在ES5中就必须通过obj[fieldc ]来赋值

ES6中可以写成

var obj={

    ["name"]:"cc",

    ["age"]:22,

   [fieldc ]:""

};

3、对象比较

ES5比较两个值是否相等,只有两个运算符:相等运算符(==)和严格相等运算符(===)。它们都有缺点,前者会自动转换数据类型,后者的NaN不等于自身,以及+0等于-0。

ES6提出“Same-value equality”(同值相等)算法,用来解决这个问题。Object.is就是部署这个算法的新方法。它用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致。

+0 === -0//true

NaN === NaN// false

Object.is(+0, -0)// false

Object.is(NaN, NaN)// true

4、Object.assign

Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。注意,如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。

①如果只有一个参数,Object.assign() 会直接返回该参数

Object.assign({a:"new"})//{a:"new"}

②如果该参数不是对象,会将该参数转化为对象,

typeofObject.assign(0)// "object"

③undefined 和 null 作为首参数会报错,不为首参时也不会报错

Object.assign(undefined)// 报错 Cannot convert undefined or null to objectObject.assign({},undefined)// 空对象 {}

④字符串会以数组形式拷贝到目标对象,而数值和布尔值等不会产生效果

⑤Object.assign 只拷贝源对象的自身属性(不会拷贝继承属性),也不会拷贝不可枚举的属性。

Object.assign(),会忽略enumerable为false的属性,只拷贝对象自身的可枚举的属性。

ES5中有三个操作会忽略:

for...in循环:只遍历对象自身的和继承的可枚举的属性。

Object.keys():返回对象自身的所有可枚举的属性的键名。

JSON.stringify():只串行化对象自身的可枚举的属性。

5、属性的遍历

for…in       

# for…in循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。

Object.keys(obj)         

# Object.keys返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。

Object.getOwnPropertyNames(obj)      

# Object.getOwnPropertyNames返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)。

Object.getOwnPropertySymbols(obj)

# Object.getOwnPropertySymbols返回一个数组,包含对象自身的所有 Symbol 属性。

Reflect.ownKeys(obj)

# Reflect.ownKeys返回一个数组,包含对象自身的所有属性,不管属性名是 Symbol 或字符串,也不管是否可枚举。

遍历排序:数字属性——>字符串属性——>Symbol值属性

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容