javascript數(shù)據(jù)類型

1. JavaScript 定義了幾種數(shù)據(jù)類型? 哪些是原始類型?哪些是復(fù)雜類型?原始類型和復(fù)雜類型的區(qū)別是什么?

JavaScript 語言的每一個值,都屬于某一種數(shù)據(jù)類型熊经。JavaScript 的數(shù)據(jù)類型,共有六種抵乓。(ES6 又新增了第七種 Symbol 類型的值)分別為:

數(shù)值(number)
字符串(string)
布爾值(boolean)
undefined
null
對象(object)
數(shù)值、字符串、布爾值稱為原始類型(primitive type)的值
對象稱為合成類型(復(fù)雜類型)(complex type)的值
undefined 和 null 一般看成兩個特殊值
-復(fù)雜對象可以細(xì)分军浆,而原始對象不能細(xì)分,且副贊對象可以看作是多個原始對象的合成纸厉;

2. typeof和instanceof的作用和區(qū)別?

  • typeof可以檢測給定變量的數(shù)據(jù)類型莽囤,但是有局限性,對于Array房官、Null等特殊對象使用typeof一律返回object趾徽。 此外,typeof可以用來判斷一個變量是否存在翰守,或者是未被定義 if (typeof v === "undefined") {}
  • 既然typeof對數(shù)組(array)和對象(object)的顯示結(jié)果都是object孵奶,那么就需要 instanceof(非唯一方法) 進(jìn)行區(qū)分。
    instanceof用于判斷一個變量是否某個對象的實(shí)例蜡峰,比如 var a = []; 那么 a instanceof Array 就會返回true了袁。

3. 如何判斷一個變量是否是數(shù)字、字符串湿颅、布爾载绿、函數(shù)

使用typeof, 能返回字符串,里面告訴了什么類型油航,未定義崭庸、 數(shù)字、字符串、布爾怕享、函數(shù)执赡、分別對應(yīng),"undefined"函筋、"number"沙合、"string"、"boolean"跌帐、"function"首懈。

4. NaN是什么? 有什么特別之處?

NaN含義是Not a Number,即非數(shù)值含末,是一個特殊的數(shù)值猜拾,用于表示一個本來要返回數(shù)值的操作數(shù)未返回數(shù)值的情況(這樣就不會拋出錯誤了)。

特殊之處

任何涉及NaN的操作(例如NaN+10)都會返回NaN
NaN和任何值都不相等佣盒,包括NaN本身(例如 NaN == NaN //false)

5. 如何把非數(shù)值轉(zhuǎn)化為數(shù)值?

   Number()
   parseInt()
   parseFloat()

Number()

  • Number()可以用于任何數(shù)據(jù)類型挎袜,布爾值 true=>1, false=>0. 數(shù)字則是簡單傳入,null=>0, undefined=>NaN,
  • 字符串
    字符串只包含數(shù)字(十進(jìn)制肥惭、八進(jìn)制盯仪、十六進(jìn)制)都會轉(zhuǎn)換成十進(jìn)制;
    字符串包含有效的浮點(diǎn)格式蜜葱,則轉(zhuǎn)換為對應(yīng)的浮點(diǎn)數(shù)值全景;
    字符串是空的(包括空格字符),都轉(zhuǎn)換為0牵囤;
    如果字符串包含除上述格式之外的字符爸黄,則將其轉(zhuǎn)換為NaN, 這意味著需要parseInt() 和 parseFloat() 進(jìn)一步對字符串進(jìn)行更合理的轉(zhuǎn)換。
  • 如果是對象揭鳞,則調(diào)用對象的valueOf()方法炕贵,然后依照前面的規(guī)則轉(zhuǎn)換返回的值。如果轉(zhuǎn)換結(jié)果是NaN野崇,則繼續(xù)調(diào)用對象的 toString() 方法称开,然后再次依照規(guī)則轉(zhuǎn)換返回的字符串值。

parseInt() 和parseFloat()

  • 都是對字符串進(jìn)行數(shù)制轉(zhuǎn)換乓梨。前者是針對整數(shù)格式鳖轰,后者是解析包括整數(shù)在內(nèi)的浮點(diǎn)格式的數(shù)值。
  • parseInt()可以指定第二個參數(shù)作為轉(zhuǎn)換時的基數(shù)扶镀,指定有多少進(jìn)制進(jìn)行轉(zhuǎn)化蕴侣,比如parseInt(111,2) 結(jié)果是7,如果不指定parseInt(111), 則默認(rèn)是十進(jìn)制進(jìn)行解析轉(zhuǎn)換臭觉,那么結(jié)果就是111睛蛛,除了指定二進(jìn)制鹦马,你還可以指定其他進(jìn)制。
    因此多數(shù)情況下忆肾,我們要解析的都是十進(jìn)制數(shù)值荸频,因此還是建議指定10,避免錯誤解析客冈。
  • 相同點(diǎn)
    忽略字符串前面的空白字符旭从,找到第一個非空白字符
    如果第一個字符不是-或者數(shù)字返回NaN
    0開頭會當(dāng)做八進(jìn)制,0x開頭會當(dāng)做十六進(jìn)制
    如果是繼續(xù)解析场仲,直到非數(shù)值模式為止
    如果是空字符串(包括含有空格的字符串)和悦,則返回NaN

6. ==與===有什么區(qū)別

5=='5'
使用相等比較運(yùn)算符的時候,會將string '5'渠缕,自動轉(zhuǎn)換成number 5鸽素,進(jìn)行比較,從而可以滿足比較條件亦鳞,因?yàn)?5 == 5馍忽。

