展开运算符
const arr = [3, 6, 1, 7, 2];
// 对数组的展开
Math.max(...arr); // 相当于:Math.max(3, 6, 1, 7, 2)
const o1 = {
a: 1,
b: 2,
}
const o2 = {
a: 3,
c: 4,
}
// 对对象的展开
const o3 = {
...o1,
...o2
}
/*
o3:{
a: 3,
b: 2,
c: 4
}
*/
const arr = [2,3,4];
const arr2 = [1, ...arr, 5]; // [1,2,3,4,5]
属性描述符
const user = {
name: 'monica',
age: 17
}
{
// 属性 name 的描述符
name: {
value: 'monica',
configurable: true, // 该属性的描述符是否可以被重新定义
enumerable: true, // 该属性是否允许被遍历,会影响for-in循环
writable: true // 该属性是否允许被修改
},
// 属性 age 的描述符
age: {
value: 'monica',
configurable: true, // 该属性的描述符是否可以被重新定义
enumerable: true, // 该属性是否允许被遍历,会影响for-in循环
writable: true // 该属性是否允许被修改
},
}
ES5提供了一系列的API,针对属性描述符进行操作
-
Object.getOwnPropertyDescriptor(obj, propertyName)
该方法用于获取一个属性的描述符
const user = { name: 'monica', age: 17 } Object.getOwnPropertyDescriptor(user, 'name'); /* { value: 'monica', configurable: true, // 该属性的描述符是否可以被重新定义 enumerable: true, // 该属性是否允许被遍历,会影响for-in循环 writable: true // 该属性是否允许被修改 } */
2.Object.defineProperty(obj, propertyName, descriptor)
该方法用于定义某个属性的描述符
const user = { name: 'monica', age: 17 }; Object.defineProperty(obj, 'name', { value: '张张', // 将其值进行修改 enumerable: false, // 让该属性不能被遍历 writable: false // 让该属性无法被重新赋值 })
getter 和 setter
属性描述符中有两个特殊的配置,分别为get
和set
,通过它们,可以把属性的取值和赋值变为方法调用
const obj = {}; Object.defineProperty(obj, 'a', { get(){ // 读取属性a时,得到的是该方法的返回值 return 1; }, set(val){ // 设置属性a时,会把值传入val,调用该方法 console.log(val) } }) console.log(obj.a); // 输出:1 obj.a = 3; // 输出:3 console.log(obj.a); // 输出:1
键值对
Object.keys(obj)
:获取对象的属性名组成的数组Object.values(obj)
:获取对象的值组成的数组Object.entries(obj)
:获取对象属性名和属性值组成的数组Object.fromEntries(entries)
:将属性名和属性值的数组转换为对象
冻结
使用Object.freeze(obj)
可以冻结一个对象,该对象的所有属性均不可更改
const obj = { a: 1, b: { c: 3, }, }; Object.freeze(obj); // 冻结对象obj obj.a = 2; // 不报错,代码无效 obj.k = 4; // 不报错,代码无效 delete obj.a; // 不报错,代码无效 obj.b = 5; // 不报错,代码无效 obj.b.c = 5; // b对象没有被冻结,有效 console.log(obj); // {a:1, b:{ c: 5 } }
可以使用
Object.isFrozen
来判断一个对象是否被冻结
相同性判定Object.is
方法,可以判断两个值是否相同,它和===
的功能基本一致,区别在于:
- NaN和NaN相等
-- +0和-0不相等
Object.is(1, 2); // false Object.is("1", 1); // false Object.is(NaN, NaN); // true Object.is(+0, -0); // false
Set
es6新增 用于保存唯一值的序列