ES语言--two

21 阅读2分钟

​展开运算符

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,针对属性描述符进行操作

  1. Object.getOwnPropertyDescriptor(obj, propertyName)

    该方法用于获取一个属性的描述符

const user = {
  name: 'monica',
  age: 17
}

Object.getOwnPropertyDescriptor(user, 'name');
/*
{
    value: 'monica',
    configurable: true, // 该属性的描述符是否可以被重新定义
    enumerable: true, // 该属性是否允许被遍历,会影响for-in循环
    writable: true // 该属性是否允许被修改
}
*/
  1. Object.defineProperty(obj, propertyName, descriptor)

该方法用于定义某个属性的描述符

const user = {
  name: 'monica',
  age: 17
};

Object.defineProperty(obj, 'name', {
  value: '张张', // 将其值进行修改
  enumerable: false, // 让该属性不能被遍历
  writable: false // 让该属性无法被重新赋值
})

getter 和 setter

属性描述符中有两个特殊的配置,分别为getset,通过它们,可以把属性的取值和赋值变为方法调用

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新增 用于保存唯一值的序列