学习ES6:对象扩展

es6 对象扩展

对象属性简洁表示

即只写属性名,属性值为属性名所代的变量。
属性和方法都可以。
某个方法若是generator,在简洁描述前加*
用于简写函数的返回值和模块输出变量。

1
2
3
4
function getPoint() {
let x = 1, y = 2;
return {x, y};
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
let o = {};

function setItem(key, value) {
o[key] = value;
}

function getItem(key) {
return o[key];
}

function clear() {
o = {};
}

module.exports = {
getItem,
setItem,
clear,
}

属性名表达式

把表达式放在中括号内,表达式的结果作为属性名。

属性名表达式与属性简介表示法不能同时使用,不过用作对象方法的时候,可以同时使用

方法的name属性

方法的name属性返回函数名

  • 取值函数,返回get 方法名
  • 存值函数,返回set 方法名
  • bind方法创造的函数,返回bound 方法名
  • Function构造函数创造的函数,返回anoymous 方法名
  • 对象的方法是一个Symbol值,返回`Symbol值的描述。

Object.is()

方法用来比较两个值是否时严格相等的,与严格比较运算符(===)基本一致。

不同之处:

  1. +0不等于-0
  2. NaN等于NaN
1
2
3
4
5
console.log(Object.is(+0, -0)); //false
console.log(+0 === -0); //true

console.log(Object.is(NaN, NaN)); //true
console.log(NaN === NaN); //false

Object.assign()

  • 用于将source对象所有的可枚举属性复制到target对象。
  • 不可枚举的及继承的属性不会被复制。
  • 相同属性名的属性,后面的属性值会覆盖前面的属性值。
  • 该方法只能复制浅对象,对于嵌套的属性,该方法时直接替换目标对象中的相同属性名的属性。
  • 该方法也可以用于数组,不过会将数组视为对象处理。
1
2
3
4
5
6
7
let target = {a:1,b:2};

let source1 = {b:3,c:4};
let source2 = {c:5,d:6};

Object.assign(target, source1, source2);
console.log(target); //{ a: 1, b: 3, c: 5, d: 6 }
1
2
3
4
5
6
7

let targetArr = [1, 2, 3];
let sourceArr = [4, 5];

Object.assign(targetArr, sourceArr);

console.log(targetArr); //[ 4, 5, 3 ]

应用

  • 为对象添加属性方法
  • 克隆对象(仅克隆原始对象自身可枚举的属性,忽略继承属性)
  • 合并多个对象
  • 为属性设置默认值,并接受自定义赋值

属性的可枚举性及遍历

对象的每一个属性都有一个描述对象,用于控制该属性的行为。
其中有一个属性为enumerable,描述了该属性是否可枚举。
ES6规定,所有Class的原型的方法都是不可枚举的。

相关的遍历方法

方法 返回值或操作
for…in… 循环遍历对象自身的和继承的可枚举属性(不含Symbol)
Object.keys(obj) 返回一个数组,包括对象自身(不含继承)的可枚举属性(不含Symbol)
Object.getOwnPropertyNames(obj) 返回数组,包含对象自身的所有属性(不含Symbol,但包括不可枚举属性)
Object.getOwnPropertySymbols(pbj) 返回数组,包含对象自身的所有Symbol属性
reflect.ownKeys(obj) 返回数组,包含对象自身的 所有 属性
reflect.enumerate(obj) 返回Iterator对象,遍历对象自身的和继承的所有可枚举属性(不含Symbol)

所有方法遍历的属性都遵守以下的次序规则:

  • 首先遍历所有属性名为数字的属性,按数字升序排序。
  • 其次遍历所有属性名为字符串的属性,按生成时间升序排序。
  • 最后遍历所有属性名为Symbol值的属性,按生成时间升序排序。