JS 里的數(shù)據(jù)類型
JavaScript 的數(shù)據(jù)類型,有7種。
1,數(shù)值(number)
2,字符串(string)
3,布爾值(boolean)
4,符號(hào)(symbol)
5,undefined
6,null
7,對(duì)象(object)
數(shù)值(number)
1.1 整點(diǎn)和浮點(diǎn)數(shù)
JavaScript 語(yǔ)言的底層根本沒(méi)有整數(shù),所有數(shù)字都是小數(shù)(64位浮點(diǎn)數(shù))由于浮點(diǎn)數(shù)不是精確的值,所以涉及小數(shù)的比較和運(yùn)算要特別小心。
1.2 數(shù)值精度
根據(jù)國(guó)際標(biāo)準(zhǔn) IEEE 754,JavaScript 浮點(diǎn)數(shù)的64個(gè)二進(jìn)制位,從最左邊開始,是這樣組成的。
第1位:符號(hào)位,0表示正數(shù),1表示負(fù)數(shù)
第2位到第12位(共11位):指數(shù)部分
第13位到第64位(共52位):小數(shù)部分(即有效數(shù)字)
符號(hào)位決定了一個(gè)數(shù)的正負(fù),指數(shù)部分決定了數(shù)值的大小,小數(shù)部分決定了數(shù)值的精度。
1.3 數(shù)值范圍
根據(jù)標(biāo)準(zhǔn),64位浮點(diǎn)數(shù)的指數(shù)部分的長(zhǎng)度是11個(gè)二進(jìn)制位,意味著指數(shù)部分的最大值是2047(2的11次方減1)也就是說(shuō),64位浮點(diǎn)數(shù)的指數(shù)部分的值最大為2047,分出一半表示負(fù)數(shù),則 JavaScript 能夠表示的數(shù)值范圍為21024到2-1023(開區(qū)間),超出這個(gè)范圍的數(shù)無(wú)法表示。
//小數(shù)點(diǎn)前的數(shù)字多于21位
1234567890123456789012
// 1.2345678901234568e+21
//小數(shù)點(diǎn)后的零多于5個(gè),就自動(dòng)轉(zhuǎn)為科學(xué)計(jì)數(shù)法
0.0000003 // 3e-7
2 數(shù)值的進(jìn)制
十進(jìn)制: 1.23e2=123
二進(jìn)制: 0b1=1,0b10=2,0b11=3
八進(jìn)制: 01=8,011=9
十六進(jìn)制: 0x1=16,0x11=17
3 特殊的值
正零和負(fù)零:JavaScript 內(nèi)部實(shí)際上存在2個(gè)0:一個(gè)是+0,一個(gè)是-0,區(qū)別就是64位浮點(diǎn)數(shù)表示法的符號(hào)位不同。它們是等價(jià)的。
NaN是 JavaScript 的特殊值,表示“非數(shù)字”(Not a Number),主要出現(xiàn)在將字符串解析成數(shù)字出錯(cuò)的場(chǎng)合。真正的奇葩,因?yàn)樗约阂膊坏扔谧约?。NaN === NaN // false
Infinity表示“無(wú)窮”,用來(lái)表示兩種場(chǎng)景。一種是一個(gè)正的數(shù)值太大,或一個(gè)負(fù)的數(shù)值太小,無(wú)法表示;另一種是非0數(shù)值除以0,得到Infinity。
Infinity的四則運(yùn)算,符合無(wú)窮的數(shù)學(xué)計(jì)算規(guī)則。
0乘以Infinity,返回NaN;0除以Infinity,返回0;Infinity除以0,返回Infinity。
Infinity加上或乘以Infinity,返回的還是Infinity。
Infinity減去或除以Infinity,得到NaN。
Infinity與null計(jì)算時(shí),null會(huì)轉(zhuǎn)成0,等同于與0的計(jì)算。
Infinity與undefined計(jì)算,返回的都是NaN。
4 與數(shù)值相關(guān)的全局方法
parseInt()//將字符串轉(zhuǎn)為整數(shù),自動(dòng)去除字符串頭部的空格,parseInt的參數(shù)如果不是字符串,會(huì)先轉(zhuǎn)換為字符串再轉(zhuǎn)換。遇到不是數(shù)字的就停止。如果字符串的第一個(gè)字符不能轉(zhuǎn)化為數(shù)字(后面跟著數(shù)字的正負(fù)號(hào)除外),返回NaN。
parseFloat()//將一個(gè)字符串轉(zhuǎn)為浮點(diǎn)數(shù),如果字符串包含不能轉(zhuǎn)為浮點(diǎn)數(shù)的字符,則不再進(jìn)行往后轉(zhuǎn)換,返回已經(jīng)轉(zhuǎn)好的部分。InFinity、NaN、undefined、返回false。parseFloat會(huì)將空字符串轉(zhuǎn)為NaN。
isNaN()//判斷一個(gè)值是否為NaN
isFinity()//表示某個(gè)值是否為正常的數(shù)值。只對(duì)+InFinity、-InFinity、NaN、undefined、返回false。
parseInt方法還可以接受第二個(gè)參數(shù)(2到36之間),表示被解析的值的進(jìn)制,返回該值對(duì)應(yīng)的十進(jìn)制數(shù)。默認(rèn)情況下,parseInt的第二個(gè)參數(shù)為10,即默認(rèn)是十進(jìn)制轉(zhuǎn)十進(jìn)制。
parseInt(' 81') // 81
parseInt('15px') // 15
parseInt('1000', 2) // 8
parseFloat('3.14more non-digit characters') // 3.14
isNaN('Hello') // true
isFinite(null) // true
字符串(string)
字符串就是零個(gè)或多個(gè)排在一起的字符,放在單引號(hào)或雙引號(hào)之中。
'你好', "你好",
' ', " ", 這類是空字符串,長(zhǎng)度為0。
' ', " ", 這類是空格字符串,長(zhǎng)度為1。
奇葩需求1:在單引號(hào)字符串的內(nèi)部,使用單引號(hào),在雙引號(hào)字符串的內(nèi)部,使用雙引號(hào)。
解決方法:使用轉(zhuǎn)義符。
var a= ' ' '
var a= " " "
奇葩需求2:長(zhǎng)字符串必須分成多行。
解決方法:
方法1(坑人語(yǔ)法),但是使用不小心會(huì)出bug,記得反斜杠的后面必須是換行符,而不能有其他字符(比如空格)。
var s1 = '12345
67890'
方法2(好讀語(yǔ)法)
var s2 = '12345'+
'67890'
方法3(ES6新出的),使用反引號(hào)(1左邊的符號(hào))。
var s3 = ˋ12345
67890`
s3.length //11,會(huì)包含回車。
布爾值(boolean)
只有兩個(gè)值,即true(真)和false(假)。
var a = true;
if(a){
console.log("條件為真");
}else{
console.log("條件為假");
}
符號(hào)(Symbol)
es6新增的類型的值。
undefined類型
一個(gè)值:undefined。是一個(gè)表示"此處無(wú)定義"的原始值。
null類型
一個(gè)值:null。是一個(gè)表示“空”的對(duì)象。
undefined和null的區(qū)別:
語(yǔ)法規(guī)范:如果一個(gè)變量被聲明了,但是沒(méi)有被賦值,那么這個(gè)變量的值就是 undefiend
慣例:如果想要表示一個(gè)還沒(méi)賦值的對(duì)象,就用 null。如果想要表示一個(gè)還沒(méi)賦值的非對(duì)象(字符串/數(shù)字/
布爾/symbol),就用 undefined。
對(duì)象(object)
對(duì)象就是一組“鍵值對(duì)”(key-value)的集合,是一種無(wú)序的復(fù)合數(shù)據(jù)集合。key代表鍵名,value代表鍵值
1.key
對(duì)象的所有鍵名都是字符串。如果鍵名是數(shù)值,會(huì)被自動(dòng)轉(zhuǎn)為字符串。如果鍵名不符合標(biāo)識(shí)名的條件(比如第一個(gè)字符為數(shù)字,或者含有空格或運(yùn)算符),且也不是數(shù)字,則必須加上引號(hào),否則會(huì)報(bào)錯(cuò)。
2.value
value的值可以是任意的數(shù)據(jù)類型
3.屬性的讀取
讀取對(duì)象的屬性,有兩種方法,一種是使用點(diǎn)運(yùn)算符,還有一種是使用方括號(hào)運(yùn)算符。
var obj = {
123: 'hello world'
};
obj.123 // 報(bào)錯(cuò)
obj[123] // "hello world"
4.屬性的賦值
點(diǎn)運(yùn)算符和方括號(hào)運(yùn)算符,不僅可以用來(lái)讀取值,還可以用來(lái)賦值。
5.屬性的查看
查看一個(gè)對(duì)象本身的所有屬性,可以使用Object.keys方法。
var obj = {
key1: 1,
key2: 2
};
Object.keys(obj);
// ['key1', 'key2']
6.屬性的刪除:delete 命令
delete命令用于刪除對(duì)象的屬性(刪除鍵名和鍵值),刪除成功后返回true。
delete命令會(huì)返回false,那就是該屬性存在,且不得刪除。
7.屬性是否存在:in 運(yùn)算符
in運(yùn)算符用于檢查對(duì)象是否包含某個(gè)屬性(注意,檢查的是鍵名,不是鍵值),如果包含就返回true,否則返回false。它的左邊是一個(gè)字符串,表示屬性名,右邊是一個(gè)對(duì)象。
var obj = { p: 1 };
'p' in obj // true
'toString' in obj // true
8.屬性的遍歷:for...in 循環(huán)
for...in循環(huán)用來(lái)遍歷一個(gè)對(duì)象的全部屬性。
var obj = {a: 1, b: 2, c: 3};
for (var i in obj) {
console.log('鍵名:', i);
console.log('鍵值:', obj[i]);
}
它遍歷的是對(duì)象所有可遍歷(enumerable)的屬性,會(huì)跳過(guò)不可遍歷的屬性。
它不僅遍歷對(duì)象自身的屬性,還遍歷繼承的屬性。