成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

細說 Javascript 拾遺篇(二) : undefined 和 null

My_Oh_My / 2303人閱讀

摘要:有兩個可以表示空的值,分別是和,比較有作用的是前者。訪問聲明但未初始化的變量。有返回值時函數(shù)的表達式?jīng)]有顯式的返回任何內(nèi)容。然而,為了比較其他變量和值,我們需要提前取得的值。因此,從標準實行后,全局變量已經(jīng)是不再可寫。

Javascript 有兩個可以表示空的值,分別是 undefinednull,比較有作用的是前者。

undefined

undefined 是一種值為 undefined 的變量類型。
Javascript 還定義了一個全局變量 undefined,它的值就是 undefined,然而這個變量既不是常量也不是 Javascript 的關鍵字。這就意味著這個變量的值可以被重新賦值。

下面總結下會返回 undefined 值的情況:

1.訪問未曾修改的全局變量 undefined。

2.訪問聲明但未初始化的變量。

3.沒有定義 return 表達式的函數(shù)。

有返回值時:

4.函數(shù)的 return 表達式?jīng)]有顯式的返回任何內(nèi)容。

5.訪問不存在的屬性。

6.函數(shù)參數(shù)沒有被顯式傳遞值。

7.賦值為 undefined 值的變量。

8.void(expression) 形式的表達式。

處理 undefined 值的變化

由于全局變量 undefined 只是保存了一份值為 undefined 的拷貝,因此修改該變量的值并不會改變 undefined 類型的值。
然而,為了比較其他變量和 undefined 值,我們需要提前取得 undefined 的值。
為了避免代碼中可能對 undefined 變量進行重新賦值,常用的方法是使用一個額外的參數(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

盡管在 Javascriptundefined 類型變量的使用類似于 null,但是實際上是完全不同的另一種類型的變量。
nullJavascript 中有一些使用場景(例如聲明原型鏈的結束 Foo.prototype = null),但是在絕大部分情況下,null 都可以被 undefined 所代替。

總結

盡管 undefined 不是關鍵字,可被賦值,但是根據(jù)現(xiàn)在的規(guī)范好像是并不可重寫:

這個問題明日再研究下。

今天提問后解決了這個問題,原因在于 ECMAScript 5 標準里加入了變量擁有可寫、可枚舉、可配置屬性。
而全局的 undefined 的可寫屬性是 false。測試如下:

Object.getOwnPropertyDescriptor(window, "undefined");

結果為:

Object {value: undefined, writable: false, enumerable: false, configurable: false}

所以當時作者寫下這句話時應該是在 EMCAScript 5 標準制定之前。因此,從 EMCAScript 5 標準實行后,全局變量 undefined 已經(jīng)是不再可寫。

  

提問鏈接:《全局變量 undefined 可以被重寫應該怎么理解》

參考

http://bonsaiden.github.io/JavaScript-Garden/#core.undefined

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/78095.html

相關文章

  • 細說 Javascript 遺篇(三) : 自動插入分號

    摘要:此時會自動插入分號,解析器將再次嘗試。工作原理下面的代碼沒有分號,因此解析器將會自己判斷在哪些地方插入分號。前置小括號在有前置小括號的情形時,解析器將不會自動插入分號。這不僅將保證代碼整體的一致性,也將有效地避免解析器對代碼行為的錯誤改變。 盡管 Javascript 有類似 C 的句法風格,但是它并不強制在代碼中使用分號,所以分號可能被省略。Javascript 并不是一個缺少分號的...

    mushang 評論0 收藏0
  • 細說 Javascript 遺篇(四) : setTimeout setInterval

    摘要:當間隔時間設置較小時,將會導致回調(diào)函數(shù)堆積。處理可能阻塞的代碼最簡單且最可控的方式就是在回調(diào)函數(shù)內(nèi)部使用函數(shù)。但是很明顯,由于指定最大值的限制,還會有定時器沒有被清除掉。另外,盡量避免使用函數(shù),從而避免可能導致的回調(diào)函數(shù)堆積現(xiàn)象。 由于 Javascript 是異步的,因此我們可以通過 setTimeout 和 setInterval 函數(shù)來指定特定時間執(zhí)行代碼。 function ...

    wangjuntytl 評論0 收藏0
  • 細說 Javascript 遺篇(一) : 遠離 eval 函數(shù)

    摘要:然而,函數(shù)只有在當前作用域中直接被調(diào)用并且被調(diào)用的函數(shù)名為才會被執(zhí)行。在全局作用域下,這個字符串會一直被執(zhí)行,在這個情形下我們并沒有直接調(diào)用函數(shù),也可以執(zhí)行字符串??偨Y函數(shù)應該盡可能地避免使用。 Javascript 的 eval 函數(shù)可以在當前作用域執(zhí)行一段包含 Javascript 代碼的字符串。 var foo = 1; function test() { var fo...

    imtianx 評論0 收藏0
  • 細說 Javascript 類型篇() : typeof 操作符

    摘要:操作符還有可能是設計中最大缺陷,因為它幾乎是完全破損的。由于用法與調(diào)用函數(shù)的語法相似,因此常被誤以為是函數(shù)調(diào)用,實際上并不存在名為的函數(shù),只是一個操作符而已。而列則表示對象內(nèi)部的屬性。屬性文檔中明確地給出了獲得屬性的途徑,就是使用。 typeof 操作符(還有 instanceof)可能是 Javascript 設計中最大缺陷,因為它幾乎是完全破損的。由于 typeof 用法與調(diào)用函數(shù)...

    PAMPANG 評論0 收藏0
  • 細說 Javascript 對象篇() : 原型對象

    摘要:并沒有類繼承模型,而是使用原型對象進行原型式繼承。我們舉例說明原型鏈查找機制當訪問一個對象的屬性時,會從對象本身開始往上遍歷整個原型鏈,直到找到對應屬性為止。原始類型有以下五種型。此外,試圖查找一個不存在屬性時將會遍歷整個原型鏈。 Javascript 并沒有類繼承模型,而是使用原型對象 prototype 進行原型式繼承。 盡管人們經(jīng)常將此看做是 Javascript 的一個缺點,然...

    lansheng228 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<