1.JavaScript 定義了幾種數(shù)據(jù)類型? 哪些是原始類型?哪些是復(fù)雜類型?原始類型和復(fù)雜類型的區(qū)別是什么?
JavaScript語(yǔ)言的每一個(gè)值,都屬于某一種數(shù)據(jù)類型。JavaScript的數(shù)據(jù)類型误墓,共有六種熊镣。
- 數(shù)值(number):整數(shù)和小數(shù)(比如1和3.14)
- 字符串(string):字符組成的文本(比如"Hello World")
- 布爾值(boolean):true(真)和false(假)兩個(gè)特定值
- undefined:表示“未定義”或不存在奔害,即此處目前沒有任何值
- null:表示空缺,即此處應(yīng)該有一個(gè)值凳怨,但目前為空
- 對(duì)象(object):各種值組成的集合
- symbol:一個(gè)symbol值能作為對(duì)象屬性的標(biāo)識(shí)符;這是該數(shù)據(jù)類型僅有的目的。
數(shù)值肤舞、字符串紫新、布爾值稱為原始類型(primitive type)的值,即它們是最基本的數(shù)據(jù)類型李剖,不能再細(xì)分了芒率。
將對(duì)象稱為復(fù)雜類型(complex type)的值,因?yàn)橐粋€(gè)對(duì)象往往是多個(gè)原始類型的值的合成篙顺,可以看作是一個(gè)存放各種值的容器偶芍。
2.typeof和instanceof的作用和區(qū)別?
typeof
作用: 是一個(gè)一元運(yùn)算,放在一個(gè)變量之前德玫,變量可以是任意類型匪蟀。
它返回值是一個(gè)字符串,該字符串說明變量的類型宰僧。typeof 一般只能返回如下幾個(gè)結(jié)果:number,boolean,string,function,object,undefined材彪。
我們可以使用 typeof 來獲取一個(gè)變量是否存在,如 if(typeof a!="undefined"){alert("ok")}琴儿,而不要去使用 if(a) 因?yàn)槿绻?a 不存在(未聲明)則會(huì)出錯(cuò)段化。
區(qū)別: 對(duì)于 Array,Null 等特殊對(duì)象使用 typeof 一律返回 object,這正是 typeof 的局限性造成。
instanceof
作用返回的是一個(gè)布爾值显熏,判斷該變量是否某一類型。如:
var a = {};
alert(a instanceof Object); //true
var b = [];
alert(b instanceof Array); //true
區(qū)別:需要注意的是谜疤,instanceof只能用來判斷對(duì)象和函數(shù)佃延,不能用來判斷字符串和數(shù)字等.但是,用instanceof可以判斷變量是否為數(shù)組
3.如何判斷一個(gè)變量是否是數(shù)字夷磕、字符串履肃、布爾、函數(shù)
用typeof操作符
alert(typeof(1));//number
alert(typeof("abc"));//string
alert(typeof(true));//boolean
alert(typeof function(){}); // 'function'
4.NaN是什么? 有什么特別之處?
NaN含義是Not a Number坐桩,表示非數(shù)字尺棋,NaN和任何值都不相等,包括自己
特別: 任何NaN的值進(jìn)行操作都會(huì)返回一個(gè)NaN,其次绵跷,NaN與任何值都不相等即NaN === NaN也是false.
5.如何把非數(shù)值轉(zhuǎn)化為數(shù)值?
parseInt() 函數(shù)可解析一個(gè)字符串膘螟,并返回一個(gè)整數(shù)。
parseInt("10"); //返回 10
1. 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)換返回的字符串值搬葬。
2. 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ù)字字符诊胞。
3. 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)格相等
7.break與continue有什么區(qū)別
break 用于強(qiáng)制退出循環(huán)體旧烧,執(zhí)行循環(huán)后面的語(yǔ)句
continue 用于退出本次循環(huán)影钉,執(zhí)行下次循環(huán)
8.void 0 和 undefined在使用場(chǎng)景上有什么區(qū)別
undefined在某些場(chǎng)景例如函數(shù)內(nèi)是可以被賦值,而void 0 則只會(huì)返回undefined掘剪。
9.以下代碼的輸出結(jié)果是?為什么?
console.log(1+1); //2 (數(shù)值相加)
console.log("2"+"4"); //24 (2,4均為字符串平委,+連接字符串)
console.log(2+"4"); //24 (4為字符串,2為數(shù)值夺谁,此代碼會(huì)轉(zhuǎn)換2為字符串然后連接)
console.log(+"4"); //4 (+號(hào)強(qiáng)制轉(zhuǎn)換為數(shù)值)
10. 以下代碼的輸出結(jié)果是?
var a = 1;
a+++a;
typeof a+2; //number2
/* (a++)+a=1+2;
(typeof a)+2=number2 */
11. 以下代碼的輸出結(jié)果是? 為什么
var a = 1;
var b = 3;
console.log( a+++b ); //4
/ (a++)+b=1+3=4
12. 遍歷數(shù)組廉赔,把數(shù)組里的打印數(shù)組每一項(xiàng)的平方
var arr = [3,4,5]
var arr=[3,4,5];
for(var i = 0; i<arr.length;i++){
console.log(arr[i]*arr[i]);
}
13. 遍歷 JSON, 打印里面的值
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for(key in obj){
console.log(key+":"+obj[key]);
}
14. 以下代碼輸出結(jié)果是? 為什么 (選做題目)
var a = 1, b = 2, c = 3; //number2
var val = typeof a + b || c >0
console.log(val)
/* val = (typeof a) + [ b || ( c > 0 ) ]
typeof a ==> number; c > 0 ==> true; 2 || true ==> true
*/
var d = 5; // bb
var data = d ==5 && console.log('bb')
console.log(data)
/* data = ( d == 5 ) && console.log("bb")
d == 5 ==> true ;
*/
var data2 = d = 0 || console.log('haha') //haha
console.log(data2)
/* data2 = [ d =( 0 || console.log('haha') ) ]
0 ==>false ; d=console.log("haha") ;data2 = d = haha
var x = !!"Hello" + (!"world", !!"from here!!"); //2
console.log(x)
/* x = (!!"Hello") + (!"world", !!"from here!!");
(!!"Hello") ==>true ; (!"world", !!"from here!!") ==> true ; x= true +true = 2