1. JavaScript 定義了幾種數(shù)據(jù)類型? 哪些是原始類型?哪些是復(fù)雜類型?原始類型和復(fù)雜類型的區(qū)別是什么?
Javascript的數(shù)據(jù)類型精居,共有六種:
- 數(shù)值(number):整數(shù)和小數(shù)
- 字符串(string): 字符組成的文本
- 布爾值(boolean): true和false
- undefined: 表示“未定義”或不存在茶行,即此處沒有任何值
- null:表示空缺,即此處應(yīng)有一個(gè)值楞慈,但目前為空
- 對(duì)象(object): 各種值組成的集合。
通常囚戚,將數(shù)值氮唯,字符串褒侧,布爾值稱為原始類型良风,即它們是最基本的數(shù)據(jù)類型,不能再細(xì)分了闷供。而將對(duì)象稱為復(fù)雜類型的值烟央,因?yàn)橐粋€(gè)對(duì)象往往是多個(gè)原始類型的值得合成,可以看作是一個(gè)存放各種值得容器歪脏。至于undefined
和null
,一般將它們看成兩個(gè)特殊值疑俭。
基本類型和復(fù)雜類型的區(qū)別:
- 基本類型變量存的是值,復(fù)雜類型的變量存的是內(nèi)存地址
- 基本類型再賦值的時(shí)候拷貝值婿失,復(fù)雜類型再賦值的時(shí)候只拷貝地址钞艇,不拷貝值。
2. typeof和instanceof的作用和區(qū)別?
typeof
是一元運(yùn)算符豪硅,用來返回操作類型的字符串哩照。typeof
實(shí)際的應(yīng)用場(chǎng)景,就是用來檢測(cè)一個(gè)對(duì)象是否已經(jīng)定義或者是否已賦值懒浮,不是用來檢查對(duì)象的類型飘弧。為了檢測(cè)一個(gè)對(duì)象的類型,強(qiáng)烈推薦使用Object.prototype.toString
方法,應(yīng)盡量避免使用?typeof
操作符次伶。
instanceof
運(yùn)算符用來測(cè)試一個(gè)對(duì)象是否在其原型鏈原型構(gòu)造函數(shù)的屬性痴昧,object instanceof constructor
instanceof
操作符用來比較兩個(gè)操作數(shù)的構(gòu)造函數(shù)。只有在比較自定義的對(duì)象時(shí)才有意義冠王。如果用來比較內(nèi)置類型赶撰,將會(huì)和typeof
操作符一樣用處不大。
3. 如何判斷一個(gè)變量是否是數(shù)字版确、字符串扣囊、布爾、函數(shù)
//判斷是否是數(shù)字
var a = 1;
typeof a === 'number';
//更加保險(xiǎn)的方式
Object.prototype.toString.call(a) === '[object Number]';
//判斷是否是字符串
var s = 'hello'
Object.prototype.toString.call(s) === '[object String]'
//判斷布爾
var b = false;
Object.prototype.toString.call(b) === '[object Boolean]';
//判斷函數(shù)
function fn(){}
Object.prototype.toString.call(fn) === '[object Function]';
4. NaN是什么? 有什么特別之處?
- NaN是全局屬性代表
Not-A-Number
绒疗。 - NaN屬性的初始值就是
NaN
,和Number.NaN
的值一樣 - 通常都是在計(jì)算失敗時(shí)侵歇,作為Math的某個(gè)方法的返回值出現(xiàn)或者嘗試將一個(gè)字符串解析成數(shù)字失敗了的時(shí)候。
-
typeof NaN //number
也就是說NaN是一種特殊的Number類型值
5. 如何把非數(shù)值轉(zhuǎn)化為數(shù)值?
-
Number()
函數(shù)- 如果是 Boolean 值吓蘑,true 和 false 將分別被轉(zhuǎn)換為 1 和0惕虑;
- 如果是數(shù)字值,只是簡(jiǎn)單的傳入和返回磨镶;
- 如來是null 值溃蔫,返回 0;
- 如果是 undefined琳猫,返回NaN 伟叛;
- 如果是字符串,遵循下列規(guī)則:
- 如果字符串中只包含數(shù)字脐嫂,則將其轉(zhuǎn)換為十進(jìn)制數(shù)值统刮,即"1"會(huì)變成1 , "123"會(huì)變成123账千,而"011"會(huì)變成11(注意侥蒙,前導(dǎo)的0被忽略了);
- 如果字符串中包含有效的浮點(diǎn)格式匀奏, 如"1.1"鞭衩,則將其轉(zhuǎn)換為對(duì)應(yīng)的浮點(diǎn)數(shù)值(同樣,也會(huì)忽略前導(dǎo)零)娃善;
- 如果字符串中包含有效的十六進(jìn)制格式论衍,例如"0xf",則將其轉(zhuǎn)換為相同大小的十進(jìn)制整數(shù)值聚磺;
- 如果字符串是空的(不包含任何字符) 坯台,則將其轉(zhuǎn)換為0;
- 如果字符串中包含除上述格式之外的字符咧最,則將其轉(zhuǎn)換為 NaN捂人。
- 如果是對(duì)象御雕,則調(diào)用對(duì)象的 valueOf() 方法,然后依照前面的規(guī)則轉(zhuǎn)換返回的值滥搭。如果轉(zhuǎn)換的結(jié)果是 NaN酸纲,則調(diào)用對(duì)象的 toString() 方法,然后再次依照前面的規(guī)則轉(zhuǎn)換返回的字符串值瑟匆。
parseInt()
由于Number()函數(shù)在轉(zhuǎn)換字符串的時(shí)候比較復(fù)雜而且不夠合理闽坡,因此在處理整數(shù)的時(shí)候更常用的是parseInt()
。
parselnt()
函數(shù)在轉(zhuǎn)換字符串時(shí)愁溜,更多的是看其是否符合數(shù)值模式疾嗅,它會(huì)忽略字符串前面的空格,直至找到第一個(gè)非空格字符冕象;如果第一個(gè)字符不是數(shù)字字符或者負(fù)號(hào)代承,parseInt() 就會(huì)返回 NaN;也就是說渐扮,用parselnt() 轉(zhuǎn)換空字符時(shí)會(huì)返回 NaN(Nurnber() 對(duì)空字符返回 0)论悴; 如果第一個(gè)字符是數(shù)字字符,parselnt() 會(huì)繼續(xù)解析第二個(gè)字符墓律,直到解析完所有后續(xù)字符或者遇到了一個(gè)非數(shù)字字符膀估。例如,"1234blue"會(huì)被轉(zhuǎn)換為1234 耻讽,因?yàn)?blue"會(huì)被完全忽略察纯;類似地,"'22.5"會(huì)被轉(zhuǎn)換為22 针肥,因?yàn)樾?shù)點(diǎn)并不是有效的數(shù)字字符饼记。parseFloat()
與 parseInt () 函數(shù)類似,parseFloat () 也是從第一個(gè)字符(位置0)開始解析每個(gè)字符祖驱。而且也是一直解析到字符串末尾握恳,或者解析到遇見一個(gè)無效的浮點(diǎn)數(shù)字字符為止瞒窒。也就是說捺僻,字符串中的
第一個(gè)小數(shù)點(diǎn)是有效的,而第二個(gè)小數(shù)點(diǎn)就是無效的了崇裁,因此它后面的字符串將被忽略匕坯。舉例來說,"22.34.5"將會(huì)被轉(zhuǎn)換為22.34 拔稳。
6. == 與 ===有什么區(qū)別
-
嚴(yán)格相等葛峻,使用===
全等操作符比較兩個(gè)值是否相等,兩個(gè)被比較的值在比較前都不進(jìn)行隱式轉(zhuǎn)換巴比。如果兩個(gè)被比較的值具有不同的類型术奖,這兩個(gè)值是不全等的礁遵。在日常中使用全等操作幾乎是正確的選擇
-
寬松相等,使用==
相等操作符比較兩個(gè)值是否相等采记,在比較前將兩個(gè)被比較的值轉(zhuǎn)換為相同類型佣耐。在轉(zhuǎn)換后,最終的比較等于全等操作符===的比較方式唧龄。一般都會(huì)將 string,boolean類型轉(zhuǎn)換為number 進(jìn)行比較兼砖。如果一個(gè)值是對(duì)象,一個(gè)是數(shù)字或字符串既棺,則嘗試使用
valueOf
和toString
轉(zhuǎn)換后比較讽挟。
7. break與continue有什么區(qū)別
- break用于強(qiáng)制退出循環(huán)體,執(zhí)行循環(huán)后面的語(yǔ)句
- continue用于退出本次循環(huán)丸冕,執(zhí)行下次循環(huán)
for(var i = 1; i< 10; i++){
if(i % 4 === 0){
break;
}
console.log(i);
}
// 輸出123
for(var i = 1; i< 10; i++){
if(i % 4 === 0){
continue;
}
console.log(i);
}
//輸出12356789
8. void 0 和 undefined在使用場(chǎng)景上有什么區(qū)別
void
運(yùn)算符對(duì)給定的表達(dá)式進(jìn)行求值耽梅,然后返回undefined
。一般使用void(0)等同于void 0胖烛,來獲取undefined的原始值褐墅。void是不能 被重寫的。
常用的使用方法:
(function (undefined) {
//...
if (foo !== undefined) {
// ...
}
})();
9. 以下代碼輸出結(jié)果是什么洪己?為什么妥凳?
console.log(1+1); // 2
console.log("2"+"4"); //24
console.log(2+"4"); //24
console.log(+"4"); //4
加號(hào)
- 在兩個(gè)操作數(shù)都是數(shù)字的時(shí)候,會(huì)做加法運(yùn)算
- 兩個(gè)參數(shù)都是字符串或在有一個(gè)參數(shù)是字符串的情況下會(huì)把另外一個(gè)參數(shù)轉(zhuǎn)換為字符串做字符串拼接
- 在參數(shù)有對(duì)象的情況下會(huì)調(diào)用其valueOf()或toString
- 在只有一個(gè)字符串參數(shù)的時(shí)候會(huì)嘗試將其轉(zhuǎn)換為數(shù)字
- 在只有一個(gè)數(shù)字參數(shù)的時(shí)候返回其正數(shù)值
10. 以下代碼的輸出結(jié)果
var a = 1;
a+++a; //3
typeof a+2; //'number2'
11. 以下代碼的輸出結(jié)果
var a = 1;
var b = 3;
console.log( a+++b ); //4
a++ 先賦值再自增 a+++b = 1+3
12. 遍歷數(shù)組答捕,把數(shù)組里的打印數(shù)組每一項(xiàng)的平方
var arr = [3,4,5];
//基本
for(var i=0; i<arr.length; i++) {
arr[i] = arr[i] * arr[i];
}
console.log(arr);
//map
arr = arr.map(function(value) {
return value * value;
});
console.log(arr);
13. 遍歷JSON,打印里面的值
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for(property in obj){
console.log(obj[property]);
}
console.log(Object.values(obj));
14. 以下代碼輸出結(jié)果是什么逝钥?
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0
console.log(val)
//number2
//邏輯與的短路計(jì)算 number2||true 打印出前一個(gè)字符串
var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)
//bb
//首先計(jì)算 d ==5 && console.log('bb') 輸出 true&&bb, 答應(yīng)bb
var data2 = d = 0 || console.log('haha')
console.log(data2)
//haha
// d = 0 || console.log('haha'), d 被賦值haha 再賦值給data2
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)
// 2
// true + true