由ES规范学JavaScript(一):为何undefined能够被赋值,而null不能够?

提出问题

以下代码:javascript

undefined = 123;
null = 123; // 报错:Uncaught Reference Error

第一条语句能够执行,尽管赋值并无成功;第二条语句报错。这是为何呢?undefinednull有什么区别?java

解决问题

读过ES规范后,发现原来是这样的:git

  • undefinedNaNInfinity都是全局对象window的属性。既然是属性,固然能够赋值。然而这三个属性又是不可写的属性,即它们的的内部特性[[writable]]false,因此赋值无效。github

  • null是一个字面量(literal),准确地说叫作Null字面量。与truefalse相似。它们都属于JavaScript的保留字。换句话说它们都是,与数字值12三、字符串值"foobar"同样,固然不能被赋值了。函数

再多说些

  1. 既然undefined只是一个属性,并非语言的保留字,那么它是否能够用来做为变量的名字?固然能够,你彻底能够自定义一个叫作undefined的变量或者函数,可是注意不要把它放到全局做用域。例如:es5

    function foo() {
         var undefined = 10;
         console.log(undefined);
    }
    foo(); // 打印10
  2. 经过ES5新增的方法Object.getOwnPropertyDescriptor方法,能够证实undefinedwindow对象的只读属性:code

    Object.getOwnPropertyDescriptor(window, 'undefined');
    
    /** 输出:Object {value: undefined, writable: false,
    enumerable: false, configurable: false} **/
  3. 在严格模式下,给undefined赋值会报错。由于严格模式下,禁止给对象的只读属性赋值。对象

  4. null虽然号称是Null这种原始类型能够取的惟一值,然而:ip

    typeof null; // 输出"object"

参考文档

  1. 15.1.1.3 undefined作用域

  2. 7.6.1 Reserved Words

相关文章
相关标签/搜索