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