0

在我的 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是否安全?而性能呢?

4

4 回答 4

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且更具可读性。

于 2013-10-30T14:51:03.007 回答
0

更改系统对象(如 Array、Object 等)的错误方法。因为如果有人进行此类更改,可能会发生冲突

于 2013-10-30T14:52:57.287 回答
0

不建议扩展 Object.prototype,这会导致奇怪的行为,如果有像简单函数这样危险性较小的方法,则无需这样做。

in_array(obj, [ 'a', 'b', 'c' ]);

你甚至可以创建一个 utils 对象

utils.in_array(obj, [ 'a', 'b', 'c' ]);

一旦我说...

这看起来与扩展 Object.prototype JavaScript非常相似,我完全同意 Alex Wayne:

我认为如果它在您的目标环境中工作就可以了。

此外,我认为原型扩展偏执狂被夸大了。只要您像优秀的开发人员一样使用 hasOwnProperty() 就可以了。最坏的情况是,您在其他地方重载该属性并丢失该方法。但如果你这样做,那是你自己的错。

于 2013-10-30T22:25:31.567 回答
-2

你可以使用Array.prototype.indexOf(el)

[ 'value1', 'value2', 'value3', 'value4' ].indexOf(a.valueOf()) !== -1
于 2013-10-30T14:47:11.380 回答