JavaScript之類型、值和變量

1 概述

JavaScript 的數據類型分為兩類:原始類型 (primitive type) 和對象類型 (object type)。 null和undefined代表瞭各自特殊類型的唯一成員。 數組是帶編號的有序集合對象。 當沒有任何引用指向一個對象,解釋器會自動回收它所占的內存資源。 不在函數內聲明的變量屬於全局變量。

2 數字

JavaScript 不區分整數還是浮點數,均采用 IEEE 754 標準定義的 64 位浮點格式表示數字。 浮點數的范圍是 ±1.7976931348623157e308~±5e-324。整數范圍是 – 2^53~2^53。 JavaScript 的數組索引以及位操作都是基於 32 位整數的。 JavaScript 支持十進制和十六進制。 JavaScript 的數字語法格式為:[digits][.digits][(E|e)[(+|-)]digits] 當數字超過 JavaScript 所能表示的范圍,結果為無窮大用±Infinity表示。 ±Infinity參與算術運算時,結果依然為±Infinity。 JavaScript 在被零整除、溢出和下溢時不報錯。 下溢是當運算結果無限接近於零並比 JavaScript 能表示的最小值還小時發生的情況,這時 JavaScript 返回 0,負數發生下溢時返回負零。 無窮大除以無窮大 (乘以時不會)、任意負數開平方、0 除以 0 以及算術運算符的操作數無法轉化為數字時,結果將返回 NaN。 NaN 於任何值都不相等,包括它自身。 負零除瞭作為除數時不一樣外,其餘都與正零值想等

3 文本

JavaScript 的字符串是一組由 16 位值組成的不可變的有序序列。每個字符來自 Unicode 字符集。 字符串的長度是所含 16 位值的個數。 對於不能用 16 位值表示的 Unicode 則使用兩個 16 位值表示,長度為 2。 字符串使用雙引號,單引號都可。 JavaScript 支持轉義字符。 字符串可以作為隻讀數組,使用[]運算符訪問其中的字符。

轉義字符 含義
\o NUL 字符
\b 退格符
\t 水平制表符
\n 換行符
\v 垂直制表符
\f 換頁符
\r 回車符
\” 雙引號
\’ 單引號
\\ 反斜線
\xXX 由兩位十六進制數 XX 指定的 Latin-1 字符
\uXXXX 由四位十六進制數 XXXX 指定的 Unicode 字符

4 正則表達式

正則表達式不是 JavaScript 的基本數據類型,但也提供瞭直接量的寫法。 兩條斜線之間的文本構成瞭一個正則表達式的直接量,第二個斜線之後可以跟隨多個字母,用來修飾匹配模式的含義。

/\d+/g ;//匹配所有包含一個或多個的數字實例
/^HTML/ //匹配以HTML開頭的字符串

5 佈爾值

佈爾值包含toString()方法,可以將值轉化為字符串"true"和"false" 。

6 null 和 undefined

null undefined
null是 JavaScript 的關鍵字 undefined是預定義的全局變量
null表示數字、字符串或對象無值 undefined表示值的空缺, 例如變量未初始化、沒有返回值函數的返回值、沒有提供實參的形參值
typeof返回"object" typeof返回"undefined"
null表示程序級別的、正常或者意料之中的值的空缺 undefined表示系統級別、出乎意料或類似錯誤的值的空缺
null和undefined都是假植  
==運算符認為兩者相等,隻有===才能區分它們  
使用.和[]運算符來存取這兩個值都會產生類型錯誤  

7 對象

7.1 全局對象

全局對象的屬性是全局定義的,可以直接使用。 JavaScript 解釋器啟動或者加載刷新頁面時,它將創建一個新的全局對象,並給他一組定義的初始屬性:
全局屬性:undefined、Infinity、NaN 全局函數:isNaN()、parseInt()、 eval() 構造函數:Date()、RegExp()、String()、Object()、Array() 全局對象:Math、JSON 可以在任何函數外,也就是代碼最頂級,使用 JavaScript 關鍵字引用全局對象。

var global = this; // 將全局變量賦予global變量

