2

对于像 Array 这样的 JS 核心对象,我有一些小而有用的额外方法:

Array.prototype.indexOfObject(属性,值)

此方法返回(对象)数组中对象的索引,其中属性==值,对我来说简单而高效。

但是,当我枚举任何数组时,该方法会出现,所以每次我必须这样做:

for(var i in MyArray){
  if(typeof(MyArray[i])=="typeneeded"){
    // do something
  }
}

据我所知,defineProperty 制作了一个不可枚举的方法,因此当所有浏览器都接受它时,它将解决我的问题。顺便说一句,使用defineProperty已经安全了吗?IE9 好用吗?其它浏览器?有第三种方法吗?

4

3 回答 3

3

周围有一些 ECMAScript 兼容性矩阵:kangax仅适用于 ES5,Thomas Lahn会告诉您在各种 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不一定以任何特定顺序返回属性,并且可以显示为在不同浏览器中以不同顺序返回它们。因此,仅将其与访问成员的顺序不重要的 Array 一起使用。

PS。您也可以使用propertyIsEnumerable,因为它只为对象本身的属性返回 true:

if (obj.propertyIsEnumerable(p)) {

这用于解决早期 Safari 中的错误,但该版本不应再使用。

顺便说一句,在:

> typeof(MyArray[i])

不需要括号,typeof是一个运算符。此外,检查属性的类型并不能告诉您它是否是对象自己的属性,或者即使它存在(尽管在这种情况下它确实存在,因为它来自for..in)。

于 2013-10-08T02:02:30.593 回答
1

您可以对所有浏览器安全地使用 hasOwnproperty ,但您的问题是关于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
于 2013-10-08T06:13:32.630 回答
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));

小提琴

于 2013-10-16T17:54:44.073 回答