ES6学习笔记(对象)

1.属性的简洁表示法javascript

const foo = 'bar';
const baz = {foo};
baz // {foo: "bar"}  // 等同于 const baz = {foo: foo};

ES6 容许在对象之中,直接写变量。这时,属性名为变量名, 属性值为变量的值。java

let birth ='2000/01/01';
const Person={
 name:'张三',
 //等同于birth: birth 
 birth,
 // 等同于hello: function ()... 
 hello(){ console.log('个人名字是', this.name); }
};

 

2.属性名的表达式数组

let propKey = 'foo';
let obj = {
[propKey]: true,
['a' + 'bc']: 123
};
let lastWord = 'last word';
const a = {
'first word': 'hello',
[lastWord]: 'world'
};
a['first word'] // "hello" a[lastWord] // "world" a['last word'] // "world"

ES6 容许字面量定义对象时,用(表达式)做为对象的属性名,即把表达式放在方括号内。
app

注意,属性名表达式若是是一个对象,默认状况下会自动将对象转为字符串 [object Object] ,这一点要特别当心。
const keyA = {a: 1};
const keyB = {b: 2};
const myObject = {
[keyA]: 'valueA',
[keyB]: 'valueB'
};
myObject // Object {[object Object]: "valueB"}

 

 3.属性的遍历ide

ES6 一共有 5 种方法能够遍历对象的属性。函数

(1)for...inthis

for...in循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。spa

(2)Object.keys(obj)rest

Object.keys返回一个数组,包括对象自身的(不含继承的)全部可枚举属性(不含 Symbol 属性)的键名。code

(3)Object.getOwnPropertyNames(obj)

Object.getOwnPropertyNames返回一个数组,包含对象自身的全部属性(不含 Symbol 属性,可是包括不可枚举属性)的键名。

(4)Object.getOwnPropertySymbols(obj)

Object.getOwnPropertySymbols返回一个数组,包含对象自身的全部 Symbol 属性的键名。

(5)Reflect.ownKeys(obj)

Reflect.ownKeys返回一个数组,包含对象自身的全部键名,无论键名是 Symbol 或字符串,也无论是否可枚举。

以上的 5 种方法遍历对象的键名,都遵照一样的属性遍历的次序规则。

  • 首先遍历全部数值键,按照数值升序排列。
  • 其次遍历全部字符串键,按照加入时间升序排列。
  • 最后遍历全部 Symbol 键,按照加入时间升序排列。
Reflect.ownKeys({ [Symbol()]:0, b:0, 10:0, 2:0, a:0 }) // ['2', '10', 'b', 'a', Symbol()] 

 

上面代码中,Reflect.ownKeys方法返回一个数组,包含了参数对象的全部属性。这个数组的属性次序是这样的,首先是数值属性210,其次是字符串属性ba,最后是 Symbol 属性。


4.对象的扩展运算符

 (1)解构赋值

let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
x // 1 y // 2 z // { a: 3, b: 4 }

上面代码中,变量z是解构赋值所在的对象。它获取等号右边的全部还没有读取的键(ab),将它们连同值一块儿拷贝过来。

因为解构赋值要求等号右边是一个对象,因此若是等号右边是 undefined null ,就会报错,由于它们没法转为对象。
let { ...z } = null; // 运行时错误 let { ...z } = undefined; // 运行时错误
解构赋值必须是最后一个参数,不然会报错。
let { ...x, y, z } = someObject; // 句法错误 let { x, ...y, ...z } = someObject; // 句法错误

 解构赋值的一个用处,是扩展某个函数的参数,引入其余操做。

function baseFunction({ a, b }) {
 // ... }
function wrapperFunction({ x, y, ...restConfig }) {
 // 使用 x 和 y 参数进行操做   // 其他参数传给原始函数  return baseFunction(restConfig);
}

 (2)扩展运算符

let z = { a: 3, b: 4 };
let n = { ...z };
n // { a: 3, b: 4 }

 因为数组是特殊的对象,因此对象的扩展运算符也能够用于数组。

let foo = { ...['a', 'b', 'c'] };
foo // {0: "a", 1: "b", 2: "c"}

 扩展运算符能够用于合并两个对象。

let ab = { ...a, ...b }; // 等同于 let ab = Object.assign({}, a, b);

 这用来修改现有对象部分的属性就很方便了。

let newVersion = {
...previousVersion,
name: 'New Name' // Override the name property };

上面代码中,newVersion对象自定义了name属性,其余属性所有复制自previousVersion对象。

 与数组的扩展运算符同样,对象的扩展运算符后面能够跟表达式。

const obj = {
...(x > 1 ? {a: 1} : {}),
b: 2,
};
相关文章
相关标签/搜索