JavaScript的值類型及類型轉(zhuǎn)換


在JavaScript中,數(shù)據(jù)類型分為兩類,即原始值引用值。

原始值

是存儲(chǔ)在棧中的簡(jiǎn)單數(shù)據(jù)段,它值直接存儲(chǔ)在變量訪問的位置。
原始值類型:Number、String、Boolean、undefined、null

  • undefined
    當(dāng)變量 聲明了但沒有初始化 時(shí)候,該變量的默認(rèn)值即為undefined
    var test ;
    console.log(test); //undefined
    
    沒有聲明 的變量,值雖然不是undefined,但是數(shù)據(jù)類型還是undefined
    var test ;
    console.log(typeof (test)); //undefined
    console.log(typeof (myTest)); //undefined
    
    當(dāng)函數(shù)無(wú)明確返回值時(shí),默認(rèn)返回值為null
    function test(){}
    console.log(test());
    
  • null
    與undefined的區(qū)別是,undefined表示未定義,但是null有值,只不過這個(gè)值是空。
    var demo = null;
    console.log(demo); // null
    var test;
    console.log(test); //undefined
    
    當(dāng)函數(shù)返回一個(gè)對(duì)象,找不到這個(gè)對(duì)象時(shí)候,返回值為null
  • 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)換為字符串,步驟如下

    1. 如果對(duì)象有toString(),調(diào)用 toString(),如果返回原始值,將這個(gè)值轉(zhuǎn)換為字符串;如果返回的是復(fù)合類型或?qū)ο鬀]有toString(),則調(diào)用 valueOf()
    2. 如果 valueOf()返回原始值類型,將這個(gè)值轉(zhuǎn)換為字符串;
    3. 如果返回的是復(fù)合類型,則拋出一個(gè)類型錯(cuò)誤異常。
  • 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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 值類型轉(zhuǎn)換將值從一種類型轉(zhuǎn)換為另一種類型通常稱為類型轉(zhuǎn)換,這是顯示的情況;隱式的情況稱為強(qiáng)制類型轉(zhuǎn)換。JavaSc...
    xpwei閱讀 3,727評(píng)論 0 5
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,534評(píng)論 19 139
  • 昨天描繪了一個(gè)畫面,“我跪在破碎的房間里想要收拾殘骸,但是我不知道從哪里開始,無(wú)能為力,這種無(wú)力感讓我覺得很難過。...
    無(wú)所事事的飯飯閱讀 530評(píng)論 1 3
  • 新的一天,新的一切,滿滿的能量等待釋放,加油吧!
    丶柒v閱讀 172評(píng)論 0 0
  • 再一遍寫我,有些不知所措 我丟了公交卡,丟了錢包 同時(shí)也丟了身份證,這個(gè)城市的借記卡和信用卡 我感覺自己成了無(wú)人領(lǐng)...
    Jonah_Wang閱讀 199評(píng)論 0 0

友情鏈接更多精彩內(nèi)容