在瀏覽器中的所有 JavaScript 代碼中,Window對象充當瞭全局對象。 所有定義的全局變量,都作為全局對象的屬性。

7.2 包裝對象

JavaScript 的對象是復合值,是屬性的集合,當屬性值是函數時,稱其為方法。 隻要引用瞭字符串的屬性,JavaScript 會通過自動調用new String(s)的方式轉化為對象。 數字和佈爾值也有相對應的構造函數,Number()和Boolean(),null和undefined沒有對應的包裝對象。 包裝對象不是真正的對象,隻能讀取,不能賦值和添加新的屬性。 使用顯示var s = new String("sd")創建的對象,可讀寫。

7.3 原始值和對象引用

原始值 (數字,字符串,null、佈爾值、undefined) 是不可變的。 原始值的比較是值的比較,對象之間的比較是引用的比較,僅當引用同一對象時才相等。

7.4 類型轉換

字符串 數字 佈爾值 對象
undefined “undefined” NaN false throws TypeError
null “null” 0 false throw TypeError}
true “true” 1   new Boolean(true)
false “false” 0   new Boolean(false)
“”(空字符串)   0 false new String(“”)
“1.2”(非空,數字)   1.2(允許開始和結尾處有空格) true new String(“1.2”)
“one”(非空,非數字)   NaN true new String(“one”)
0 “0”   false new Number(0)
-0 “0”   false new Nunmber(-0)
NaN “NaN”   false new Number(NaN)
Infinity “Infinity”   true new Number(Infinity)
-Infinity “-Infinity”   true new Number(-Infinity)
1 (非零) “1”   true new Number(1)
{} 任意對象     true  
[] 任意數組 “” 0 true  
[9]1 個數字元素 “9” 9 true  
[“a”] 其它數組 使用 join() 方法 NaN true  
function(){} 任意函數     true  

# 7.4.1 對象轉換為原始值

所有的對象,包括數組和函數,轉換到佈爾值時,都會轉換為 true,包括 new Boolean(false)。 對象通過調用toString()方法轉換為字符串,調用valueOf()方法轉換為數字。 JavaScript 對象到字符串的轉換步驟:
調用toString()方法,如果返回一個原始值,將其轉換為字符串。 如果沒有toString(),或者該方法不返回一個原始值,那麼將調用valueOf()方法,然後將其返回值轉換為字符。 如果該對象沒有toString()和valueOf()方法,或者這兩個方法都不返回原始值,將拋出類型錯誤異常。 JavaScript 對象到數字的步驟與字符串類似,隻不過先嘗試使用valueOf(),然後如有必要,再使用toString()。 在 + 、==以及其它關系運算符中,對象轉換原始值的過程是:先嘗試調用valueOf(),然後調用toString()不論原始值是否直接使用,都不會轉換為數字或字符串。 而日期對象,則使用字符串的轉換模式。

8 變量

JavaScript 對象隻有塊級作用域和頂級作用域。 全局變量實際上是全局對象的一個屬性,使用 var 聲明變量時,創建的這個屬性是不可配置的,無法使用delete運算符刪除。 直接給未聲明的變量賦值,將自動創建一個全局變量,該方式創建的對象,可以使用delete刪除。 全局對象始終有定義,局部變量在聲明它的函數體內,以及嵌套的函數內始終有定義。

8.1 作用域鏈

每段 JavaScript 代碼,都有與之關聯的作用域鏈,該作用域鏈是一個對象列表或鏈表,定義這個這段代碼作用域中的變量。當需要查找變量 x 時,會從該鏈表的第一個對象開始查找。 在最頂層代碼中,作用鏈有一個對象,即全局對象。在函數體內有兩個對象,第一個是定義函數參數和局部變量的對象,第二個是全局對象。 當定義一個函數時,實際上是保存瞭一個作用域鏈,當調用該函數時,創建一個新的對象來存儲它的局部變量,並將這個變量添加至保存的那個作用域鏈上,同時創建新的更長的表示函數調用作用域的鏈。 對於嵌套函數,每次調用外部函數時,作用域鏈都是不同的。

發佈留言