我被告知不要for...in在JavaScript中使用数组.为什么不?
我想在Array.prototype和Object.prototype上定义辅助方法.我目前的计划是做类似的事情:
Array.prototype.find = function(testFun) {
// code to find element in array
};
Run Code Online (Sandbox Code Playgroud)
所以我可以这样做:
var arr = [1, 2, 3];
var found = arr.find(function(el) { return el > 2; });
Run Code Online (Sandbox Code Playgroud)
它工作正常,但如果我在循环中循环数组,for in方法显示为值:
for (var prop in arr) { console.log(prop); }
// prints out:
// 1
// 2
// 3
// find
Run Code Online (Sandbox Code Playgroud)
这将搞砸任何依赖于for in显示值的人(尤其是对象).更高版本的javascript具有内置于数组中的.map和.filter函数,但这些函数不会出现在for in循环中.如何创建更多不会出现在for in循环中的方法?
我有一个es6类实例,我需要获取它的所有属性(以及继承的属性).有没有办法在不遍历原型链的情况下做到这一点?
class A {
get a() {
return 123;
}
}
class B extends A {
get b() {
return 456;
}
}
const b = new B();
for (let prop in b) {
console.log(prop); //nothing
}
console.log(Object.keys(b)); //empty array
console.log(Object.getOwnPropertyNames(b)); //empty array
console.log(Reflect.ownKeys(b)); //empty array
console.log(Object.keys(Object.getPrototypeOf(b))); //empty array
console.log(Object.getOwnPropertyNames(Object.getPrototypeOf(b))); //["contructor", "b"] -- without "a"
console.log(Reflect.ownKeys(Object.getPrototypeOf(b))); //["contructor", "b"] -- without "a"Run Code Online (Sandbox Code Playgroud)