ECMAScript
的數(shù)據(jù)類型:
- 5種簡(jiǎn)單數(shù)據(jù)類型:
Undefined
诱告、Null
恒削、Boolean
羡藐、Number
、String
- 1種復(fù)雜數(shù)據(jù)類型:
Object
(一)typeof
操作符
typeof
操作符用來檢測(cè)給定變量的數(shù)據(jù)類型,對(duì)一個(gè)值使用 typeof
操作符可能返回下列某個(gè)字符串:
-
"undefined"
—— 如果這個(gè)值未定義亥啦; -
"boolean"
—— 如果這個(gè)值是布爾值炭剪; -
"string"
—— 如果這個(gè)值是字符串; -
"number"
—— 如果這個(gè)值是數(shù)值翔脱; -
"object"
—— 如果這個(gè)值是對(duì)象或null
奴拦; -
"function"
—— 如果這個(gè)值是函數(shù)。
var b;
console.log(typeof b); //'undefined'
console.log(typeof a); //'undefined'
console.log(typeof(true)); //'boolean'
console.log(typeof '123'); //'string'
console.log(typeof 123); //'number'
console.log(typeof NaN); //'number'
console.log(typeof null); //'object'
var obj = new String();
console.log(typeof(obj)); //'object'
var fn = function(){};
console.log(typeof(fn)); //'function'
console.log(typeof(class c{})); //'function'
(二)Undefined
類型
-
Undefined
類型只有一個(gè)值届吁,即特殊的undefined
错妖; - 在使用
var
聲明變量但未對(duì)其加以初始化時(shí), 這個(gè)變量的值就是undefined
疚沐;
var message;
alert(message == undefined); //true
// 上面與下面等價(jià)
var message = undefined;
alert(message == undefined); //true
- 包含
undefined
值的變量與尚未定義的變量用typeof
操作符時(shí)都返回undefined
暂氯,但還是不一樣的:
var message; // 這個(gè)變量聲明之后默認(rèn)取得了 undefined 值
// 下面這個(gè)變量并沒有聲明
// var age
alert(typeof message); // "undefined"
alert(typeof age); // "undefined"
alert(message); // "undefined"
alert(age); // 產(chǎn)生錯(cuò)誤
(三)Null
類型
-
Null
類型只有一個(gè)值,這個(gè)特殊的值是null
濒旦; -
null
值表示一個(gè)空對(duì)象指針株旷,而這也正是使用typeof
操作符檢測(cè)null
值時(shí)會(huì)返回"object"
的原因再登;
var car = null;
alert(typeof car); // "object"
- 如果定義的變量準(zhǔn)備在將來用于保存對(duì)象尔邓,那么最好將該變量初始化為
null
而不是其他值。這樣 一來锉矢,只要直接檢查null
值就可以知道相應(yīng)的變量是否已經(jīng)保存了一個(gè)對(duì)象的引用了梯嗽;
if (car != null){
// 對(duì) car 對(duì)象執(zhí)行某些操作 }
-
undefined
值是派生自null
值的,因此ECMA-262
規(guī)定對(duì)它們的相等性測(cè)試要返回true
沽损。
alert(null == undefined); //true
alert(null === undefined); //false
(四)Boolean
類型
-
Boolean
類型只有兩個(gè)字面值:true
和false
灯节; -
true
和false
這兩個(gè)值與數(shù)字值不是一回事,因此true
不一定等于 1绵估,而false
也不一定等于 0炎疆;
// == 會(huì)把比較的二者進(jìn)行類型轉(zhuǎn)換:
0 == false; // true, 會(huì)把0轉(zhuǎn)成bool值進(jìn)行比較
1 == true; // true, 同樣把1轉(zhuǎn)成bool值再和true進(jìn)行比較
// === 是不會(huì)把比較的二者進(jìn)行類型轉(zhuǎn)換,是string就是string国裳,是number就是number
0 === false; // false, 因?yàn)?是number形入,false是boolean,兩者就肯定不相等
1 === true; // false
- 任何數(shù)據(jù)類型轉(zhuǎn)換為
Boolean
值 ——Boolean()
函數(shù)
可以對(duì)任何數(shù)據(jù)類型的值調(diào)用 Boolean()
函數(shù)缝左,而且總會(huì)返回一個(gè) Boolean
值亿遂。至于返回的 這個(gè)值是true
還是false
,取決于要轉(zhuǎn)換值的數(shù)據(jù)類型及其實(shí)際值渺杉。
數(shù)據(jù)類型 | 轉(zhuǎn)換為true的值 | 轉(zhuǎn)換為false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | ""(空字符串) |
Number | 任何非零數(shù)字值(包括無窮大) | 0和NaN |
Object | 任何對(duì)象 | null |
Undefined | 不適用 | undefined |
轉(zhuǎn)換規(guī)則對(duì)理解流控制語句(如 if
語句)自動(dòng)執(zhí)行相應(yīng)的 Boolean
轉(zhuǎn)換非常重要蛇数。
(五)Number
類型
- 數(shù)值字面量格式
- 十進(jìn)制(數(shù)字序列
0~9
) - 八進(jìn)制(以
0
開頭,以8為基數(shù)是越,數(shù)字序列0~7
) - 十六進(jìn)制(以
0x
開頭耳舅,以16為基數(shù),0~9
及A~F
)
var intNum = 55; // 十進(jìn)制整數(shù)
var octalNum1 = 070; // 八進(jìn)制的 56
var octalNum2 = 079; // 無效的八進(jìn)制數(shù)值——解析為 79
var octalNum3 = 08; // 無效的八進(jìn)制數(shù)值——解析為 8
var hexNum1 = 0xA; // 十六進(jìn)制的 10
var hexNum2 = 0x1f; // 十六進(jìn)制的 31
- 浮點(diǎn)數(shù)值
- 浮點(diǎn)數(shù)值倚评,就是該數(shù)值中必須包含一個(gè)小數(shù)點(diǎn)浦徊,并且小數(shù)點(diǎn)后面必須至少有一位數(shù)字绍赛;
- 浮點(diǎn)數(shù)值需要的內(nèi)存空間是保存整數(shù)值的兩倍;
- 對(duì)于那些極大或極小的數(shù)值辑畦,可以用
e
表示法(即科學(xué)計(jì)數(shù)法)表示的浮點(diǎn)數(shù)值表示; - 浮點(diǎn)數(shù)值的最高精度是
17
位小數(shù)吗蚌,但在進(jìn)行算術(shù)計(jì)算時(shí)其精確度遠(yuǎn)遠(yuǎn)不如整數(shù)。因此纯出,永遠(yuǎn)不 要測(cè)試某個(gè)特定的浮點(diǎn)數(shù)值蚯妇。
var a = 0.1, b = 0.2;
if (a + b == 0.3){ // 不要做這樣的測(cè)試!
alert("You got 0.3.");
}
console.log(a + b == 0.3); // false
// 0.1 加 0.2 的結(jié)果不是 0.3暂筝,而是 0.30000000000000004
- 數(shù)值范圍
(1)ECMAScript
能夠表示的數(shù)值范圍:Number.MIN_VALUE
~ Number.MAX_VALUE
(5e-324 ~ 1.7976931348623157e+308)
(2)預(yù)定的Number
特殊值:
-
-Infinity
(負(fù)無窮) -
Infinity
(正無窮) -
NaN
(非數(shù)值)
console.log(1/0); // Infinity
console.log(-1/0); // -Infinity
console.log(Number.NEGATIVE_INFINITY); // -Infinity
console.log(Number.POSITIVE_INFINITY); // Infinity
console.log(0/0); // NaN
console.log(Infinity/0); // Infinity
console.log(Infinity/-0); // -Infinity
console.log(Infinity/Infinity); // NaN
console.log(1/Infinity); // 0
console.log(-1/Infinity); // -0
由于-Infinity
箩言、Infinity
、 NaN
是預(yù)定的Number
特殊值焕襟,所以都屬于Number
類型陨收。
console.log(-Infinity); // "number"
console.log(Infinity); // "number"
console.log(NaN); // "number"
(3)isFinite()
函數(shù) - 確定一個(gè)數(shù)值是不是有窮的
var result = Number.MAX_VALUE + Number.MAX_VALUE;
alert(isFinite(result)); //false
console.log(isFinite(Infinity)); // false
console.log(isFinite(-Infinity)); // false
console.log(isFinite(NaN)); // false
NaN
(1)NaN
,即非數(shù)值(Not a Number
)是一個(gè)特殊的數(shù)值鸵赖,這個(gè)數(shù)值用于表示一個(gè)本來要返回?cái)?shù)值的操作數(shù) 未返回?cái)?shù)值的情況(這樣就不會(huì)拋出錯(cuò)誤了)务漩。
(2)NaN
兩個(gè)非同尋常的特點(diǎn)
-
任何涉及
NaN
的操作(例如NaN/10
)都會(huì)返回NaN
; -
NaN
與任何值都不相等它褪,包括NaN
本身饵骨。
console.log(NaN/10); // NaN
alert(NaN == NaN); //false
(3)isNaN()
函數(shù)
isNaN()
函數(shù)接受一個(gè)參數(shù),該參數(shù)可以 是任何類型茫打,而函數(shù)會(huì)幫我們確定這個(gè)參數(shù)是否“不是數(shù)值”居触。isNaN()
在接收到一個(gè)值之后,會(huì)嘗試將這個(gè)值轉(zhuǎn)換為數(shù)值老赤。而任何不能被轉(zhuǎn)換為數(shù)值的值都會(huì)導(dǎo)致這個(gè)函數(shù)返回 true
轮洋。
alert(isNaN(NaN)); //true
alert(isNaN(10)); //false(10 是一個(gè)數(shù)值)
alert(isNaN("10")); //false(可以被轉(zhuǎn)換成數(shù)值 10)
alert(isNaN("blue")); //true(不能轉(zhuǎn)換成數(shù)值)
alert(isNaN(true)); //false(可以被轉(zhuǎn)換成數(shù)值 1)
在基于對(duì)象調(diào)用 isNaN()
函數(shù)時(shí),會(huì)首先調(diào)用對(duì)象的 valueOf()
方法抬旺,然后確定該方法返回的值是否可以轉(zhuǎn) 換為數(shù)值弊予。如果不能,則基于這個(gè)返回值再調(diào)用 toString()
方法嚷狞,再測(cè)試返回值块促。
- 數(shù)值轉(zhuǎn)換
有 3 個(gè)函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值:Number()
、parseInt()
和 parseFloat()
床未。
(1)Number()
可以用于任何數(shù)據(jù)類型竭翠,轉(zhuǎn)換規(guī)則如下:
- 如果是
Boolean
值,true
和false
將分別被轉(zhuǎn)換為1
和0
薇搁。 - 如果是數(shù)字值斋扰,只是簡(jiǎn)單的傳入和返回。
- 如果是
null
值,返回0
传货。 - 如果是
undefined
屎鳍,返回NaN
。 - 如果是字符串问裕,遵循下列規(guī)則:
- 如果字符串中只包含數(shù)字(包括前面帶正號(hào)或負(fù)號(hào)的情況)逮壁,則將其轉(zhuǎn)換為十進(jìn)制數(shù)值,即
"1"
會(huì)變成1
粮宛,"123"
會(huì)變成123
窥淆,而"011"
會(huì)變成11
(注意:前導(dǎo)的零被忽略了); - 如果字符串中包含有效的浮點(diǎn)格式巍杈,如
"1.1"
忧饭,則將其轉(zhuǎn)換為對(duì)應(yīng)的浮點(diǎn)數(shù)值(同樣,也會(huì)忽 略前導(dǎo)零)筷畦; - 如果字符串中包含有效的十六進(jìn)制格式词裤,例如
"0xf"
,則將其轉(zhuǎn)換為相同大小的十進(jìn)制整數(shù)值鳖宾; - 如果字符串是空的(不包含任何字符)吼砂,則將其轉(zhuǎn)換為
0
; - 如果字符串中包含除上述格式之外的字符攘滩,則將其轉(zhuǎn)換為
NaN
帅刊。
- 如果字符串中只包含數(shù)字(包括前面帶正號(hào)或負(fù)號(hào)的情況)逮壁,則將其轉(zhuǎn)換為十進(jìn)制數(shù)值,即
- 如果是對(duì)象,則調(diào)用對(duì)象的
valueOf()
方法漂问,然后依照前面的規(guī)則轉(zhuǎn)換返回的值。如果轉(zhuǎn)換的結(jié)果是NaN
女揭,則調(diào)用對(duì)象的toString()
方法蚤假,然后再次依照前面的規(guī)則轉(zhuǎn)換返回的字符串值。
var num1 = Number("Hello world!"); // NaN
var num2 = Number(""); // 0
var num3 = Number("000011"); // 11
var num4 = Number(true); // 1
var num5 = Number("11abc"); // NaN
var num6 = Number(null); // 0
var num7 = Number(undefined); // NaN
(2)parseInt()
函數(shù) —— 在處理整數(shù)的時(shí)候更常用
在轉(zhuǎn)換字符串時(shí)吧兔,更多的時(shí)看其是否符合數(shù)值模式磷仰。會(huì)忽略字符串前面的空格,直至找到第一個(gè)非空格字符境蔼。
-
parseInt()
的返回值只有兩種可能灶平,不是一個(gè)十進(jìn)制整數(shù),就是NaN
箍土; - 如果
parseInt()
的參數(shù)不是字符串逢享,則會(huì)先轉(zhuǎn)為字符串再轉(zhuǎn)換; - 如果第一個(gè)字符不是數(shù)字字符或者負(fù)號(hào)吴藻,
parseInt()
就會(huì)返回NaN
瞒爬,也就是說,用parseInt()
轉(zhuǎn)換空字符串會(huì)返回NaN
(Number()
對(duì)空字符返回0
); - 如果第一個(gè)字符是數(shù)字字符侧但,
parseInt()
會(huì)繼續(xù)解析第二個(gè)字符矢空,直到解析完所有后續(xù)字符或者遇到了一個(gè)非數(shù)字字符。 - 如果字符串以
"0x"
開頭且后跟數(shù)字字符禀横,就會(huì)將其當(dāng)作一個(gè)十六進(jìn)制整數(shù)屁药; - 如果字符串以
"0"
開頭且后跟數(shù)字字符,就會(huì)將其當(dāng)作一個(gè)八進(jìn)制整數(shù)柏锄; -
parseInt()
函數(shù)增加了第二參數(shù)(2
到36
之間)者祖,用于指定轉(zhuǎn)換時(shí)使用的基數(shù)(即多少進(jìn)制)。
var num = parseInt("blue1234"); // NaN
var num1 = parseInt("1234blue"); // 1234
var num2 = parseInt(""); // NaN
var num3 = parseInt("0xA"); // 10(十六進(jìn)制數(shù))
var num4 = parseInt(22.5); // 22
var num6 = parseInt("70"); // 70(十進(jìn)制數(shù))
var num7 = parseInt("0xf"); // 15(十六進(jìn)制數(shù))
// 在使用 parseInt()解析像八進(jìn)制字面量的字符串時(shí)绢彤,ECMAScript 3 和 5 存在分歧七问。
// ECMAScript 3 認(rèn)為是 56(八進(jìn)制),ECMAScript 5 認(rèn)為是 70(十進(jìn)制)
var num8 = parseInt("070"); // 70
// 使用第二個(gè)參數(shù)指定轉(zhuǎn)換時(shí)使用的基數(shù)就不會(huì)出現(xiàn)分歧了
var num9 = parseInt("070", 8); // 56 (指定轉(zhuǎn)換時(shí)以8為基數(shù))
(3)parseFloat()
函數(shù)
-
parseFloat()
也是從第一個(gè)字符(位置 0)開始解析每個(gè)字符茫舶。而且 也是一直解析到字符串末尾械巡,或者解析到遇見一個(gè)無效的浮點(diǎn)數(shù)字字符為止; - 始終都會(huì)忽略前導(dǎo)的零饶氏;
-
parseFloat()
只解析十進(jìn)制值讥耗,因此它沒有用第二個(gè)參數(shù)指定基數(shù)的用法; - 十六進(jìn)制格式的字符串則始終會(huì)被轉(zhuǎn)換成
0
疹启; - 如果字符串包含的是一個(gè)可解析為整數(shù)的數(shù)(沒有小數(shù)點(diǎn)古程,或者小數(shù)點(diǎn)后 都是零),
parseFloat()
會(huì)返回整數(shù)喊崖。
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
(4) Number()
和parseInt()
的區(qū)別
當(dāng)轉(zhuǎn)換的內(nèi)容包含非數(shù)字的時(shí)候挣磨,Number()
會(huì)返回NaN
(Not a Number
);
parseInt()
要看情況荤懂,如果以數(shù)字開頭茁裙,就會(huì)返回開頭的合法數(shù)字部分,如果以非數(shù)字開頭节仿,則返回NaN
晤锥。
// 空字符串時(shí)
var num1 = Number(""); // 0
var num2 = parseInt(""); // NaN
// 以數(shù)字開頭時(shí)
var num3 = Number("1234blue"); // NaN
var num4 = parseInt("1234blue"); // 1234
// 以非數(shù)字開頭時(shí)
var num5 = Number("blue1234"); // NaN
var num6 = parseInt("blue1234"); // NaN
(六)String
類型
字符串可以由雙 引號(hào)(")或單引號(hào)(')表示,用雙引號(hào)表示的字符串和用單引號(hào)表示的字符串完全相同廊宪。
-
字符字面量
String
數(shù)據(jù)類型包含一些特殊的字符字面量矾瘾,也叫轉(zhuǎn)義序列,用于表示非打印字符箭启,或者具有其他用途的字符壕翩。這些字符字面量如下所示:
字面量 | 含義 |
---|---|
\n | 換行 |
\t | 制表 |
\b | 空格 |
\r | 回車 |
\f | 進(jìn)紙 |
\ | 斜杠 |
' | 單引號(hào)('),在用單引號(hào)表示的字符串中使用册烈。例如:'He said, 'hey.'' |
" | 雙引號(hào)(")戈泼,在用雙引號(hào)表示的字符串中使用婿禽。例如:"He said, "hey."" |
\xnn | 以十六進(jìn)制代碼nn表示的一個(gè)字符(其中n為0~F)。例如大猛,\x41表示"A" |
\unnnn | 以十六進(jìn)制代碼nnnn表示的一個(gè)Unicode字符(其中n為0~F)扭倾。例如,\u03a3表示希臘字符Σ |
- 字符串的特點(diǎn)
ECMAScript
中的字符串是不可變的挽绩,也就是說膛壹,字符串一旦創(chuàng)建,它們的值就不能改變唉堪。要改變 某個(gè)變量保存的字符串模聋,首先要銷毀原來的字符串,然后再用另一個(gè)包含新值的字符串填充該變量唠亚。
var lang = "Java";
lang = lang + "Script";
// 首先創(chuàng)建一個(gè)能容納 10 個(gè)字符的新字符串;
// 然后在這個(gè)字符串中填充"Java"和"Script";
// 最后一步是銷毀原來的字符串"Java"和字符串"Script"链方,因?yàn)檫@兩個(gè)字符串已經(jīng)沒用了。
- 轉(zhuǎn)換為字符串
(1)toString()
方法
數(shù)值灶搜、布爾值祟蚀、對(duì)象和字符串值都有 toString()
方法,但 null
和 undefined
值沒有這個(gè)方法割卖。
var age = 11;
var ageAsString = age.toString(); // 字符串"11"
(2)轉(zhuǎn)型函數(shù) String()
轉(zhuǎn)型函數(shù) String()
能夠?qū)⑷魏晤愋偷闹缔D(zhuǎn)換為字符串前酿。String()
函數(shù)遵循下列轉(zhuǎn)換規(guī)則:
- 如果值有
toString()
方法,則調(diào)用該方法(沒有參數(shù))并返回相應(yīng)的結(jié)果鹏溯; - 如果值是
null
罢维,則返回"null"
; - 如果值是
undefined
丙挽,則返回"undefined"
肺孵。
var value;
alert(String(10)); // "10"
alert(String(true)); // "true"
alert(String(null)); // "null"
alert(String(value)); // "undefined"
(七)Object
類型
ECMAScript
中的對(duì)象其實(shí)就是一組數(shù)據(jù)和功能的集合。對(duì)象可以通過執(zhí)行 new
操作符后跟要?jiǎng)?chuàng)建的對(duì)象類型的名稱來創(chuàng)建取试。
- 創(chuàng)建對(duì)象
// 創(chuàng)建 Object 類型的實(shí)例
var o = new Object();
-
Object
的每個(gè)實(shí)例都具有下列屬性和方法
-
constructor
:保存著用于創(chuàng)建當(dāng)前對(duì)象的函數(shù)悬槽。對(duì)于前面的例子而言,構(gòu)造函數(shù)(constructor
) 就是Object()
瞬浓。 -
hasOwnProperty(propertyName)
:用于檢查給定的屬性在當(dāng)前對(duì)象實(shí)例中(而不是在實(shí)例的原型中)是否存在。 -
isPrototypeOf(object)
:函數(shù)用于指示對(duì)象是否存在于另一個(gè)對(duì)象的原型鏈中蓬坡。如果存在猿棉,返回true
,否則返回false
屑咳。 -
propertyIsEnumerable(propertyName)
:用于檢查給定的屬性是否能夠使用for-in
語句 來枚舉萨赁。 -
toLocaleString()
:返回對(duì)象的字符串表示,該字符串與執(zhí)行環(huán)境的地區(qū)對(duì)應(yīng)兆龙。 -
toString()
:返回對(duì)象的字符串表示杖爽。 -
valueOf()
:返回對(duì)象的字符串敲董、數(shù)值或布爾值表示。通常與toString()
方法的返回值相同慰安。