在JavaScript中,如果给定 x!=x,'x'的类型是什么?

4
我被问到一个 JavaScript 面试问题:
如果 x!=xTRUEx 可能的类型是什么?
面试官告诉我,只有一种可能的数据类型会得出这个结果。

5
Object.defineProperty(window, 'x', {get: function () {return Math.random();}}) - Paul S.
下一个面试问题:对以下代码进行代码审查 https://www.destroyallsoftware.com/talks/wat - Lix
1
@Cerbrus 正如问题所提到的“类型”,让我们再补充几个,_字符串_,Object.defineProperty(window, 'x', {get: function () {return String.fromCharCode(Math.random() * 0xFFFF | 0);}}),_布尔值_,Object.defineProperty(window, 'x', {get: function () {return !(Math.random() * 2 | 0);}}),_函数_,Object.defineProperty(window, 'x', {get: function () {return function () {};}}) - Paul S.
2个回答

14

该值为NaN,类型为数字(Number)。

从比较相等性的规范中:

如果x为NaN,则返回false。

NaN永远不等于任何东西,包括它自身。


11

如果x!=xtruex可能是什么类型?

假设x是一个变量,则此问题的答案是:

"number"

唯一符合此要求的NaN,它永远不等于自己。

正如你所看到的,NaN类型"number"
typeof NaN === "number"


如果x仅仅是代表任何事情,函数和对象或数组文本也可以使用:

(function(){}) != (function(){})
({}) != ({})
[] != []

如果x可以是一个getter,则有各种疯狂的选项:

If x可以是一个getter,那么就有各种疯狂的选项:
// Type == "string"
Object.defineProperty(window, 'x', {
    get: function() { return String.fromCharCode(Math.random() * 0xFFFF | 0); }
});

// Type == "boolean"
Object.defineProperty(window, 'x', {
    get: function() { return !(Math.random() * 2 | 0); }
});

// Type == "function"
Object.defineProperty(window, 'x', {
    get: function() { return function() {}; }
});

// Type == "object"
Object.defineProperty(window, 'x', {
    get: function() { return ({}); }
});

// Type == "object"
Object.defineProperty(window, 'x', {
    get: function() { return []; }
});

使用 with

var o = {};
Object.defineProperty(o, 'x', {
  get: function() { return []; } // any of the above types
});

with(o){
  alert(x != x);
}

(感谢@Paul S.


请随意在此答案中包含我的评论中的代码。您还可以提到with语句。 - Paul S.
with语句? - Cerbrus
如果你有 var o = {},然后在 o 上用 defineProperty 定义了 _x_,再在 with (o) {x != x;} 中使用,那么你就不再需要全局对象。 - Paul S.
@PaulS.:不错!已添加:D - Cerbrus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接