我想知道JavaScript中null
和undefined
之間的區別。 javascript
因爲typeof返回undefined,所以undefined是一種類型,其中null表示一個初始化器,該變量表示沒有對象(Javascript中的幾乎全部對象都是對象)。 java
null和undefined都用於表示缺乏某些值。 函數
var a = null;
初始化並定義。 測試
typeof(a) //object
null是JavaScript中的對象 this
Object.prototype.toString.call(a) // [object Object] var b;
b是未定義和未初始化的 lua
未定義的對象屬性也是未定義的。 例如,在對象c上未定義「 x」,而且若是您嘗試訪問cx,它將返回未定義。 spa
一般,咱們將null分配給未定義的變量。 prototype
null是表示沒有值的特殊關鍵字。 code
將其視爲一個值,例如: 對象
undefined屬性表示還沒有爲變量分配包含null的值。 喜歡
var foo;
已定義的空變量爲數據類型undefined
null
他們兩個都表明一個沒有值的變量的值
與 null
並不表明沒有價值的字符串 -空與字符串
喜歡
var a = ''; console.log(typeof a); // string console.log(a == null); //false console.log(a == undefined); // false
如今若是
var a; console.log(a == null); //true console.log(a == undefined); //true
但
var a; console.log(a === null); //false console.log(a === undefined); // true
因此每一個人都有本身的使用方式
undefined用它來比較變量數據類型
null使用它來清空變量的值
var a = 'javascript'; a = null ; // will change the type of variable "a" from string to object
在JavasSript中,有5種原始數據類型String,Number,Boolean,null和undefined。 我將嘗試用一些簡單的例子來解釋
能夠說咱們有一個簡單的功能
function test(a) { if(a == null){ alert("a is null"); } else { alert("The value of a is " + a); } }
也在上面的函數中if(a == null)與if(!a)相同
如今,當咱們調用此函數而不傳遞參數a時
test(); it will alert "a is null"; test(4); it will alert "The value of a is " + 4;
也
var a; alert(typeof a);
這將給未定義; 咱們已經聲明瞭一個變量,但沒有給該變量賦任何值; 可是若是咱們寫
var a = null; alert(typeof a); will give alert as object
因此null是一個對象。 以某種方式,咱們爲'a'分配了null值
null和undefined是兩種不一樣的對象類型,它們具備如下共同點:
==
和!=
運算符認爲null和undefined值彼此相等,而別無其餘。 可是,類似之處到此結束。 一次,關鍵字null和undefined的實現方式存在根本差別。 這並不明顯,可是請考慮如下示例:
var undefined = "foo"; WScript.Echo(undefined); // This will print: foo
undefined , NaN和Infinity只是預初始化的「超全局」變量的名稱-它們在運行時進行初始化,而且能夠被具備相同名稱的常規全局或局部變量覆蓋。
如今,讓咱們嘗試使用null進行相同的操做:
var null = "foo"; // This will cause a compile-time error WScript.Echo(null);
糟糕! null , true和false是保留關鍵字-編譯器不容許您將它們用做變量或屬性名稱
另外一個區別是, undefined是原始類型,而null是對象類型(表示沒有對象引用)。 考慮如下:
WScript.Echo(typeof false); // Will print: boolean WScript.Echo(typeof 0); // Will print: number WScript.Echo(typeof ""); // Will print: string WScript.Echo(typeof {}); // Will print: object WScript.Echo(typeof undefined); // Will print: undefined WScript.Echo(typeof null); // (!!!) Will print: object
此外,在數字上下文中處理null和undefined的方式也存在重要區別:
var a; // declared but uninitialized variables hold the value undefined WScript.Echo(a === undefined); // Prints: -1 var b = null; // the value null must be explicitly assigned WScript.Echo(b === null); // Prints: -1 WScript.Echo(a == b); // Prints: -1 (as expected) WScript.Echo(a >= b); // Prints: 0 (WTF!?) WScript.Echo(a >= a); // Prints: 0 (!!!???) WScript.Echo(isNaN(a)); // Prints: -1 (a evaluates to NaN!) WScript.Echo(1*a); // Prints: -1.#IND (in Echo output this means NaN) WScript.Echo(b >= b); // Prints: -1 (as expected) WScript.Echo(isNaN(b)); // Prints: 0 (b evaluates to a valid number) WScript.Echo(1*b); // Prints: 0 (b evaluates to 0) WScript.Echo(a >= 0 && a <= 0); // Prints: 0 (as expected) WScript.Echo(a == 0); // Prints: 0 (as expected) WScript.Echo(b >= 0 && b <= 0); // Prints: -1 (as expected) WScript.Echo(b == 0); // Prints: 0 (!!!)
當在算術表達式或數值比較中使用null時,它變爲0-與false類似,它基本上只是一種特殊的「零」。 另外一方面, undefined是真正的「無」,當您嘗試在數字上下文中使用它時,它會變爲NaN (「非數字」)。
請注意, null和undefined從==
和!=
運算符處獲得特殊處理,可是您可使用表達式(a >= b && a <= b)
來測試a和b的真數值相等性。