5==='5'
使用 === 嚴(yán)格相等 的比較運(yùn)算符時, 則不會自動做轉(zhuǎn)換處理燕差,顯然 number 5 遭笋,是不會和 string '5',相等的。因此徒探,返回boolean的 false值瓦呼。

  • 所以一般做判斷時用===

7. break與continue有什么區(qū)別

for( var i = 1; i < 5; i++ ){
if( i === 3 ){
break;
}
console.log(i);
}
// 輸出為 1 2
// break 為強(qiáng)制退出整個循環(huán)體,執(zhí)行后面的語句所以輸出 1 2 到此為止

for( var i = 1; i < 5; i++ ){
if( i === 3 ){
continue;
}
console.log(i);
}
// 輸出為 1 2 4
// continue 用于退出本次循環(huán)测暗,執(zhí)行下次循環(huán)
//所以 i === 3的時候央串,這一次退出循環(huán),不再輸出 i碗啄,而是此后 繼續(xù) i++蹋辅,進(jìn)行下一次的 i < 5 的判斷

8. void 0 和 undefined 在使用場景上有什么區(qū)別

例如

function fn() {
  var undefined = 3;
  var a;
  if(a === undefined ){
    console.log('===') 
  }else{
    console.log('!==')
  }
}
fn()

上面的代碼中,a雖然聲明變量了挫掏,但是沒有賦值,所以應(yīng)該是未定義undefined秩命,在接下來的條件判斷語句中尉共,a應(yīng)該會嚴(yán)格等于undefined。
但是在一開始弃锐,對 undefined 聲明并且賦值為3
Infinity袄友、NaN、undefined 這三個詞雖然不是保留字霹菊,但因?yàn)榫哂刑貏e含義剧蚣,一般不應(yīng)該用作標(biāo)識符支竹,但是強(qiáng)行用也是可以的。
這個時候鸠按,程序的結(jié)果是 !==, 顯然a !== undefined礼搁,嚴(yán)格不等于undefined,因?yàn)閡ndefined是3目尖, 實(shí)際上馒吴,a != undefined ,a 也不等于 undefined瑟曲,徹底的不一樣了饮戳。

然而,a顯然還是undefined洞拨,未定義扯罐。這是個bug,怎么辦呢烦衣?所以要最保險的方法是是void操作符歹河。
void運(yùn)算符的作用是執(zhí)行一個表達(dá)式,然后返回undefined琉挖。
根據(jù)這個特性启泣,其他不變,把if判斷條件修改一下:

function fn() {
  var undefined = 3;
  var a;
  if(a === void 0 ){
    console.log('===') 
  }else{
    console.log('!==')
    console.log(a)
  }
}
fn()

此時 void 優(yōu)先級高于 比較運(yùn)算符 === 示辈,所以 void 0 無腦返回 undefined寥茫,從而 a === 真正純天然無污染的 undefined。最后判斷結(jié)果是 布爾值 true矾麻。 輸出 ===

9. 以下代碼的輸出結(jié)果是?為什么?

console.log(1+1);   //輸出number 2
console.log("2"+"4");  //輸出string "24"
console.log(2+"4");  //輸出string "24"
console.log(+"4");  //輸出number 4

