Array的Polyfill。包括检查NaN

时间:2019-05-10 10:21:04

标签: javascript arrays nan polyfills

所以首先,这不是我要面对的问题。当我遇到Javascript的数组原型方法时,我正在浏览一些.indexOf and .includes博客。因此,如果数组具有NaN作为值,那么indexOf可能无法弄清楚它,我只能使用.includes。但是我的问题是,由于includes的浏览器兼容性实际上不包括IE,因此检测NaN检查的替代方法应该是什么?我想到了通过引用this

来构造一个polyfill

if (Array.prototype.includes) {
  Object.defineProperty(Array.prototype, "includes", {
    enumerable: false,
    value: function(obj) {
        var newArr = this.filter(function(el) {
          return el == obj;
        });
        return newArr.length > 0;
      }
  });
}

var arr = [NaN];
console.log(arr.includes(NaN));

但不幸的是,它也返回false。那我还有其他选择吗?还是我错过了什么?

3 个答案:

答案 0 :(得分:1)

您也可以为Number.isNaN添加一个polyfill,然后在filter测试中使用它-如果objel都通过了Number.isNaN ,然后返回true:

Number.isNaN = Number.isNaN || function(value) {     
    return value !== value;
}

// if (!Array.prototype.includes) {
  Object.defineProperty(Array.prototype, "includes", {
    enumerable: false,
    value: function(obj) {
        var newArr = this.filter(function(el) {
          return el == obj || Number.isNaN(el) && Number.isNaN(obj);
        });
        return newArr.length > 0;
      }
  });
// }

var arr = [NaN];
console.log(arr.includes(NaN));

答案 1 :(得分:1)

Array#includes使用Same-Value-Zero算法,该算法与==相同。

Object.is()提供了相同的值,您可以手动检查-0+0来获得检查的“-零”部分。

链接的页面包含一个polyfill,尽管由于polyfill包含使-0+0不同的步骤-在Same-Value-Zero算法中您不希望这样做-您可以省略并进行相应的简化:

function SameValueZero(x, y) {
    return x === y || (x !== x && y !== y);
}

答案 2 :(得分:0)

您可以使用NaN找到firstIndex的索引。尝试这样。

var arr = [NaN];
let index = arr.findIndex(Number.isNaN)
console.log(index >= 0);