JavaScript(二)數據類型
計算機程序的運行需要對值進行操作,在編程語言中值的類型被稱作數據類型,編程語言最基本的特性就是能夠支持多種數據類型。當程序需要將值保存起來以備將來使用時,便將其賦值給一個變量。變量是一個值的符號名稱,可以通過該名稱來獲得對值的引用。
JavaScript中除了數字、字符串、布爾值、null和undefined之外就是對象了,對象是屬性的集合,每個屬性都由“鍵:值”構成。
1、數字
和其它編程語言不同,JavaScript不區分整數值和浮點數值。JavaScript中的所有數字均用浮點數值表示。JavaScript采用IEEE754標準定義的64位浮點格式表示數字,這意味著它能表示的最大值是±1.7976931348623157x10的308次冪,最小值是±5x10的-324次冪。
整數能表示的範圍是-9007199254740992-9007199254740992(-2的53次冪到2的53次冪),包含邊界值,如果使用了超過此範圍的整數,則無法保證低位數的精度。但需要註意的是數組的索引是基於32位的整數。
當一個數字直接出現在JavaScript程序中,稱之為數字直接量,JavaScript支持多種格式的數字直接量,註意在任何數字直接量前添加符號(-)可以得到他們的負值。但負號是一元求反運算符,並不是數字直接量語法的組成部分。
1.1整形直接量
除了十進制的整形直接量,JavaScript還可以識別十六進制的值,十六進制直接量是以“0x”或“0X”為前綴,其後跟隨十六進制數串的直接量。十六進制值是0-9之間的數字和a(A)-f(F)之間的字母構成。盡管ECMAScript標準不支持八進制直接量,但JavaScript的某些實現可以允許采用八進制形式表示整數。八進制直接量以數字0開始,其後跟隨一個由0-7之間的數字組成。由於某些JavaScript的實現支持八進制直接量,而有些不支持,因此最好不要使用以0為前綴的整形直接量,畢竟我們也無法得知當前JavaScript的實現是否支持八進制的解析。在ECMAScript6的嚴格模式下,八進制直接量是明令禁止的。
1.2浮點型直接量
浮點型可以含有小數點,它們采用的是傳統的實數寫法。一個實數由整數部分,小數點和小數部分組成。
此外還可以使用科學計數法表示浮點型,即在實數後跟字母e(E)後面跟正負號,最後在加上整形的指數。語法如下:
[digits][.digits][(e|E)[(+|-)]digits]
3.14
1.234E5 表示1.234x10的5次冪
1.234E-5 表示1.234x10的-5次冪
1.3JavaScript中算術運算符
JavaScript程序是使用語言本身提供的算術運算符來進行數字運算的,這些運算符包括+、-、*、/、%。除了基本的運算符外,
JavaScript還支持更加復雜的算術運算符,這些復雜運算作為Math對象的屬性定義的函數和常量來實現。
方法 | 描述 |
---|---|
abs(x) | 返回 x 的絕對值。Math.abs(-3.2)=3.2 |
acos(x) | 返回 x 的反余弦值。 |
asin(x) | 返回 x 的反正弦值。 |
atan(x) | 以介於 -PI/2 與 PI/2 弧度之間的數值來返回 x 的反正切值。 |
atan2(y,x) | 返回從 x 軸到點 (x,y) 的角度(介於 -PI/2 與 PI/2 弧度之間)。 |
ceil(x) | 對數進行上舍入。 |
cos(x) | 返回數的余弦。 |
exp(x) | 返回 Ex 的指數。 |
floor(x) | 對 x 進行下舍入。 |
log(x) | 返回數的自然對數(底為e)。 |
max(x,y,z,...,n) | 返回 x,y,z,...,n 中的最高值。 |
min(x,y,z,...,n) | 返回 x,y,z,...,n中的最低值。 |
pow(x,y) | 返回 x 的 y 次冪。Math.pow(2,5) =2的5次冪=32 |
random() | 返回 0 ~ 1 之間的隨機數。 |
round(x) | 四舍五入。Math.round(4.83)=5 |
sin(x) | 返回數的正弦。 |
sqrt(x) | 返回數的平方根。 |
tan(x) | 返回角的正切。 |
JavaScript中的算術運算在溢出(overflow),下溢(underflow)或被零整除時不會報錯。當數字運算結果超過了JavaScript所能表示的數字上限(溢出),結果為一個特殊的無窮大值Infinity。同樣的當負數的值超過了JavaScript所能表示的負數範圍,結果為負無窮大-Infinity表示。無窮大值的行為特性和我們所期望的是一致的,基於它們的加減乘除結果是無窮大值。
下溢是當運算結果無限接近於0並比JavaScript能表示的最小值還小的時候發生的一種情形。這種情況下JavaScript將會返回0.當一個負數發生下溢時,JavaScript返回一個特殊的值負零,這個值(負零)幾乎和正常的零完全一樣。幾乎很少用到負零。
被零整除在JavaScript並不報錯,它只是簡單的返回無窮大或負無窮大。但有一個例外,零除以零沒有意義,這種整除運算結果也是一個非數字(not-a-number NaN)值,用NaN表示。無窮大除以無窮大,給任意負數做開方運算或者算術運算符與不是數字或無法轉換為數字的操作數一起使用時都返回NaN
非數字值NaN和任何值都不相等,包括自身。也就是說沒辦法通過a==NaN來判斷a的值是否是NaN,可以使用isNaN(變量)來判斷是否是NaN,如果結果為true表示是NaN類型。
isFinite(變量)在參數不是NaN、Infinity或-Infinity的時候返回true。
負零同樣有特殊,它和正零是相等的(即使使用JavaScript的嚴格相等測試來判斷)。這意味著兩個值幾乎一樣,除了作為除數之外:
var z = 0; var n = -0; z === n; // 結果為true a = 2 / z; // 結果為Infinity c = 2 / n; // 結果為-Infinity
1.4二進制浮點數和四舍五入錯誤
實數由無數個,但JavaScript通過浮點數的形式只能表示其中有限的個數(確切的說是18437736874454810627個,本人未測試)。也就是說,當在JavaScript中使用實數的時候,常常只是真實值的一個近似表示。
JavaScript采用了IEEE-754浮點數表示法(幾乎所有現代編程語言所采用),這是一種二進制表示法,可以精確的表示分數,如1/2、1/8、1/1024。遺憾的是,我們常用的分數(特別是在金融計算方面)都是十進制分數1/10、1/100等。二進制浮點數表示法並不能精確表示類似0.1這樣簡單的數字。JavaScript具有足夠的精度,可以及其近似於0.1.但事實是,數字不能精確表述的確帶來一些問題。如下代碼:
var a = 0.3 - 0.2 // a實際等於0.09999999999999998 var b = 0.2 - 0.1 // b實際等於0.1
由於舍入誤差,0.3和0.2之間的近似差值實際上並不等於0.2和0.1之間的近似差值。這個問題並不只在JavaScript中才會出現,在任何使用二進制浮點數的編程語言中都會有這個問題。需要理解的是上述代碼a和b的值非常的接近彼此最終的正確值,這種結果可以勝任大多數的計算任務,這個問題也只有在比較兩個值是否相等的時候才會出現。
2、Data對象
JavaScript語言核心包括Date()構造函數,用來創建表示日期和時間的對象。這些日期對象的方法為日期計算提供了簡單的API。日期對象不像數字那樣是基本數據類型。下面是常用方法:
方法 | 描述 |
---|---|
getDate() | 從 Date 對象返回一個月中的某一天 (1 ~ 31)。 |
getDay() | 從 Date 對象返回一周中的某一天 (0 ~ 6)。 |
getFullYear() | 從 Date 對象以四位數字返回年份。 |
getHours() | 返回 Date 對象的小時 (0 ~ 23)。 |
getMilliseconds() | 返回 Date 對象的毫秒(0 ~ 999)。 |
getMinutes() | 返回 Date 對象的分鐘 (0 ~ 59)。 |
getMonth() | 從 Date 對象返回月份 (0 ~ 11)。 |
getSeconds() | 返回 Date 對象的秒數 (0 ~ 59)。 |
getTime() | 返回 1970 年 1 月 1 日至今的毫秒數。 |
getTimezoneOffset() | 返回本地時間與格林威治標準時間 (GMT) 的分鐘差。 |
getUTCDate() | 根據世界時從 Date 對象返回月中的一天 (1 ~ 31)。 |
getUTCDay() | 根據世界時從 Date 對象返回周中的一天 (0 ~ 6)。 |
getUTCFullYear() | 根據世界時從 Date 對象返回四位數的年份。 |
getUTCHours() | 根據世界時返回 Date 對象的小時 (0 ~ 23)。 |
getUTCMilliseconds() | 根據世界時返回 Date 對象的毫秒(0 ~ 999)。 |
getUTCMinutes() | 根據世界時返回 Date 對象的分鐘 (0 ~ 59)。 |
getUTCMonth() | 根據世界時從 Date 對象返回月份 (0 ~ 11)。 |
getUTCSeconds() | 根據世界時返回 Date 對象的秒鐘 (0 ~ 59)。 |
getYear() | 已廢棄。 請使用 getFullYear() 方法代替。 |
parse() | 返回1970年1月1日午夜到指定日期(字符串)的毫秒數。 |
setDate() | 設置 Date 對象中月的某一天 (1 ~ 31)。 |
setFullYear() | 設置 Date 對象中的年份(四位數字)。 |
setHours() | 設置 Date 對象中的小時 (0 ~ 23)。 |
setMilliseconds() | 設置 Date 對象中的毫秒 (0 ~ 999)。 |
setMinutes() | 設置 Date 對象中的分鐘 (0 ~ 59)。 |
setMonth() | 設置 Date 對象中月份 (0 ~ 11)。 |
setSeconds() | 設置 Date 對象中的秒鐘 (0 ~ 59)。 |
setTime() | setTime() 方法以毫秒設置 Date 對象。 |
setUTCDate() | 根據世界時設置 Date 對象中月份的一天 (1 ~ 31)。 |
setUTCFullYear() | 根據世界時設置 Date 對象中的年份(四位數字)。 |
setUTCHours() | 根據世界時設置 Date 對象中的小時 (0 ~ 23)。 |
setUTCMilliseconds() | 根據世界時設置 Date 對象中的毫秒 (0 ~ 999)。 |
setUTCMinutes() | 根據世界時設置 Date 對象中的分鐘 (0 ~ 59)。 |
setUTCMonth() | 根據世界時設置 Date 對象中的月份 (0 ~ 11)。 |
setUTCSeconds() | setUTCSeconds() 方法用於根據世界時 (UTC) 設置指定時間的秒字段。 |
setYear() | 已廢棄。請使用 setFullYear() 方法代替。 |
toDateString() | 把 Date 對象的日期部分轉換為字符串。 |
toGMTString() | 已廢棄。請使用 toUTCString() 方法代替。 |
toISOString() | 使用 ISO 標準返回字符串的日期格式。 |
toJSON() | 以 JSON 數據格式返回日期字符串。 |
toLocaleDateString() | 根據本地時間格式,把 Date 對象的日期部分轉換為字符串。 |
toLocaleTimeString() | 根據本地時間格式,把 Date 對象的時間部分轉換為字符串。 |
toLocaleString() | 據本地時間格式,把 Date 對象轉換為字符串。 |
toString() | 把 Date 對象轉換為字符串。 |
toTimeString() | 把 Date 對象的時間部分轉換為字符串。 |
toUTCString() | 根據世界時,把 Date 對象轉換為字符串。 |
UTC() | 根據世界時返回 1970 年 1 月 1 日 到指定日期的毫秒數。 |
valueOf() | 返回 Date 對象的原始值。 |
3、字符串
字符串是一組由16位值組成的不可變的有序序列,每個字符通常來自於Unicode字符集。JavaScript通過字符串類型來表示文本。字符串的長度是其所含16位值的個數。JavaScript字符串的索引從0開始。第一個字符的位置使0,第二個位置使1,以此類推。JavaScript中的字符串由單引號或雙引號括起來。單引號定界的字符串中可以包含雙引號,由雙引號定界的字符串中也可以包含單引號。
在ECMAScript3中,字符串必須寫在一行中,而在EXMAScript5中,字符串可以拆分成數行,每行必須以反斜線(\)結束,反斜線和行結束符都不算是字符串的內容。可使用“\n”進行換行。
var a = "Hello world haha"
字符串常用方法:
方法 | 描述 |
---|---|
charAt() | 返回指定索引位置的字符 |
charCodeAt() | 返回指定索引位置字符的 Unicode 值 |
concat() | 連接兩個或多個字符串,返回連接後的字符串 |
fromCharCode() | 將 Unicode 轉換為字符串 |
indexOf() | 返回字符串中檢索指定字符第一次出現的位置 |
lastIndexOf() | 返回字符串中檢索指定字符最後一次出現的位置 |
localeCompare() | 用本地特定的順序來比較兩個字符串 |
match() | 找到一個或多個正則表達式的匹配 |
replace() | 替換與正則表達式匹配的子串 |
search() | 檢索與正則表達式相匹配的值 |
slice() | 提取字符串的片斷,並在新的字符串中返回被提取的部分 |
split() | 把字符串分割為子字符串數組 |
substr() | 從起始索引號提取字符串中指定數目的字符 |
substring() | 提取字符串中兩個指定的索引號之間的字符 |
toLocaleLowerCase() | 根據主機的語言環境把字符串轉換為小寫,只有幾種語言(如土耳其語)具有地方特有的大小寫映射 |
toLocaleUpperCase() | 根據主機的語言環境把字符串轉換為大寫,只有幾種語言(如土耳其語)具有地方特有的大小寫映射 |
toLowerCase() | 把字符串轉換為小寫 |
toString() | 返回字符串對象值 |
toUpperCase() | 把字符串轉換為大寫 |
trim() | 移除字符串首尾空白 |
valueOf() | 返回某個字符串對象的原始值 |
4、轉義符
反斜線(\)有著特殊的用途,反斜線後加一個字符就不再表示字符本身了,而代表其它意義。下面是常見的轉義字符。
義字符 | 意義 | ASCII碼值(十進制) |
\a | 響鈴(BEL) | 007 |
\b | 退格(BS) ,將當前位置移到前一列 | 008 |
\f | 換頁(FF),將當前位置移到下頁開頭 | 012 |
\n | 換行(LF) ,將當前位置移到下一行開頭 | 010 |
\r | 回車(CR) ,將當前位置移到本行開頭 | 013 |
\t | 水平制表(HT) (跳到下一個TAB位置) | 009 |
\v | 垂直制表(VT) | 011 |
\\ | 代表一個反斜線字符‘‘\‘ | 092 |
\‘ | 代表一個單引號(撇號)字符 | 039 |
\" | 代表一個雙引號字符 | 034 |
\? | 代表一個問號 | 063 |
\0 | 空字符(NUL) | 000 |
\ddd | 1到3位八進制數所代表的任意字符 | 三位八進制 |
\xhh | 1到2位十六進制所代表的任意字符 | 十六進制 |
JavaScript(二)數據類型