JS里的數(shù)據(jù)類型主要分為兩大類纺阔。
- 基本類型
- 字符串(string)
- 數(shù)字(number)
- 布爾值(boolean)
- null
- undefined
- 符號(hào)(symbol)
- 復(fù)雜類型
- 對(duì)象(object)包括對(duì)象逗载,數(shù)組,函數(shù)都屬于對(duì)象。
一共有七種,在這里介紹除了符號(hào)外的所有類型。
字符串
只要放在單引號(hào)或雙引號(hào)中的字符就是字符串铐刘,在字符串內(nèi)部如果要使用引號(hào),就必須和外層引號(hào)不同影晓,例如一下表示都是合法的镰吵。
'key = "value"'
"It's a long journey"
另外也可以使用轉(zhuǎn)義符。
'Did she say \'Hello\'?'
// "Did she say 'Hello'?"
"Did she say \"Hello\"?"
// "Did she say "Hello"?"
如果要想多個(gè)單行字符串連接可用+號(hào)挂签,這也是字符串換行連接的推薦方式疤祭。
var longString = 'Long '
+ 'long '
+ 'long '
+ 'string';
要表示特殊字符就需要使用轉(zhuǎn)義符,主要使用的有一下幾個(gè)饵婆。
- \0 :null(\u0000)
- \b :后退鍵(\u0008)
- \f :換頁(yè)符(\u000C)
- \n :換行符(\u000A)
- \r :回車鍵(\u000D)
- \t :制表符(\u0009)
- \v :垂直制表符(\u000B)
- ' :?jiǎn)我?hào)(\u0027)
- " :雙引號(hào)(\u0022)
- \ :反斜杠(\u005C)
其他類型要轉(zhuǎn)換為字符串可以使用加空字符串的方法xxx + ''
勺馆。
數(shù)字
JS中所有數(shù)字都是用64位浮點(diǎn)數(shù)的形式存儲(chǔ)的,所以在其底層并沒(méi)有整數(shù)侨核,只有小數(shù)草穆。而浮點(diǎn)數(shù)的表示并不精確,會(huì)出現(xiàn)以下情況搓译,需特別小心悲柱。
0.1 + 0.2 === 0.3
// false
0.3 / 0.1
// 2.9999999999999996
(0.3 - 0.2) === (0.2 - 0.1)
// false
JS能夠表示的數(shù)值范圍為21024到2-1023(開(kāi)區(qū)間),超出這個(gè)范圍的數(shù)無(wú)法表示些己。在使用時(shí)豌鸡,如果超出最大值,回發(fā)生‘正向溢出’段标。小于最小值時(shí)涯冠,會(huì)發(fā)生‘負(fù)向溢出’。
Math.pow(2, 1024) // Infinity
Math.pow(2, -1075) // 0
JavaScript 提供Number對(duì)象的MAX_VALUE和MIN_VALUE屬性逼庞,返回可以表示的具體的最大值和最小值蛇更。
Number.MAX_VALUE // 1.7976931348623157e+308
Number.MIN_VALUE // 5e-324
其他數(shù)據(jù)類型如果想轉(zhuǎn)換為數(shù)字,可使用減零的方式xxx - 0(如果該數(shù)據(jù)可以轉(zhuǎn)換為數(shù)字的話)。
布爾值
布爾值只有兩個(gè)true
和false
械荷,在條件表達(dá)式中共耍,會(huì)將表達(dá)式轉(zhuǎn)換為布爾值,以進(jìn)行下一步操作吨瞎。除了以下六個(gè)falsy值外,其它一切轉(zhuǎn)換為布爾值都為true
穆咐。
- 數(shù)字
0
NaN
null
undefined
- 空字符串
''
- 布爾值
false
要將其它值轉(zhuǎn)換為布爾值可使用雙重取反!!xxx
颤诀。
null和undefined
這兩個(gè)類型基本沒(méi)什么區(qū)別,如果一個(gè)變量聲明了而沒(méi)有賦值对湃,則會(huì)自動(dòng)賦值為undefined
崖叫。慣例來(lái)說(shuō),如果一個(gè)變量打算賦值為對(duì)象拍柒,而暫時(shí)還未賦值心傀,則會(huì)先賦值為null
。
另外拆讯,在轉(zhuǎn)換為數(shù)字時(shí)脂男,null
會(huì)轉(zhuǎn)換為0,而undefined
則會(huì)轉(zhuǎn)換為NaN
种呐。
對(duì)象
對(duì)象包括普通對(duì)象宰翅,數(shù)組以及函數(shù)。
var obj = {
foo: 'Hello',
bar: 'World'
};
var array = [1, 2, 3];
function fun() {}
對(duì)象的鍵名都是字符串爽室,可以直接使用數(shù)字汁讼,JS會(huì)在后臺(tái)自動(dòng)轉(zhuǎn)換為字符串。
可以使用Object.keys(obj)
查看對(duì)象的屬性阔墩。使用delete
操作符可以刪除對(duì)象的屬性嘿架,返回true
。注意啸箫,刪除一個(gè)不存在的屬性耸彪,delete
不報(bào)錯(cuò),而且返回true
筐高。
var obj = { p: 1 };
Object.keys(obj) // ["p"]
delete obj.p // true
obj.p // undefined
Object.keys(obj) // []
var obj = {};
delete obj.p // true
只有一種情況搜囱,delete
命令會(huì)返回false
,那就是該屬性存在柑土,且不得刪除蜀肘。
in
運(yùn)算符用于檢查對(duì)象是否包含某個(gè)屬性(注意,檢查的是鍵名稽屏,不是鍵值)扮宠,如果包含就返回true
,否則返回false
。
var obj = { p: 1 };
'p' in obj // true
'toString' in obj // true
in
運(yùn)算符的一個(gè)問(wèn)題是坛增,它不能識(shí)別哪些屬性是對(duì)象自身的获雕,哪些屬性是繼承的。就像上面代碼中收捣,對(duì)象obj
本身并沒(méi)有toString
屬性届案,但是in
運(yùn)算符會(huì)返回true
,因?yàn)檫@個(gè)屬性是繼承的罢艾。
for...in
循環(huán)可用來(lái)遍歷對(duì)象屬性(可枚舉屬性)楣颠,包括繼承的。JS內(nèi)建屬性和方法都不可枚舉咐蚯。
var obj = {a: 1, b: 2, c: 3};
for (var i in obj) {
console.log('鍵名:', i);
console.log('鍵值:', obj[i]);
}
// 鍵名: a
// 鍵值: 1
// 鍵名: b
// 鍵值: 2
// 鍵名: c
// 鍵值: 3
復(fù)雜類型和基本類型最大的區(qū)別就是在存儲(chǔ)上面童漩。基本類型的賦值都是使用拷貝春锋,即改變賦值并不會(huì)影響另一個(gè)變量矫膨。而對(duì)象使用的是引用賦值,拷貝給聲明的只是同一個(gè)內(nèi)存地址期奔,當(dāng)改變了對(duì)象的內(nèi)容侧馅,會(huì)影響另外的指向同一內(nèi)存地址的變量。
typeof
使用typeof
操作符檢查變量類型能庆。
typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"
function f() {}
typeof f // "function"
typeof undefined // "undefined"
typeof window // "object"
typeof {} // "object"
typeof [] // "object"
typeof null // "object"
typeof /([a-z])/ //"object"
其中需要注意的是施禾,普通對(duì)象,數(shù)組搁胆,null以及正則表達(dá)式都會(huì)返回"object"
弥搞。