JavaScript 定義了幾種數(shù)據(jù)類(lèi)型? 哪些是原始類(lèi)型?哪些是復(fù)雜類(lèi)型?原始類(lèi)型和復(fù)雜類(lèi)型的區(qū)別是什么?
JavaScript數(shù)據(jù)類(lèi)型
- number:整數(shù)和小數(shù)
- string:字符組成的文本
- boolean:只有true和false兩個(gè)值
- undefine: 表示未定義或不存在
- null: 表示值為空匕坯。
- object: 各種值組成的集合
- symbol: ES6新類(lèi)型熙暴,生成一個(gè)全局唯一的值
原始類(lèi)型:數(shù)值荞膘、字符串、布爾值屬于原始類(lèi)型的值够吩,即他們是最基礎(chǔ)的數(shù)據(jù)類(lèi)型,不能再細(xì)分剩檀。
復(fù)雜類(lèi)型:對(duì)象稱(chēng)為復(fù)雜類(lèi)型澄干,對(duì)象往往是由多個(gè)原始類(lèi)型的值組合,可以看做是一個(gè)存放各種值的容器跷跪。
undefined和null馋嗜,一般將他們看成兩個(gè)特殊值。
原始類(lèi)型和復(fù)雜類(lèi)型的區(qū)別:
- 基本類(lèi)型變量存的是值吵瞻,復(fù)雜類(lèi)型的變量存的是內(nèi)存地址葛菇。
- 基本類(lèi)型在賦值的時(shí)候拷貝值,復(fù)雜類(lèi)型在賦值的時(shí)候只拷貝地址听皿,不拷貝值熟呛。
typeof和instanceof的作用和區(qū)別?
typeof可以返回一個(gè)值的運(yùn)算類(lèi)型,對(duì)應(yīng)的數(shù)據(jù)類(lèi)型都有不同的結(jié)果尉姨。
instanceof可以判斷一個(gè)變量是否是某個(gè)對(duì)象(類(lèi))的實(shí)例庵朝,返回值是布爾類(lèi)型的。
typeof用于基本類(lèi)型又厉;instanceof用于復(fù)雜類(lèi)型九府。
如何判斷一個(gè)變量是否是數(shù)字、字符串覆致、布爾侄旬、函數(shù)
使用typeof運(yùn)算符
typeof 157 === 'number' //判斷是否為數(shù)字
typeof 'name' === 'string' //判斷是否為字符串
typeof false ==='boolean' //判斷是否為布爾
typeof f ==='function' //判斷是否為函數(shù)
NaN是什么? 有什么特別之處?
NaN: Not a Number, 表示非數(shù)字, NaN和任何值都不相等煌妈,包括自己
如何把非數(shù)值轉(zhuǎn)化為數(shù)值?
有三個(gè)函數(shù)可以把非數(shù)轉(zhuǎn)換為數(shù)值
- Number()
- parseInt()
- parseFloat()
Number規(guī)則相當(dāng)復(fù)雜而且不合理儡羔,幾乎不使用,常用的是后兩個(gè)璧诵,且規(guī)則類(lèi)似:
- 忽略字符串前面的空白字符汰蜘,找到第一個(gè)非空白字符
- 如果第一個(gè)字符不是-或者數(shù)字返回NaN
- 如果是繼續(xù)解析,直到非數(shù)值模式為止
- 0開(kāi)頭會(huì)當(dāng)做八進(jìn)制之宿,0x開(kāi)頭會(huì)當(dāng)做十六進(jìn)制族操,但是可以指定第二個(gè)參數(shù)指定基數(shù)
==與===有什么區(qū)別
===是嚴(yán)格意義的相等,只需注意NaN和NaN不等比被。
使用==時(shí)色难,javascript會(huì)進(jìn)行類(lèi)型轉(zhuǎn)換:
- 如果兩個(gè)值類(lèi)型相同泼舱,則執(zhí)行嚴(yán)格相等的運(yùn)算
如果兩個(gè)值的類(lèi)型不同
1 . 如果一個(gè)是null,一個(gè)是undefined枷莉,那么相等
2 . 如果一個(gè)是數(shù)字娇昙,一個(gè)是字符串,先將字符串轉(zhuǎn)為數(shù)字依沮,然后比較
3 . 如果一個(gè)值是true/false則將其轉(zhuǎn)為1/0比較
4 . 如果一個(gè)值是對(duì)象涯贞,一個(gè)是數(shù)字或字符串,則嘗試使用valueOf和toString轉(zhuǎn)換后比較
5 . 其它就不相等了
break與continue有什么區(qū)別
- break用于強(qiáng)制退出循環(huán)體危喉,執(zhí)行循環(huán)后面的語(yǔ)句
- continue用于退出本次循環(huán)宋渔,執(zhí)行下次循環(huán)
void 0 和 undefined在使用場(chǎng)景上有什么區(qū)別
- void 0 運(yùn)算返回值始終都是undefined
- undefined可以在局部作用域中被覆蓋
以下代碼的輸出結(jié)果是?為什么?
console.log(1+1); //2,兩個(gè)值都是數(shù)字,可以運(yùn)算
console.log("2"+"4"); //"24",兩個(gè)參數(shù)都是字符串辜限,字符串拼接
console.log(2+"4"); //"24",其中一個(gè)是字符串一個(gè)是數(shù)字皇拣,會(huì)把數(shù)字轉(zhuǎn)換成字符串
console.log(+"4"); //4 只有一個(gè)字符串,將其轉(zhuǎn)換為數(shù)字
以下代碼的輸出結(jié)果是?
var a = 1;
a+++a; //3,考察運(yùn)算的優(yōu)先級(jí)薄嫡,a++優(yōu)先級(jí)高氧急,所以輸出3
typeof a+2;//"number2",typeof優(yōu)先級(jí)高,輸出字符串為a的類(lèi)型"number",數(shù)字2轉(zhuǎn)換成字符串拼接在一起毫深,所以輸出"number2"
以下代碼的輸出結(jié)果是? 為什么
var a = 1;
var b = 3;
console.log( a+++b );//4吩坝,a++優(yōu)先級(jí)高,運(yùn)算結(jié)果為1哑蔫,然后與b相加
遍歷數(shù)組钉寝,把數(shù)組里的打印數(shù)組每一項(xiàng)的平方
var arr = [3,4,5];
for(var i = 0; i<arr.length; i++) {
console.log(arr[i]*arr[i]);
}
//輸出:9 16 25
遍歷 JSON, 打印里面的值4
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for(var key in obj){
console.log(obj[key]);
}
//輸出:hunger male 28
以下代碼輸出結(jié)果是? 為什么 (選做題目)
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0
console.log(val)
// 輸出結(jié)果為:number2
// 優(yōu)先級(jí)為:typeof,+闸迷,>,||
var d = 5;
var data = d ==5 && console.log('bb')
console.log(data) //輸出:bb undefined , console.log('bb')先執(zhí)行輸出bb,&&前為ture,console.log('bb')不返回布爾值嵌纲,返回undefined,所以data為undefined
var data2 = d = 0 || console.log('haha')
console.log(data2)
// 輸出:haha undefined , console.log('haha')先執(zhí)行輸出haha,||優(yōu)先級(jí)高于=,比較0和console.log('haha')腥沽,輸出undefined,右結(jié)合賦值給data2,所以data2為undefined
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)
// 輸出:2 , !"world"為false, !!"from here!!"為ture, !!"Hello"為ture,
所以為ture+ture, 輸出為2