天天看點

null 與 undefined

javascript 中一共有 5 種基本類型,分别是 string、number、boolean、null 和 undefined 。前 3

種都比較好了解,後面兩種就稍微複雜一點。 null 類型隻有一個值,就是 null ; undefined 類型也隻有一個值,即 undefined 。

null 和 undefined 都可以作為字面量(literal)在 javascript 代碼中直接使用。

null 與對象引用有關系,表示為空或不存在的對象引用。當聲明一個變量卻沒有給它指派的時候,它的值就是 undefined 。

undefined 的值會出現在如下情況:

從一個對象中擷取某個屬性,如果該對象及其 prototype 鍊 中的對象都沒有該屬性的時候,該屬性的值為 undefined 。

一個

function 如果沒有顯式的通過 return 來傳回值給其調用者的話,其傳回值就是 undefined 。有一個特例就是在使用new的時候。

javascript 中的 function 可以聲明任意個形式參數,當該 function

實際被調用的時候,傳入的參數的個數如果小于聲明的形式參數,那麼多餘的形式參數的值為 undefined 。

關于 null 和 undefined 有一些有趣的特性:

如果對值為 null 的變量使用 typeof 操作符的話,得到的結果是 object ;而對 undefined 的值使用 typeof,得到的結果是

undefined 。如 typeof null === "object";typeof undefined === "undefined"

null

== undefined,但是 null !== undefined

if ("" || 0)

對于 if 表達式,大家都不陌生。

javascript 中 if 後面緊跟的表達式的真假值判斷與其它語言有所不同。具體請看表 1。

表 1. javascript 中的真假值

類型 真假值

null 總是為假(false)

undefined

總是為假(false)

boolean 保持真假值不變

number +0,-0 或是 nan 的時候為假,其它值為真

string

空字元串的時候為假,其它值為真

object 總是為真(true)

從表 1中可以看到,在 javascript 中使得 if 判斷為假的值可能有 null、undefined、false、+0、-0、nan

和空字元串("")。

== 與 ===

javascript 中有兩個判斷值是否相等的操作符,== 與 === 。兩者相比,== 會做一定的類型轉換;而 ===

不做類型轉換,所接受的相等條件更加嚴格。

=== 操作符的判斷算法

在使用 === 來判斷兩個值是否相等的時候,如判斷x===y,會首先比較兩個值的類型是否相等,如果不相等的話,直接傳回 false 。接着根據 x

的類型有不同的判斷邏輯。

如果 x 的類型是 undefined 或 null,則傳回 true 。

如果 x 的類型是 number,隻要 x 或 y 中有一個值為

nan,就傳回 false ;如果 x 和 y 的數字值相等,就傳回 true ;如果 x 或 y 中有一個是 +0,另外一個是 -0,則傳回 true

如果 x 的類型是 string,當 x 和 y 的字元序列完全相同時傳回 true,否則傳回 false 。

如果 x 的類型是

boolean,當 x 和 y 同為 true 或 false 時傳回 true,否則傳回 false 。

當 x 和 y 引用相同的對象時傳回

true,否則傳回 false 。

== 操作符的判斷算法

在使用 == 來判斷兩個值是否相等的時候,如判斷x==y,當 x 和 y 的類型一樣的時候,判斷邏輯與 === 一樣;如果 x 和 y 的類型不一樣,==

不是簡單的傳回 false,而是會做一定的類型轉換。

如果 x 和 y 中有一個是 null,另外一個是 undefined 的話,傳回 true 。如null == undefined。

如果 x 和

y 中一個的類型是 string,另外一個的類型是 number 的話,會将 string 類型的值轉換成 number 來比較。如3 == "3"。

如果 x 和 y 中一個的類型是 boolean 的話,會将 boolean 類型的值轉換成 number 來比較。如true == 1、true ==

"1"

如果 x 和 y 中一個的類型是 string 或 number,另外一個的類型是 object 的話,會将 object

類型的值轉換成基本類型來比較。如[3,4] == "3,4"

需要注意的是 == 操作符不一定是傳遞的,即從a == b, b == c并不能一定得出a

== c。考慮下面的例子,var str1 = new string("hello"); var str2 = new string("hello");

str1 == "hello"; str2 == "hello",但是str1 != str2。

array

javascript 中的數組(array)和通常的程式設計語言,如 java 或是 c/c++ 中的有很大不同。在 javascript

中的對象就是一個無序的關聯數組,而 array 正是利用 javascript 中對象的這種特性來實作的。在 javascript 中,array

其實就是一個對象,隻不過它的屬性名是整數,另外有許多額外的屬性(如 length)和方法(如 splice)等友善地操作數組。

建立數組

建立一個 array 對象有兩種方式,一種是以數組字面量的方式,另外一種是使用 array 構造器。數組字面量的方式通常為大家所熟知。如var

array1 = [2, 3, 4];。使用 array 構造器有兩種方式,一種是var array2 = new array(1, 2,

3);;另外一種是var array3 = array(1, 2, 3);。這兩種使用方式的是等價的。使用 array

構造器的時候,除了以初始元素作為參數之後,也可以使用數組大小作為參數。如var array4 = new array(3);用來建立一個初始大小為 3

的數組,其中每個元素都是 undefined 。

array 的方法

javascript 中的 array 提供了很多方法。

push和pop在數組的末尾進行操作,使得數組可以作為一個棧來使用。

shift和unshift在數組的首部進行操作。

slice(start,

end)用來取得原始數組的子數組。其中參數start和end都可以是負數。如果是負數的話,實際使用的值是參數的原始值加上數組的長度。如var array =

[2, 3, 4, 5]; array.slice(-2, -1);等價于array.slice(2, 3)。

splice是最複雜的一個方法,它可以同時删除和添加元素。該方法的第一個參數表示要删除的元素的起始位置,第二個參數表示要删除的元素個數,其餘的參

數表示要添加的元素。如代碼var array = [2, 3, 4, 5]; array.splice(1, 2, 6, 7,

8);執行之後,array中的元素為[2, 6, 7, 8, 5]。該方法的傳回被删除的元素。

0、""、nan、null和defined都是假的

。剩下的東西都是真的。

換句話說,零、null、nan和空字元串天生就是假

;而其他的天生就是真 。