为什么未定义代表值未定义的全局属性?

时间:2019-02-18 10:36:27

标签: javascript

通过阅读有关undefined here的MDN网络文档,我已经阅读

The global undefined property represents the primitive value undefined.

为什么要这样做?

null仅仅是一个值,为什么他们创建了全局属性?

2 个答案:

答案 0 :(得分:2)

为什么似乎丢失了-您必须向Brendan Eich询问。

the many quirks surrounding null and undefined只是null是一个关键字(准确地说是文字表达,不能用作标识符),而undefined不是。这就是现在的样子,并且鉴于网络上的许多脚本都将undefined用作本地变量名称,因此现在做任何事情都为时已晚。 (至少ES5使全局undefined不可写。)

答案 1 :(得分:0)

他们对布尔值的转换是相同的:

!!undefined === !!null

无论它们用于不同目的,undefined本身都是原始的:

typeof undefined; //undefined
typeof null: //object

没有必要解决原型继承中的最后一条链:

var obj = new function(){return this};
Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(obj))); //constructor's prototype --> Object.prototype --> null

除了从NodeElementHTMLElement原型继承的许多函数外,还期望它们返回object,当找不到时,它们将null返回给暗示他们应该给您一个物体,但什么也没找到:

document.getElementById("thiswontbethere"); //null

相反,对于未初始化的值,通常首选Undefined:

var obj = {};
obj.someKey //undefined;
Array.apply(null,Array(3)); //[undefined, undefined, undefined]

未定义并不一定要是全局的,但是如果您这样做:

Object.getOwnPropertyDescriptor(window,"undefined");//{value: undefined, writable: false, enumerable: false, configurable: false}

因此,显然您不能更改属性描述符,也不能更改值本身,但是内存分配是在较低层完成的,因此这是供应商实现。它不必是全球性的。

  

我以某种方式感到这是一个棘手的问题,您要求它不是要回答,而是间接确认js中包含一些“不良设计”元素。