前端Object 用法总结
Object是Javascript的重要数据结构,ES6中有进行扩展。
对象(Object)扩展
属性的简介表示法: 即属性名就是变量名,属性值就是变量值
const foo = 'bar';
const baz = {foo};
baz // {foo: "bar"}
// 等同于
const baz = {foo: foo};
属性名表达式: 定义对象属性的两种方法
obj.foo = true;—— 使用标识符作为属性名obj['a' + 'bc'] = 123;—— 使用表达式作为属性名,将表达式放在方括号内时,如下:
let obj = {
[propKey]: true,
['a' + 'bc']: 123
}
定义方法时也是如此
方法的name属性: 函数的name属性,返回函数名。方法也是函数,因此有name属性。
属性的可枚举性和遍历
对象的每一个属性都有一个描述属性(Descriptor),用来控制属性的行为。Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象。
let obj = { foo: 123 };
Object.getOwnPropertyDescriptor(obj, 'foo')
// {
// value: 123,
// writable: true,
// enumerable: true,
// configurable: true
// }
描述对象的enumerable属性,称为可枚举性,如果为false,表示某些操作忽略当前属性。
目前,有四个操作会忽略enumerable为false的属性
for...in循环:只遍历对象自身的和继承的可枚举属性Object.keys():返回对象自身的所有可枚举属性的键名JSON.stringIfy():只串行化对象自身的可枚举属性Object.assign():忽略enumerable为false的属性,只拷贝对象自身的可枚举属性
实际操作中尽量不要用for...in循环,而用Object.keys()代替。
属性的遍历
5中遍历对象属性的方法
- for...in:
for...in循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性) - Object.keys(obj):
Object.keys返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。 —— 推荐使用
-
Object.getOwnPropertyNames(obj):
Object.getOwnPropertyNames返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名。 -
Object.getOwnPropertySymbols(obj):
Object.getOwnPropertySymbols返回一个数组,包含对象自身的所有 Symbol 属性的键名 —— 不常用 -
Reflect.ownKeys(obj):
Reflect.ownKeys返回一个数组,包含对象自身的(不含继承的)所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。 —— 不常用
- Object.setPrototypeOf(obj1,obj2):为对象设置原型链 将obj2设置为obj1的原型链。