所以首先,这不是我要面对的问题。当我遇到Javascript
的数组原型方法时,我正在浏览一些.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。那我还有其他选择吗?还是我错过了什么?
答案 0 :(得分:1)
您也可以为Number.isNaN
添加一个polyfill,然后在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));
答案 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);