展开运算符
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 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 // 该属性是否允许被修改
}
*/
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", 1); // false
Object.is(NaN, NaN); // true
Object.is(+0, -0); // false
Set
es6新增 用于保存唯一值的序列