在JavaScript中,數(shù)據(jù)類型分為兩類,即原始值和引用值。
原始值
是存儲(chǔ)在棧中的簡(jiǎn)單數(shù)據(jù)段,它值直接存儲(chǔ)在變量訪問的位置。
原始值類型:Number、String、Boolean、undefined、null
-
undefined
當(dāng)變量 聲明了但沒有初始化 時(shí)候,該變量的默認(rèn)值即為undefined
沒有聲明 的變量,值雖然不是undefined,但是數(shù)據(jù)類型還是undefinedvar test ; console.log(test); //undefined
當(dāng)函數(shù)無(wú)明確返回值時(shí),默認(rèn)返回值為nullvar test ; console.log(typeof (test)); //undefined console.log(typeof (myTest)); //undefinedfunction test(){} console.log(test()); -
null
與undefined的區(qū)別是,undefined表示未定義,但是null有值,只不過這個(gè)值是空。
當(dāng)函數(shù)返回一個(gè)對(duì)象,找不到這個(gè)對(duì)象時(shí)候,返回值為nullvar demo = null; console.log(demo); // null var test; console.log(test); //undefined -
String
在許多語(yǔ)言中,字符串都被看作引用類型,而非原始類型,因?yàn)樽址拈L(zhǎng)度是可變的。JavaScript打破了這一傳統(tǒng)。
引用值
存儲(chǔ)在堆中的對(duì)象,在變量處的值是一個(gè)指針,指向存儲(chǔ)對(duì)象的內(nèi)存處。
主要有數(shù)組array、對(duì)象object、函數(shù)function。
這兩種類型到底有什么區(qū)別?我們來(lái)舉個(gè)例子
var test = 111;
newTest = test;
Test = 222;
console.log(test); //111
console.log(newTest); //222
test值的改變對(duì)newTest沒有影響。
test是原始值,他的值存在棧里,執(zhí)行newTest = test,棧內(nèi)開辟新空間,保存newTest的值,此后test再怎么改變與newTest無(wú)關(guān)。
var arr = [1,2,3];
newArr = arr;
arr.push(4);
console.log(arr);//[1, 2, 3, 4]
console.log(newArr);//[1, 2, 3, 4]
arr是引用值,他的變量名存在棧里,但值存在堆里,變量名指向的堆空間,執(zhí)行newArr = arr,變量名newArr與arr指向相同的堆空間,所以arr的值改變,就導(dǎo)致newArr的值也改變。
var arr = [1,2,3];
newArr = arr;
arr = [1,2,3,4,5,6]
console.log(arr);// [1, 2, 3, 4, 5, 6]
console.log(newArr);//[1, 2, 3]
JavaScript類型轉(zhuǎn)換
顯式類型轉(zhuǎn)換
typeof可以檢驗(yàn)數(shù)據(jù)類型
只能返回 numner、string、boolean、undefined、object、function,并且typeof返回結(jié)果是string類型
NaN屬于number類型
console.log( typeof(typeof(123))); // string
轉(zhuǎn)換為數(shù)字字符串允許開頭結(jié)尾有空格,但是只要有非空格字符,字符串轉(zhuǎn)換為數(shù)字的結(jié)果就是NaN。
- Number( ) 把其他類型的數(shù)據(jù)轉(zhuǎn)換成數(shù)字類型的數(shù)據(jù)。
var demo = Number('123');
console.log(demo) // number123
demo = Number(true)
console.log(demo) // 1
demo = Number(NaN)
console.log(demo) // NaN
demo = Number(undefined)
console.log(demo) // NaN
var demo = Number("ooo");
console.log(demo) //NaN
var demo = Number(function(){});
console.log(demo) //NaN
-
parseInt(string, radix) 解析一個(gè)字符串,并返回一個(gè)整數(shù)
string表示要被解析的字符串。
radix表示要將字符串轉(zhuǎn)化的進(jìn)制。
值介于 2 ~ 36 之間。 該參數(shù)小于 2 或者大于 36,則 parseInt() 將返回 NaN。 如果省略該參數(shù)或其值為 0,則數(shù)字將以 10 為基礎(chǔ)來(lái)解析。如果它以 “0x” 或 “0X” 開頭,將以 16 為基數(shù)。
當(dāng)參數(shù)string里面既包括數(shù)字字符串又包括其他字符串的時(shí)候,它會(huì)將看到其他字符串就停止了,不會(huì)繼續(xù)轉(zhuǎn)換后面的數(shù)字型字符串了。
parseInt('123abc345') // 123
parseInt('abc123') // NaN
parseInt('123') // 123
parseInt('abc') // NaN
parseInt(true) // NaN
parseFloat( )將字符串轉(zhuǎn)換成浮點(diǎn)類型的數(shù)字
識(shí)別第一個(gè)小數(shù)點(diǎn)以及后面的數(shù)字,第二個(gè)小數(shù)點(diǎn)后的無(wú)法識(shí)別,遇到非數(shù)字字符串停止識(shí)別。-
toString( )將任意數(shù)據(jù)類型轉(zhuǎn)換為字符串
與前幾個(gè)不同的是,他是對(duì)象上的方法
undefiend和null沒有toString方法引用值類型(對(duì)象、函數(shù)、數(shù)組)轉(zhuǎn)換為字符串,步驟如下
- 如果對(duì)象有
toString(),調(diào)用toString(),如果返回原始值,將這個(gè)值轉(zhuǎn)換為字符串;如果返回的是復(fù)合類型或?qū)ο鬀]有toString(),則調(diào)用valueOf(); - 如果
valueOf()返回原始值類型,將這個(gè)值轉(zhuǎn)換為字符串; - 如果返回的是復(fù)合類型,則拋出一個(gè)類型錯(cuò)誤異常。
- 如果對(duì)象有
Boolean( )把任何類型轉(zhuǎn)換成布爾類型
Boolean(0); // false
Boolean(undefined); // false
Boolean(null); // false
Boolean(''); // false
Boolean(NaN); // false
隱式類型轉(zhuǎn)換
-
isNaN()
檢測(cè)數(shù)據(jù)是不是非數(shù)類型。
先將你傳的參數(shù)調(diào)用一下Number方法之后,再看看結(jié)果是不是NaN,不過這個(gè)方法可以檢測(cè)NaN本身。
isNaN(NaN); // true
- ==
1,null和undefined,相等。
2,數(shù)字和字符串,轉(zhuǎn)化為數(shù)字再比較。
3,如果有true或false,轉(zhuǎn)換為1或0,再比較。
4,如果有引用類型,優(yōu)先調(diào)用valueOf。
5,其余都不相等。
console.log(undefined == false); // false
console.log(null == false); // false
console.log(0 == false); // true
console.log(NaN == false); // false
console.log("" == false); // true
1 !== '1'; // true
1 !== 1; // false