首先這些都是 運(yùn)算符 + 在不同數(shù)據(jù)類型下具有的不同含義纱耻。

  1. 第一個很好理解,兩個參數(shù)都是數(shù)字险耀,則此時的+就是加法運(yùn)算弄喘。
  2. 兩個參數(shù)都是string,這時候會進(jìn)行字符串的拼接甩牺,于是拼接成新的string "24"蘑志。
  3. 一個參數(shù)是number,但是另一個是string贬派,那么會把number轉(zhuǎn)化成string急但,與另一個string進(jìn)行拼接。所以結(jié)果還是string '24'搞乏。
  4. 最后一個波桩,只有一個數(shù)字參數(shù),則會返回其正數(shù)值请敦。是number镐躲,直接返回number储玫,是string,但里面是number萤皂,則還是返回number撒穷,如果是字符串,會嘗試轉(zhuǎn)換為數(shù)值敌蚜,如果 console.log("jirengu")桥滨,則返回NaN〕诔担可以理解為 本性還是數(shù)值類型齐媒,但是字符串 jirengu,是沒辦法轉(zhuǎn)化成一個具體number值的纷跛。

10. 以下代碼的輸出結(jié)果是?

var a = 1;  
a+++a;  
typeof a+2;

結(jié)果是字符串 "number2"
為什么會這樣子喻括?
因?yàn)檫@里的 + 實(shí)際上并不是算數(shù)運(yùn)算符里面的加法運(yùn)算符,而是代表字符串拼接贫奠。
a 不管怎樣唬血,都是number類型,而typeof返回的是數(shù)據(jù)類型是string格式的(注意唤崭,這里不是說typeof返回的結(jié)果拷恨,告訴我們是string類型。)
至于第二行中 a+++a谢肾,實(shí)際上可以拆分成:
(a++)(+a)
理解為:
a=1
b=a
a= a+1
b+a

11. 以下代碼的輸出結(jié)果是? 為什么

 var a = 1;
 var b = 3;
 console.log( a+++b ); //輸出結(jié)果是4

結(jié)果是4腕侄, 首先++ 自增運(yùn)算符優(yōu)先級高于 + 加法運(yùn)算符。 a++芦疏,表示參與當(dāng)前的運(yùn)算后(先賦值)冕杠,再自增1。
所以是 1 + 3 = 4
這時候酸茴,再console.log(a) , 則返回 4

  1. 遍歷數(shù)組分预,打印數(shù)組每一項(xiàng)的平方
  • 平方
var arr = [3, 4, 5]
for(i = 0; i<arr.length; i++){
  console.log(arr[i]*arr[i])
} 
// 輸出為 9 16 25
  • 倒序遍歷數(shù)組并打印
 var arr = [100, 90, 80, 70, 60]
 for(var i = arr.length - 1; i >= 0; i-- ){
   console.log(arr[i])
 }
// 輸出為 60 70 80 90 100
  • 正序遍歷偶數(shù)序位的數(shù)組
var arr = [100, 90, 80, 70, 60, 50, 40]
for(var i = 1; i < arr.length; i += 2){
  console.log(arr[i])
}
// 輸出為 90 70 50

13. 遍歷 JSON, 打印里面的值

var obj = {
 name: 'hunger', 
 sex: 'male', 
 age: 28 
}
for( var key in obj ){
  console.log(obj[key])
}
// 輸出為 hunger male 28

14. 以下代碼輸出結(jié)果是? 為什么 (選做題目)

var a = 1, b = 2, c = 3; 
var val = typeof a + b || c >0
console.log(val) 
// 輸出 number2

typeof優(yōu)先級最高,判斷a是"number"薪捍,接著和 2 進(jìn)行拼接笼痹,成為"number2",由于是 || 或運(yùn)算符酪穿,所以左邊成立凳干,右邊即可忽略,不會執(zhí)行昆稿。 因此最后把"number" 賦值給 val,通過console.log(val) 的時候息拜,就去掉了""

var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)
// 輸出 bb undefined

因?yàn)橄葓?zhí)行console.log 輸出bb溉潭,然后 d == 5為 true净响,然后&&右邊 console.log('bb') 無法被自動轉(zhuǎn)換為布爾值,不是true也不是false喳瓣,而是undefined馋贤,于是就把undefined 賦值給了 data。

var data2 = d = 0 || console.log('haha')
console.log(data2)
// 輸出 haha  undefined

