Number類型
這種類型使用IEEE754 格式來表示整數(shù)和浮點數(shù)值(浮點數(shù)值在某些語言中也被稱為雙精度數(shù)值)艺玲。
十進(jìn)制整數(shù):
var intNum = 55; // 整數(shù)
八進(jìn)制:
var octalNum1 = 070; // 八進(jìn)制的56
十六進(jìn)制:
var hexNum1 = 0xA; // 十六進(jìn)制的10
var hexNum2 = 0x1f; // 十六進(jìn)制的31
鑒于JavaScript 中保存數(shù)值的方式沦疾,可以保存正零(+0)和負(fù)零(-0)烘绽。
浮點數(shù)值
var floatNum1 = 1.1;
var floatNum2 = 0.1;
var floatNum3 = .1; // 有效,但不推薦
var floatNum1 = 1.; // 小數(shù)點后面沒有數(shù)字——解析為1
var floatNum2 = 10.0; // 整數(shù)——解析為10
var floatNum = 3.125e7; // 等于31250000
關(guān)于浮點數(shù)值計算會產(chǎn)生舍入誤差的問題冒萄,有一點需要明確:這是使用基于IEEE754 數(shù)值的浮點計算的通病池摧,ECMAScript 并非獨此一家;其他使用相同數(shù)值格式的語言也存在這個問題红伦。
數(shù)值范圍
由于內(nèi)存的限制英古,ECMAScript 并不能保存世界上所有的數(shù)值。
ECMAScript 能夠表示的最小數(shù)值保存在Number.MIN_VALUE 中——在大多數(shù)瀏覽器中昙读,這個值是5e-324召调;
ECMAScript 能夠表示的最大數(shù)值保存在number.MAX_VALUE中——在大多數(shù)瀏覽器中,這個值是.7976931348623157e+308蛮浑。
如果某次計算的結(jié)果得到了一個超出JavaScript 數(shù)值范圍的值唠叛,那么這個數(shù)值將被自動轉(zhuǎn)換成特殊的Infinity 值。具體來說沮稚,如果這個數(shù)值是負(fù)數(shù)艺沼,則會被轉(zhuǎn)換成-Infinity(負(fù)無窮),如果這個數(shù)值是正數(shù)蕴掏,則會被轉(zhuǎn)換成Infinity(正無窮)障般。
要想確定一個數(shù)值是不是有窮的(換句話說,是不是位于最小和最大的數(shù)值之間)盛杰,可以使用isFinite()函數(shù)挽荡。
訪問Number.NEGATIVE_INFINITY 和Number.POSITIVE_INFINITY 也可以得到負(fù)和正Infinity 的值〖垂可以想見徐伐,這兩個屬性中分別保存著-Infinity 和Infinity。
NaN
NaN募狂,即非數(shù)值(Not a Number)是一個特殊的數(shù)值办素,這個數(shù)值用于表示一個本來要返回數(shù)值的操作數(shù)未返回數(shù)值的情況(這樣就不會拋出錯誤了)角雷。例如,在其他編程語言中性穿,任何數(shù)值除以0 都會導(dǎo)致錯誤勺三,從而停止代碼執(zhí)行。但在ECMAScript 中需曾,任何數(shù)值除以0 會返回NaN吗坚,因此不會影響其他代碼的執(zhí)行。
NaN 本身有兩個非同尋常的特點呆万。首先商源,任何涉及NaN 的操作(例如NaN/10)都會返回NaN,這個特點在多步計算中有可能導(dǎo)致問題谋减。其次牡彻,NaN 與任何值都不相等,包括NaN 本身出爹。
``
alert(NaN == NaN); //false
/* 可以使用isNaN()函數(shù)來判斷參數(shù)是否是NaN */
alert(isNaN(NaN)); //true
alert(isNaN(10)); //false(10 是一個數(shù)值)
alert(isNaN("10")); //false(可以被轉(zhuǎn)換成數(shù)值10)
alert(isNaN("blue")); //true(不能轉(zhuǎn)換成數(shù)值)
alert(isNaN(true)); //false(可以被轉(zhuǎn)換成數(shù)值1)
``
在基于對象調(diào)用isNaN()函數(shù)時庄吼,會首先調(diào)用對象的valueOf()方法,然后確定該方法返回的值是否可以轉(zhuǎn)換為數(shù)值严就。如果不能总寻,則基于這個返回值再調(diào)用toString()方法,再測試返回值梢为。而這個過程也是ECMAScript 中內(nèi)置函數(shù)和操作符的一般執(zhí)行流程渐行。
數(shù)值轉(zhuǎn)換
有3 個函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值:Number()、parseInt()和parseFloat()铸董。
Number()
var num1 = Number("Hello world!"); //NaN
var num2 = Number(""); //0
var num3 = Number("000011"); //11
var num4 = Number(true); //1
*由于Number()函數(shù)在轉(zhuǎn)換字符串時比較復(fù)雜而且不夠合理祟印,因此在處理整數(shù)的時候更常用的是parseInt()函數(shù)。
parseInt()
var num1 = parseInt("1234blue"); // 1234
var num2 = parseInt(""); // NaN
var num3 = parseInt("0xA"); // 10(十六進(jìn)制數(shù))
var num4 = parseInt(22.5); // 22
var num5 = parseInt("070"); // 56(八進(jìn)制數(shù))
var num6 = parseInt("70"); // 70(十進(jìn)制數(shù))
var num7 = parseInt("0xf"); // 15(十六進(jìn)制數(shù))
在ECMAScript 3 JavaScript 引擎中袒炉,"070"被當(dāng)成八進(jìn)制字面量,因此轉(zhuǎn)換后的值是十進(jìn)制的56樊零。而在ECMAScript 5 JavaScript 引擎中我磁,parseInt()已經(jīng)不具有解析八進(jìn)制值的能力,因此前導(dǎo)的零會被認(rèn)為無效驻襟,從而將這個值當(dāng)成"70"夺艰,結(jié)果就得到十進(jìn)制的70。在ECMAScript 5 中沉衣,即使是在非嚴(yán)格模式下也會如此郁副。為了消除在使用parseInt()函數(shù)時可能導(dǎo)致的上述困惑,可以為這個函數(shù)提供第二個參數(shù):轉(zhuǎn)換時使用的基數(shù)(即多少進(jìn)制)豌习。如果知道要解析的值是十六進(jìn)制格式的字符串存谎,那么指定基數(shù)16 作為第二個參數(shù)拔疚,可以保證得到正確的結(jié)果。
var num1 = parseInt("AF", 16); //175
var num2 = parseInt("AF"); //NaN
var num1 = parseInt("10", 2); //2 (按二進(jìn)制解析)
var num2 = parseInt("10", 8); //8 (按八進(jìn)制解析)
var num3 = parseInt("10", 10); //10 (按十進(jìn)制解析)
var num4 = parseInt("10", 16); //16 (按十六進(jìn)制解析)
/* 多數(shù)情況下既荚,我們要解析的都是十進(jìn)制數(shù)值稚失,因此始終將10 作為第二個參數(shù)是非常必要的。 */
parseFloat()
parseFlaot與parseInt非常類似恰聘。
var num1 = parseFloat("1234blue"); //1234 (整數(shù))
var num2 = parseFloat("0xA"); //0
var num3 = parseFloat("22.5"); //22.5
var num4 = parseFloat("22.34.5"); //22.34
var num5 = parseFloat("0908.5"); //908.5
var num6 = parseFloat("3.125e7"); //31250000
String類型
String 類型用于表示由零或多個16 位Unicode 字符組成的字符序列句各,即字符串。字符串可以由雙引號(")或單引號(')表示晴叨。
表示方法:
var firstName = "Nicholas";
var lastName = 'Zakas';
與PHP 中的雙引號和單引號會影響對字符串的解釋方式不同凿宾,ECMAScript 中的這兩種語法形式?jīng)]有什么區(qū)別。
字符字面量
String 數(shù)據(jù)類型包含一些特殊的字符字面量兼蕊,也叫轉(zhuǎn)義序列初厚,用于表示非打印字符,或者具有其他用途的字符遍略。
字面量 | 含義 |
---|---|
\n | 換行 |
\t | 制表 |
\b | 空格 |
\r | 回車 |
\f | 進(jìn)紙(走紙換紙) |
\ | 斜杠 |
' | 單引號(')惧所,在用單引號表示的字符串中使用。 |
" | 雙引號(")绪杏,在用雙引號表示的字符串中使用下愈。 |
\Xnn | 以十六進(jìn)制代碼nn表示的一個字符(其中n為0~F)。例如蕾久,\x41表示"A"势似。 |
\Unnnn | 以十六進(jìn)制代碼nnnn表示的一個Unicode字符(其中n為0~F)。例如僧著,\u03a3表示希臘字符Σ履因。 |
字符串的特點
ECMAScript 中的字符串是不可變的,也就是說盹愚,字符串一旦創(chuàng)建栅迄,它們的值就不能改變。要改變某個變量保存的字符串皆怕,首先要銷毀原來的字符串毅舆,然后再用另一個包含新值的字符串填充該變量。
舉個栗子
var lang = "Java";
lang = lang + "Script";
以上示例中的變量lang 開始時包含字符串"Java"愈腾。而第二行代碼把lang 的值重新定義為"Java"與"Script"的組合憋活,即"JavaScript"。實現(xiàn)這個操作的過程如下:首先創(chuàng)建一個能容納10 個字符的新字符串虱黄,然后在這個字符串中填充"Java"和"Script"悦即,最后一步是銷毀原來的字符串"Java"和字符串"Script",因為這兩個字符串已經(jīng)沒用了。這個過程是在后臺發(fā)生的辜梳。
轉(zhuǎn)換為字符串
要把一個值轉(zhuǎn)換為一個字符串有兩種方式:
第一種是使用幾乎每個值都有的toString()方法粱甫;
第二種是使用轉(zhuǎn)型函數(shù)String()。
var age = 11;
var ageAsString = age.toString(); // 字符串"11"
var found = true;
var foundAsString = found.toString(); // 字符串"true"
/* toString()可以輸出以二進(jìn)制冗美、八進(jìn)制魔种、十六進(jìn)制,乃至其他任意有效進(jìn)制格式表示的字符串值 */
var num = 10;
alert(num.toString()); // "10"
alert(num.toString(2)); // "1010"
alert(num.toString(8)); // "12"
alert(num.toString(10)); // "10"
alert(num.toString(16)); // "a"
/*
使用轉(zhuǎn)型函數(shù)String()
*如果值有toString()方法粉洼,則調(diào)用該方法(沒有參數(shù))并返回相應(yīng)的結(jié)果节预;
*如果值是null,則返回"null"属韧;
*如果值是undefined安拟,則返回"undefined"。
*/
var value1 = 10;
var value2 = true;
var value3 = null;
var value4;
alert(String(value1)); // "10"
alert(String(value2)); // "true"
alert(String(value3)); // "null"
alert(String(value4)); // "undefined"