摘要:有兩個可以表示空的值,分別是和,比較有作用的是前者。訪問聲明但未初始化的變量。有返回值時函數的表達式沒有顯式的返回任何內容。然而,為了比較其他變量和值,我們需要提前取得的值。因此,從標準實行后,全局變量已經是不再可寫。
Javascript 有兩個可以表示空的值,分別是 undefined 和 null,比較有作用的是前者。
undefinedundefined 是一種值為 undefined 的變量類型。
Javascript 還定義了一個全局變量 undefined,它的值就是 undefined,然而這個變量既不是常量也不是 Javascript 的關鍵字。這就意味著這個變量的值可以被重新賦值。
下面總結下會返回 undefined 值的情況:
1.訪問未曾修改的全局變量 undefined。
2.訪問聲明但未初始化的變量。
3.沒有定義 return 表達式的函數。
有返回值時:
4.函數的 return 表達式沒有顯式的返回任何內容。
5.訪問不存在的屬性。
6.函數參數沒有被顯式傳遞值。
7.賦值為 undefined 值的變量。
8.void(expression) 形式的表達式。
處理 undefined 值的變化由于全局變量 undefined 只是保存了一份值為 undefined 的拷貝,因此修改該變量的值并不會改變 undefined 類型的值。
然而,為了比較其他變量和 undefined 值,我們需要提前取得 undefined 的值。
為了避免代碼中可能對 undefined 變量進行重新賦值,常用的方法是使用一個額外的參數傳遞到匿名的立即執行函數中。
var undefined = 123; (function(something, foo, undefined) { // undefined in the local scope does // now again refer to the value `undefined` })("Hello World", 42);
另外一種方法是在函數內部重新聲明變量 undefined:
var undefined = 123; (function(something, foo) { var undefined; ... })("Hello World", 42);null
盡管在 Javascript 中 undefined 類型變量的使用類似于 null,但是實際上是完全不同的另一種類型的變量。
null 在 Javascript 中有一些使用場景(例如聲明原型鏈的結束 Foo.prototype = null),但是在絕大部分情況下,null 都可以被 undefined 所代替。
盡管 undefined 不是關鍵字,可被賦值,但是根據現在的規范好像是并不可重寫:
這個問題明日再研究下。
今天提問后解決了這個問題,原因在于 ECMAScript 5 標準里加入了變量擁有可寫、可枚舉、可配置屬性。
而全局的 undefined 的可寫屬性是 false。測試如下:
Object.getOwnPropertyDescriptor(window, "undefined");
結果為:
Object {value: undefined, writable: false, enumerable: false, configurable: false}
所以當時作者寫下這句話時應該是在 EMCAScript 5 標準制定之前。因此,從 EMCAScript 5 標準實行后,全局變量 undefined 已經是不再可寫。
參考提問鏈接:《全局變量 undefined 可以被重寫應該怎么理解》
http://bonsaiden.github.io/JavaScript-Garden/#core.undefined
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78095.html
摘要:此時會自動插入分號,解析器將再次嘗試。工作原理下面的代碼沒有分號,因此解析器將會自己判斷在哪些地方插入分號。前置小括號在有前置小括號的情形時,解析器將不會自動插入分號。這不僅將保證代碼整體的一致性,也將有效地避免解析器對代碼行為的錯誤改變。 盡管 Javascript 有類似 C 的句法風格,但是它并不強制在代碼中使用分號,所以分號可能被省略。Javascript 并不是一個缺少分號的...
摘要:當間隔時間設置較小時,將會導致回調函數堆積。處理可能阻塞的代碼最簡單且最可控的方式就是在回調函數內部使用函數。但是很明顯,由于指定最大值的限制,還會有定時器沒有被清除掉。另外,盡量避免使用函數,從而避免可能導致的回調函數堆積現象。 由于 Javascript 是異步的,因此我們可以通過 setTimeout 和 setInterval 函數來指定特定時間執行代碼。 function ...
摘要:然而,函數只有在當前作用域中直接被調用并且被調用的函數名為才會被執行。在全局作用域下,這個字符串會一直被執行,在這個情形下我們并沒有直接調用函數,也可以執行字符串。總結函數應該盡可能地避免使用。 Javascript 的 eval 函數可以在當前作用域執行一段包含 Javascript 代碼的字符串。 var foo = 1; function test() { var fo...
摘要:操作符還有可能是設計中最大缺陷,因為它幾乎是完全破損的。由于用法與調用函數的語法相似,因此常被誤以為是函數調用,實際上并不存在名為的函數,只是一個操作符而已。而列則表示對象內部的屬性。屬性文檔中明確地給出了獲得屬性的途徑,就是使用。 typeof 操作符(還有 instanceof)可能是 Javascript 設計中最大缺陷,因為它幾乎是完全破損的。由于 typeof 用法與調用函數...
摘要:并沒有類繼承模型,而是使用原型對象進行原型式繼承。我們舉例說明原型鏈查找機制當訪問一個對象的屬性時,會從對象本身開始往上遍歷整個原型鏈,直到找到對應屬性為止。原始類型有以下五種型。此外,試圖查找一個不存在屬性時將會遍歷整個原型鏈。 Javascript 并沒有類繼承模型,而是使用原型對象 prototype 進行原型式繼承。 盡管人們經常將此看做是 Javascript 的一個缺點,然...
閱讀 854·2021-11-19 11:29
閱讀 3349·2021-09-26 10:15
閱讀 2855·2021-09-22 10:02
閱讀 2433·2021-09-02 15:15
閱讀 1970·2019-08-30 15:56
閱讀 2408·2019-08-30 15:54
閱讀 2903·2019-08-29 16:59
閱讀 635·2019-08-29 16:20