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值属性