以下代碼:javascript
undefined = 123; null = 123; // 報錯:Uncaught Reference Error
第一條語句能夠執行,儘管賦值並無成功;第二條語句報錯。這是爲何呢?undefined
和null
有什麼區別?java
讀過ES規範後,發現原來是這樣的:git
undefined
、NaN
和Infinity
都是全局對象window
的屬性。既然是屬性,固然能夠賦值。然而這三個屬性又是不可寫的屬性,即它們的的內部特性[[writable]]
爲false
,因此賦值無效。github
null
是一個字面量(literal),準確地說叫作Null字面量。與true
和false
相似。它們都屬於JavaScript的保留字。換句話說它們都是值,與數字值12三、字符串值"foobar"同樣,固然不能被賦值了。函數
既然undefined
只是一個屬性,並非語言的保留字,那麼它是否能夠用來做爲變量的名字?固然能夠,你徹底能夠自定義一個叫作undefined
的變量或者函數,可是注意不要把它放到全局做用域。例如:es5
function foo() { var undefined = 10; console.log(undefined); } foo(); // 打印10
經過ES5新增的方法Object.getOwnPropertyDescriptor
方法,能夠證實undefined
是window
對象的只讀屬性:code
Object.getOwnPropertyDescriptor(window, 'undefined'); /** 輸出:Object {value: undefined, writable: false, enumerable: false, configurable: false} **/
在嚴格模式下,給undefined
賦值會報錯。由於嚴格模式下,禁止給對象的只讀屬性賦值。對象
null
雖然號稱是Null
這種原始類型能夠取的惟一值,然而:ip
typeof null; // 輸出"object"