Polyfill для Array. Включает проверку NaN - PullRequest
1 голос
/ 10 мая 2019

Итак, во-первых, это не проблема, с которой я сталкиваюсь.Я просматривал некоторые блоги Javascript, когда столкнулся с методами-прототипами Array .indexOf and .includes.Так что, если массив имеет NaN в качестве значения, то, вероятно, indexOf не сможет это выяснить, и у меня останется использование .includes.Но мой вопрос здесь заключается в том, что, поскольку совместимость браузера includes фактически исключает IE, какой должна быть альтернатива для обнаружения проверки NaN?Я думал о создании полифилла, ссылаясь на this

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 ]

1 голос
/ 10 мая 2019

Array#includes использует алгоритм Same-Value-Zero, который не совпадает с ==.

Same-Value предоставляется Object.is(), и вы можете вручную проверить для -0 и +0, чтобы получить часть проверки "-Zero".

Связанная страница включает в себя полифилл, хотя так как полифилл включает в себя шаг, чтобы сделать-0 и +0 разные - что вам не нужно в алгоритме Same-Value-Zero - вы можете просто пропустить это и упростить соответственно:

function SameValueZero(x, y) {
    return x === y || (x !== x && y !== y);
}
1 голос
/ 10 мая 2019

Вы также можете включить полифил для Number.isNaN, а затем использовать его в своем filter тесте - если оба параметра obj и el проходят 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));
0 голосов
/ 10 мая 2019

Вы можете найти индекс NaN, используя firstIndex.попробуй вот так.

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