首先因?yàn)槭莄onsole.log所以先無腦輸出haha畏陕, 然后 因?yàn)檫@是或運(yùn)算符配乓,左邊 0 轉(zhuǎn)化為false,所以繼續(xù)看右邊的惠毁,右邊console.log('haha')無法被有效的轉(zhuǎn)換為 布爾值boolean犹芹, 因此是undefined未定義。所以最后把 undefined賦值給 data2鞠绰。
所以最后輸出兩行:
haha
defined
因?yàn)閏onsole.log()方法會自動換行

var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)
// 輸出 2

原因很簡單腰埂, 首先括號優(yōu)先級最高,其次里面有逗號運(yùn)算符蜈膨,雖然逗號運(yùn)算符低的不要不要的屿笼, 但是可以讓我們?nèi)ズ雎远禾柷懊娴?!"world"
所以返回的是逗號后面的表達(dá)式, "from here!!" 本來是無辜的字符串翁巍,但是使用了布爾運(yùn)算符中的 ! 取反運(yùn)算符驴一,所以被偷偷轉(zhuǎn)換為布爾值,因?yàn)樽址强赵詈允莟rue肝断,進(jìn)行了兩次取反,最后還是true例朱。
然后再看!!"Hello" 同理孝情,轉(zhuǎn)換為boolean值 true, 這時候 有個 加法運(yùn)算符 + 洒嗤,
于是布爾值 又被偷偷轉(zhuǎn)換為number參與 加法運(yùn)算箫荡, true對應(yīng)的是1,
所以
x = 1 + 1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末渔隶,一起剝皮案震驚了整個濱河市羔挡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌间唉,老刑警劉巖绞灼,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異呈野,居然都是意外死亡低矮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門被冒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來军掂,“玉大人轮蜕,你說我怎么就攤上這事』茸叮” “怎么了跃洛?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長终议。 經(jīng)常有香客問我汇竭,道長,這世上最難降的妖魔是什么穴张? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任细燎,我火速辦了婚禮,結(jié)果婚禮上陆馁,老公的妹妹穿的比我還像新娘找颓。我一直安慰自己,他們只是感情好叮贩,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布击狮。 她就那樣靜靜地躺著,像睡著了一般益老。 火紅的嫁衣襯著肌膚如雪彪蓬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天捺萌,我揣著相機(jī)與錄音档冬,去河邊找鬼。 笑死桃纯,一個胖子當(dāng)著我的面吹牛酷誓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播态坦,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼盐数,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了伞梯?” 一聲冷哼從身側(cè)響起玫氢,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谜诫,沒想到半個月后漾峡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喻旷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年生逸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡槽袄,死狀恐怖伟阔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掰伸,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布怀估,位于F島的核電站狮鸭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏多搀。R本人自食惡果不足惜歧蕉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望康铭。 院中可真熱鬧惯退,春花似錦、人聲如沸从藤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夷野。三九已至懊蒸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悯搔,已是汗流浹背骑丸。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留妒貌,地道東北人通危。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像灌曙,于是被迫代替她去往敵國和親菊碟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 強(qiáng)制轉(zhuǎn)換 強(qiáng)制轉(zhuǎn)換主要指使用Number平匈、String和Boolean三個構(gòu)造函數(shù)框沟,手動將各種類型的值,轉(zhuǎn)換成數(shù)字...
    燈火闌珊Zone閱讀 391評論 0 3
  • 一增炭、JavaScript 定義了幾種數(shù)據(jù)類型忍燥? 哪些是原始類型?哪些是復(fù)雜類型隙姿? 最新的 ECMAScript 標(biāo)...
    zh_yang閱讀 354評論 0 0
  • 每天一句:每個月要讀一本書靡馁,離開學(xué)校了,你還要經(jīng)常保持閱讀的習(xí)慣机久,大學(xué)時候臭墨,考前的通宵達(dá)旦,說明你具備快速學(xué)習(xí)的能...
    EndEvent閱讀 421評論 0 0
  • 什么是iconfont? 以前在做項(xiàng)目的時候經(jīng)常使用到圖片資源膘盖,哪怕是一個勾或者叉都要加載圖片胧弛,最早是一張一張加載...
    zcynine閱讀 1,321評論 0 0
  • 萬物逆旅,百代過客侠畔,浮生若夢结缚,為歡幾何?前不見古人后不見來者软棺,而每一次孤身上路红竭,一步步征途于當(dāng)年帝國之版...
    空中的石頭1閱讀 188評論 0 3