Open bibi7 opened 5 years ago
对一些原型链和遍历的原生api不是很熟,稍微记录下。
Object.keys
: 返回一个由一个给定对象的自身 可枚举 属性组成的数组,不会追溯到原型链上面的属性。返回的是键名或下标。
const foo = {a: 1}
const bar = Object.create(foo)
bar.b = 2
const baz = Object.create(bar)
baz.c = 3
Object.keys(baz) //['c']
Reflect.ownKeys
: 静态方法 Reflect.ownKeys() 返回一个由目标对象自身的属性键组成的数组,与Object.keys
不同的是,返回的包括自身对象 不可枚举 的属性。相当于getOwnPropertyNames()
与Object.getOwnPropertySymbols()
的结合。
Object.defineProperty(baz, 'd', {
enumerable: false,
value: 'd'
})
Object.keys(baz)
//["c"]
Reflect.ownKeys(baz)
//(2) ["c", "d"]
Reflect.ownKeys({z: 3, y: 2, x: 1}); // [ "z", "y", "x" ]
Reflect.ownKeys([]); // ["length"]
该方法同样会返回Symbol
类属性键:
var sym = Symbol.for("comet");
var sym2 = Symbol.for("meteor");
var obj = {[sym]: 0, "str": 0, "773": 0, "0": 0,
[sym2]: 0, "-1": 0, "8": 0, "second str": 0};
Reflect.ownKeys(obj);
// [ "0", "8", "773", "str", "-1", "second str", Symbol(comet), Symbol(meteor) ]
Object.getOwnPropertyNames
: 返回一个由指定对象的所有自身属性的属性名(包括 不可枚举 属性但不包括Symbol值作为名称的属性)组成的数组。
var arr = ["a", "b", "c"];
console.log(Object.getOwnPropertyNames(arr).sort()); // ["0", "1", "2", "length"]
Object.getOwnPropertyNames(baz)
//["c", "d"]
prototypeObj.isPrototypeOf(object)
: 返回布尔值,表示调用对象是否在另一个对象的原型链上。
bar.isPrototypeOf(baz)
//true
Object.getPrototypeOf(object)
: 返回指定对象的原型
Object.getPrototypeOf(baz) === bar
//true
包括不可枚举属性:
不包括不可枚举属性:
不包括原型链:
包括原型链:
日常开发遇到了太多遍历相关的场景,稍微写一点东西。
for in
for in可以遍历对象/数组,遍历的i为键/下标:
for in 循环只遍历可枚举属性,甚至会包括原型链上的属性。举例如下:
for in自身存在着一定的特性,比如遍历中并不一定能按照顺序遍历,所以并不是很适合用于遍历数组,一般都是结合hasOwnProperty遍历对象。可以瞅瞅mdn上的说法:
for of
for of是es6新增的遍历方法,适用遍历数/数组对象/字符串/map/set等拥有迭代器对象的集合。与forEach()不同的是,它可以正确响应break、continue和return语句。另外,由于迭代器语法的原因,for of的遍历是按照顺序遍历的。
for of不能直接用于遍历对象,除非对象自身实现迭代器属性,也就是我们要显示的指定迭代。具体语法可见MDN
周末时光不打算做api卡卡西了,迭代器和生成器相关,直接传送门