JavaScript 中 undefined 的使用

定義

Undefined 是 JavaScript 中的一種基本數據類型,該類型有一個惟一值 undefinedjavascript

6種基本類型: Undefined Null Number String Boolean Symboljava

// typeof 操做符指示操做數的類型
typeof undefined; // "undefined"
typeof 2; // "number"

使用

一般狀況下,使用 undefined 是指 window 對象下的 undefined 屬性。
即在瀏覽器端使用 undefined 時,其實使用的是 window.undefined,而恰巧 window.undefined 的初始值爲 undefined瀏覽器

如何證明使用 undefined 時,是使用 window.undefined , 而不是具體值 undefined函數

請看下面的例子:code

null = 10; // 報錯,由於不能給具體的值進行賦值操做
undefined = 11; // 不報錯,由於 undefined 指的是 window 對象下的 undefined 屬性
'undefined' in window; // true

若是還有懷疑,能夠再舉一個栗子:對象

"use strict";
undefined = 11; 
// Script snippet #1:2 Uncaught TypeError: Cannot assign to read only property 'undefined' of object '#<Window>'
// 嚴格模式下,給對象的只讀屬性賦值會報錯

window.undefined 在 ES3 中可修改成任意值,但在 ES5 中是不可寫、不可配置的屬性,其值永遠是 undefinedip

因此在全局環境下,若是 window 對象沒有被覆蓋,能夠放心使用 undefinedwindow.undefined),由於它是不可修改的。underscore

window.undefined 是不可修改的,但 window 對象是可修改的源碼

let a;
a === undefined;         // true
a === window.undefined;  // true

// window.undefined 屬性不可修改
window.undefined = 11;
window.undefined; // undefined

可是,在函數內部使用 undefined 可能並不可靠,雖然 undefined 是一種數據類型,但它並非關鍵字,因此它能夠做爲標識符,例如:it

(function () {
    let a;
     let undefined = '123';
     console.log(a === undefined); // false
     console.log(a); // undefined
     console.log(undefined); // 123
     console.log(window.undefined) // undefined
})()

正如以前所說,使用 window.undefined 也並不必定可靠,再看下面的例子:

function fun() {
   let undefined = 'hello world',
       f = {},
       window = {
           'undefined': 'abc'
       };
   console.log(undefined);// hello world
   console.log(window.undefined); //abc
   console.log(f.a === undefined); //false
   console.log(f.a === void 0); //true
}
fun();

能夠看出,若是某段代碼複寫了 window 對象,在使用 undefined 時會出現一些問題,但總會有解決辦法的。

例如 jQuery 源碼裏是這樣是使用的:

// 自執行函數裏定義了兩個參數,但在調用時只傳了一個參數,因此第二個參數 undefined 的值爲 undefined
(function( window, undefined ) { 
    // 構造 jQuery 對象 
    var jQuery = (function() { 
        var jQuery = function( selector, context ) {
            return new jQuery.fn.init( selector, context, rootjQuery );
        };
         // 省略其餘模塊的代碼
     }); 
     window.jQuery = window.$ = jQuery; 
 })( window );

underscore 源碼裏是這樣是使用的:

// 不管 void 操做符後面的表達式是什麼,其返回值都爲 undefined
_.isUndefined = function(obj) {
    return obj === void 0;
};

賦值

給變量賦值爲 undefined ,能夠用如下幾種方式:

  • 變量被聲明瞭,但沒有賦值時,該變量就等於 undefined

  • 調用函數時,應該提供的參數沒有提供,該參數等於 undefined

  • 對象沒有賦值的屬性,該屬性的值爲 undefined

  • 函數沒有返回值時,默認返回 undefined

  • 執行 void(0),返回值爲 undefined

相關文章
相關標籤/搜索