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