在我的javascript代码中,我经常需要检查某个可枚举列表中的表达式是否为:
if ((a == 'value1') || (a == 'value2') || (a == 'value3')) { ... do smth ... }
我可以这样写:
if (['value1', 'value2', 'value3', 'value4'].indexOf ( a ) ) { ... do smth ... }
但我认为这是不可读的。
我为 Object.prototype 添加属性 in_arr :
Object.defineProperty(Object.prototype, 'in_arr', {
value : function(arr) {
for (var i=0; i<arr.length; i++) {
if ( arr[i] == this.valueOf() ) {
return true;
}
}
return false;
},
enumerable: false
})
现在我可以这样写:
if (a.in_arr([ 'value1', 'value2', 'value3', 'value4' ]) { ... do smth ... }
我认为,它看起来不错。但我想问一下:像这样更改 Object.prototype 是否安全?性能怎么样?
答案 0 :(得分:3)
创建一个枚举哈希,如下所示:
var enumHash = {
value1: true,
value2: true,
value3: true
// actually it doesn't matter which value to assign:
// even undefined will do, as you check the existence of a property, not its value
};
...然后只检查属性的存在:
if (someValue in enumHash) { ... }
这将比Array.indexOf
更快,更具可读性。
答案 1 :(得分:0)
更改系统对象(如Array,Object等)的错误方法。如果有人进行此类更改,可能会发生冲突
答案 2 :(得分:0)
不建议扩展Object.prototype,这会导致奇怪的行为,如果像一个简单的函数那样危险性较低,就没有必要采取一种方式。
in_array(obj, [ 'a', 'b', 'c' ]);
您甚至可以创建一个utils对象
utils.in_array(obj, [ 'a', 'b', 'c' ]);
有一次我说过......
这与Extending Object.prototype JavaScript非常相似,我完全赞同Alex Wayne:
我认为如果它适用于你的目标环境就好了。
此外,我认为原型扩展偏执狂被夸大了。只要你像一个好的开发人员一样使用hasOwnProperty()就可以了。最糟糕的情况是,您在其他地方重载该属性并丢失该方法。但如果你这样做,那就是你自己的错。
答案 3 :(得分:-2)
您可以使用Array.prototype.indexOf(el)
[ 'value1', 'value2', 'value3', 'value4' ].indexOf(a.valueOf()) !== -1