在哪些情况下val!== val?

时间:2017-02-20 13:11:33

标签: javascript types nan

我只是创建了一个功能JSON.stringify输入,但也检测到NaN数字输入,但由于原因不想使用typeof如下所述。输入可以是numberbooleanstring。没什么。

我已达到NaN !== NaN的情况,所以:

if (input !== input || input === Infinity || input === -Infinity) {
    output = input.toString();
} else {
    output = JSON.stringify(input);
}

我这样做是因为JSON.stringify()在值"null"NaN时返回Infinity

我知道使用typeoftoString()这很容易实现,但是一些性能测试表明IE11下的typeof非常慢(比{{慢4-5倍]在我们的情况下,我们需要关注IE11。

我想知道是否有更多案例JSON.stringify()

您在这里进行了性能测试:https://jsperf.com/typeof-vs-nan-nan2 没有使用SO,因为似乎他们运行代码服务器端,因为IE性能与其他地方一样好。 Impossibru的事。

本地测试是:

val !== val

Chrome输出为:

enter image description here

但是IE11的输出是:

enter image description here

我注意到字符串var mockdata = []; function notToJson(val) { return val !== val || val === Infinity || val === -Infinity; } for (var i = 0; i < 500000; i++) { var n = Math.floor(Math.random()*1000000); if (Math.random()>0.5) { n = n.toString(); } else if (Math.random()>0.5) { if (Math.random()>0.5) { n = NaN; } else { if (Math.random()>0.5) { n = Infinity; } else { n = -Infinity; } } } mockdata.push(n); } console.time("typeof"); for (i = 0; i < 500000; i++) { var res = typeof mockdata[i] === "string"; } console.timeEnd("typeof"); console.time("notToJson"); for (i = 0; i < 500000; i++) { res = notToJson(mockdata[i]); } console.timeEnd("notToJson"); console.time("toString"); for (i = 0; i < 500000; i++) { res = mockdata[i].toString(); } console.timeEnd("toString"); console.time("JSON.stringify"); for (i = 0; i < 500000; i++) { res = JSON.stringify(mockdata[i]); } console.timeEnd("JSON.stringify"); console.time("Full typeof"); for (i = 0; i < 500000; i++) { res = typeof mockdata[i]==="string"?JSON.stringify(mockdata[i]):mockdata[i].toString(); } console.timeEnd("Full typeof"); console.time("Full notToJson"); for (i = 0; i < 500000; i++) { res = notToJson(mockdata[i])?mockdata[i].toString():JSON.stringify(mockdata[i]); } console.timeEnd("Full notToJson"); 越少,mockdata的效果就会明显增加(谈论IE11)。

2 个答案:

答案 0 :(得分:2)

以下是val !== val返回true的一些情况:

console.log({} !== {}); // true
console.log(new Date() !== new Date()); // true
console.log(new String("") !== new String("")); // true

仅在对象不同时适用:

var a = b = {}; // now they are equal
console.log(a !== b); // false

Symbols(ES6功能)也会发生这种情况:

console.log(Symbol() !== Symbol()); // true

答案 1 :(得分:1)

我将自己回答这个问题,因为我不希望有未解决的问题。

请注意问题是如何谈论val的。我的意思是为变量赋值,然后将变量与自身进行比较不创建两个不同的变量并进行比较。

从我自己的测试来看,val !== val仅在val = NaN时如此,

var val = NaN;
console.log("val !== val:", val !== val);

原因就在这里:Why is NaN not equal to NaN?