我只是创建了一个功能JSON.stringify
输入,但也检测到NaN
数字输入,但由于原因不想使用typeof
如下所述。输入可以是number
,boolean
或string
。没什么。
我已达到NaN !== NaN
的情况,所以:
if (input !== input || input === Infinity || input === -Infinity) {
output = input.toString();
} else {
output = JSON.stringify(input);
}
我这样做是因为JSON.stringify()
在值"null"
或NaN
时返回Infinity
。
我知道使用typeof
和toString()
这很容易实现,但是一些性能测试表明IE11下的typeof
非常慢(比{{慢4-5倍]在我们的情况下,我们需要关注IE11。
我想知道是否有更多案例JSON.stringify()
。
您在这里进行了性能测试:https://jsperf.com/typeof-vs-nan-nan2 没有使用SO,因为似乎他们运行代码服务器端,因为IE性能与其他地方一样好。 Impossibru的事。
本地测试是:
val !== val
Chrome输出为:
但是IE11的输出是:
我注意到字符串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)。
答案 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?