对于像JS这样的JS核心对象,我有一些小但有用的额外方法:
Array.prototype.indexOfObject(property,value)
此方法返回数组(对象)中Object的索引,其中property == value,对我来说简单而富有成效。
但是,当我枚举任何数组时,该方法会出现,所以每次我都这样做:
for(var i in MyArray){
if(typeof(MyArray[i])=="typeneeded"){
// do something
}
}
据我所知,defineProperty创建了一个不可枚举的方法,因此当所有浏览器都接受它时它将解决我的问题。顺便说一句,是否已经安全使用defineProperty? IE9运行良好?其它浏览器?还有第三种方法吗?
答案 0 :(得分:3)
有一些ECMAScript兼容性矩阵:kangax's仅适用于ES5,Thomas Lahn's将告诉您哪些版本的各种ECMAScript实现支持哪些功能。
“第三种方式”是使用 hasOwnProperty 测试,该测试适用于所有浏览器,在您无法完全控制的任何环境中都是个好主意:
for (var p in obj) {
if (obj.hasOwnProperty(p)) {
// p is an own property of obj
// do stuff with obj[p]
}
}
您也可以使用Object.keys,它只返回自己的属性,但支持可能小于 defineProperty 。
您还应该注意, for..in 不一定以任何特定顺序返回属性,并且可以显示在不同浏览器中以不同顺序返回它们。因此,只能将它与数组一起使用,其中访问成员的顺序并不重要。
PS。您也可以使用 propertyIsEnumerable ,因为它只对对象本身的属性返回true:
if (obj.propertyIsEnumerable(p)) {
这用于容纳早期Safari中的错误,但该版本不应再使用。
顺便提一下,在:
> typeof(MyArray[i])
不需要括号, typeof 是一个运算符。此外,检查属性的Type并不会告诉您它是否是对象的自有属性,或者即使它存在(尽管在这种情况下它确实存在,因为它来自 ...在)。
答案 1 :(得分:1)
您可以安全地为所有浏览器使用hasOwn属性,但您的问题是Object.defineProperty。如果您不担心旧浏览器(IE8),那么您可以使用它:
//you should reload when you want to change value
//or you'll get a can't redefine error
Object.defineProperty(Array.prototype,"someFn",{
enumerable: false,
configurable: false,
writable: false,
value: function(){console.log("my fn");}
});
var a = [1,2,3,4];
for(thing in a){
console.log(thing);//=0,1,2,3
}
a.someFn();//=my fn
答案 2 :(得分:1)
只需使用传统的for循环或forEach:
var i,
ary = ['val0', 'val1', 'val2'];
Array.prototype.getElem = function (i) {
return this[i];
};
console.log('First way - using standard for loop:');
for (i = 0; i < ary.length; i++) {
console.log('Element ' + i + ' has value ' + ary[i]);
}
console.log('second way - use "first order function" - "functional programming" style');
ary.forEach(function (e, i) {
console.log('Element ' + i + ' has value ' + ary[i]);
});
console.log('getElem says: element 2 has value ' + ary.getElem(2));