我编写了一个需要在ie8中工作的js lib,并且我被要求不使用jQuery作为实现的一部分。部分js lib需要在数组中搜索匹配值。现代浏览器支持数组indexOf()函数,它将完成此任务。但是,由于我的js lib需要支持ie8,我将无法使用此功能。最初我写了以下自定义函数:
function inArray(anArray, aValue)
{
for (var i = 0; i < anArray.length; i++)
if (anArray[i] === aValue) return true;
//value was not in array
return false;
}
然而,今天早上我发现使用原型继承写这个更好。使用原型继承重写它的好方法是什么?另外,有没有办法可以进入用于ES标准的直接源代码,复制indexOf()函数并将其粘贴到我的自定义js lib中?不确定这是否可行,但它似乎是一种在不重新发明轮子的情况下移植片段的好方法。
答案 0 :(得分:1)
作为一般规则,拥有自己的命名空间并使用类似于您所描述的功能对于库来说可能更好,如下所示:
MyLib.inArray = function(array, value) {
// implementation here
};
您可以使用ES6函数Array
修改.includes()
的原型,如下所示:
Array.prototype.includes = Array.prototype.includes || function(needle) {
// implementation here
};
然后你可以像这样使用它:
[1, 2, 3].includes(3); // true
(请注意,如果它已经存在,我们不会覆盖它)
但是,这通常是在库中执行的不好做法,因为您正在修改对页面上其他脚本可能依赖的内置函数的引用!此外,在使用for..in
迭代数组时,以这种方式添加的属性将会显示,这是非常不受欢迎的。
答案 1 :(得分:1)
您可能最好使用传递数组的实用程序功能,例如问题中的inArray
。
你可以为Array#indexOf
或includes
添加垫片或类似于Array.prototype
,但如果你这样做,它将变为可枚举并显示在{ {1}}循环。人们不应该使用for-in
来遍历数组,但遗憾的是,他们有时会这样做。如果他们在您的代码库或您的代码库包含的任何库中执行,那将是一个问题。
不幸的是,你不能使它不可枚举,因为IE8不支持for-in
(奇怪的是HTML元素除外)。