由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

相關文章
相關標籤/搜索