Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止JavaScript中的多边形填充枚举?_Javascript_Arrays_Enumerable_For In Loop - Fatal编程技术网

如何防止JavaScript中的多边形填充枚举?

如何防止JavaScript中的多边形填充枚举?,javascript,arrays,enumerable,for-in-loop,Javascript,Arrays,Enumerable,For In Loop,我一直在向我们项目的主JavaScript文件添加一个Array.indexOf()polyfill。我从devdocs.io上取的: if (!Array.prototype.indexOf) { Array.prototype.indexOf = function (searchElement , fromIndex) { var i, pivot = (fromIndex) ? fromIndex : 0, length; if (!t

我一直在向我们项目的主JavaScript文件添加一个Array.indexOf()polyfill。我从devdocs.io上取的:

if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function (searchElement , fromIndex) {
    var i,
        pivot = (fromIndex) ? fromIndex : 0,
        length;

    if (!this) {
      throw new TypeError();
    } 

    length = this.length;

    if (length === 0 || pivot >= length) {
      return -1;
    }

    if (pivot < 0) {
      pivot = length - Math.abs(pivot);
    }

    for (i = pivot; i < length; i++) {
      if (this[i] === searchElement) {
        return i;
      }
    }
    return -1;
  };
}
是否可以将polyfill设置为“不可数”,这样我就可以在IE 8中使用Array.indexOf(),但它不会出现在for..in循环中?

枚举对象的成员时应该使用它

var a = [];
a[0] = 123;
a[1] = 456;
for(var value in a){
    if(a.hasOwnProperty(value)){
        alert(value);
    }
}
但是,为什么不为循环(或类似的多边形填充)执行一个简单的

枚举对象的成员时应该使用

var a = [];
a[0] = 123;
a[1] = 456;
for(var value in a){
    if(a.hasOwnProperty(value)){
        alert(value);
    }
}

但是为什么不为
循环(或类似的多边形填充)执行一个简单的

一般来说,您可以使用以下方法将属性添加为不可枚举的:

但是,正如您可能已经猜到的,IE8中不支持它,因此您只能使用@tkone的解决方案,即使用
hasOwnProperty
中为..过滤


另一个伪解决方案是创建一个传递数组参数的函数:

function indexOf(array, searchElement, fromIndex) {
  if (Array.prototype.indexOf) return array.indexOf(searchElement, fromIndex);
  /* my polyfill code with array instead of this*/
}
只需使用它而不是本机indexOf:

[1,2,3].indexOf(2); // change to:
indexOf([1,2,3], 2);
您也可以为函数命名名称空间,以便在不再使用IE8时记住将其更改回标准:

IhateIE8.indexOf = ...

一般来说,可以使用以下方法将属性添加为不可枚举:

但是,正如您可能已经猜到的,IE8中不支持它,因此您只能使用@tkone的解决方案,即使用
hasOwnProperty
中为..过滤


另一个伪解决方案是创建一个传递数组参数的函数:

function indexOf(array, searchElement, fromIndex) {
  if (Array.prototype.indexOf) return array.indexOf(searchElement, fromIndex);
  /* my polyfill code with array instead of this*/
}
只需使用它而不是本机indexOf:

[1,2,3].indexOf(2); // change to:
indexOf([1,2,3], 2);
您也可以为函数命名名称空间,以便在不再使用IE8时记住将其更改回标准:

IhateIE8.indexOf = ...
是否可以将polyfill设置为“不可数”,以便我能够在IE 8中使用Array.indexOf(),但它不会出现在for..in循环中

正式来说,是的(请参见和
可枚举的
),但特别适用于IE8和更低版本

但我认为这不是一个好主意(见评论)

是否可以将polyfill设置为“不可数”,以便我能够在IE 8中使用Array.indexOf(),但它不会出现在for..in循环中

正式来说,是的(请参见和
可枚举的
),但特别适用于IE8和更低版本



但我认为这不是一个好主意(见评论)。

我认为。。。在里面使用数组不是一个好主意:这里的解决方案是停止使用
for…in
来迭代数组。改用一个简单的
for
循环。我无法改变这样一个事实:在我们的代码中,数组上有数百个for..in循环。这将是巨大的工作,以改变他们所有。不过,polyfill在代码中出现的时间不长,删除它相对容易。。。如果没有其他方法,我将不得不这样做。@PaulMa正在将代码移出数组。prototype可接受吗?这包括以不同的方式调用它。我已经和我的同事讨论过这个问题,我们决定让polyfill保持原样,我们将在每个for-in循环中检查hasOwnProperty函数的结果。谢谢你的帮助!我认为。。。在里面使用数组不是一个好主意:这里的解决方案是停止使用
for…in
来迭代数组。改用一个简单的
for
循环。我无法改变这样一个事实:在我们的代码中,数组上有数百个for..in循环。这将是巨大的工作,以改变他们所有。不过,polyfill在代码中出现的时间不长,删除它相对容易。。。如果没有其他方法,我将不得不这样做。@PaulMa正在将代码移出数组。prototype可接受吗?这包括以不同的方式调用它。我已经和我的同事讨论过这个问题,我们决定让polyfill保持原样,我们将在每个for-in循环中检查hasOwnProperty函数的结果。谢谢你的帮助!请注意:jshint选项被称为
forin
,以防止没有此检查的For..in循环。请参阅我上面的注释。我们不能为代码中的每个for..in循环实现这一点。我要么删除polyfill,要么使其无法编号。首先,您可能需要重构代码库。在
中为…使用
进行数组枚举是一个非常糟糕的主意,因为存在可枚举问题。第二,你可以。这称为使用正则表达式进行搜索和替换。:)@PaulMa还有,如果是这样的话,你就不可能按照你的要求去做。IE8不支持可枚举标志的概念。对于记录:jshint选项被称为
forin
,以防止没有此检查的For..in循环。请参阅上面的注释。我们不能为代码中的每个for..in循环实现这一点。我要么删除polyfill,要么使其无法编号。首先,您可能需要重构代码库。在
中为…使用
进行数组枚举是一个非常糟糕的主意,因为存在可枚举问题。第二,你可以。这称为使用正则表达式进行搜索和替换。:)@PaulMa还有,如果是这样的话,你就不可能按照你的要求去做。IE8不支持可枚举标志的概念。