1.JavaScript 定義了幾種數(shù)據(jù)類型? 哪些是原始類型?哪些是復(fù)雜類型?原始類型和復(fù)雜類型的區(qū)別是什么?
1.JavaScript定義了6種數(shù)據(jù)類型:
數(shù)值(number):整數(shù)和小數(shù)
字符串(string):字符組成的文本
布爾值(boolean):true(真)和false(假)
null:表示空缺,此處應(yīng)該有個值更哄,但目前為空
Undefined:表示不存在或沒定義邢笙,此處沒有任何值
對象(object):各種值組成的集合啸如。有三個子類型:狹義的對象(object),數(shù)組(Array),函數(shù)(function)
- 我們將數(shù)值、字符串氮惯、布爾值稱為原始類型(primitive type)的值叮雳,即它們是最基本的數(shù)據(jù)類型想暗,不能再細(xì)分了。
- 將對象稱為合成類型(complex type)的值帘不,因為一個對象往往是多個原始類型的值的合成说莫,可以看作是一個存放各種值的容器。
- undefined和null寞焙,一般將它們看成兩個特殊值储狭。
2.typeof和instanceof的作用和區(qū)別?
- typeof用于檢測變量的基本類型,一般返回這些結(jié)果:number,boolean,string,function,object,undefined
- instanceof 用于判斷一個變量是否某個對象的實例捣郊。
- 區(qū)別:typeof是判斷變量是什么基本類型的辽狈;
instanceof是判斷對象到底是什么類型的;
3.如何判斷一個變量是否是數(shù)字呛牲、字符串刮萌、布爾、函數(shù)
- 判斷數(shù)字 typeof 123 ----------- number
- 判斷字符串 typeof "abc" ------------ string
- 判斷布爾值 typeof true ----------- boolean
- 判斷函數(shù) typeof function(){ } ----------- function
4.NaN是什么? 有什么特別之處?
NaN含義是not a number 娘扩,表示非數(shù)字着茸,NaN和任何值都不相等,包括自己
NaN === NaN ---------- false
5.如何把非數(shù)值轉(zhuǎn)化為數(shù)值?
- 轉(zhuǎn)換函數(shù):
js提供了parseInt()和parseFloat()兩個轉(zhuǎn)換函數(shù)琐旁。前者把值轉(zhuǎn)換成整數(shù)涮阔,后者把值轉(zhuǎn)換成浮點數(shù)。只有對String類型調(diào)用這些方法灰殴,這兩個函數(shù)才能正確運行敬特;對其他類型返回的都是NaN(Not a Number)。
一些示例如下:
parseInt("1234blue"); //returns 1234
parseInt("0xA"); //returns 10
parseInt("22.5"); //returns 22
parseInt("blue"); //returns NaN
2.強制類型轉(zhuǎn)換
Number()——把給定的值轉(zhuǎn)換成數(shù)字(可以是整數(shù)或浮點數(shù))验懊;
6.==與===有什么區(qū)別
我們知道可以使用==或===判斷兩個值的相等性擅羞,其中區(qū)別相信大家清楚,===是嚴(yán)格意義的相等义图,只需注意NaN和NaN不等就行了减俏。
而使用==的時候,javascript會幫我們做類型轉(zhuǎn)換碱工,造成一些匪夷所思的結(jié)果娃承,那么使用==的時候會在哪些情況下做類型轉(zhuǎn)換,又會換成什么樣子怕篷?
如果兩個值類型相同历筝,則執(zhí)行嚴(yán)格相等的運算
如果兩個值的類型不同
如果一個是null,一個是undefined廊谓,那么相等
如果一個是數(shù)字梳猪,一個是字符串,先將字符串轉(zhuǎn)為數(shù)字蒸痹,然后比較
如果一個值是true/false則將其轉(zhuǎn)為1/0比較
如果一個值是對象春弥,一個是數(shù)字或字符串呛哟,則嘗試使用valueOf和toString轉(zhuǎn)換后比較
其它就不相等了
null==undefined; //true
NaN==NaN; //false
"1"==true; //true
true == 1; //ture true會轉(zhuǎn)換成number,也就是1
true == 2; //false 當(dāng)然 1 不等于 2
區(qū)別:
對于string,number等基礎(chǔ)類型匿沛,==和===是有區(qū)別的
不同類型間比較扫责,==之比較“轉(zhuǎn)化成同一類型后的值”看“值”是否相等,===如果類型不同逃呼,其結(jié)果就是不等
同類型比較鳖孤,直接進行“值”比較,兩者結(jié)果一樣
對于Array,Object等高級類型抡笼,==和===是沒有區(qū)別的
進行“指針地址”比較
基礎(chǔ)類型與高級類型苏揣,==和===是有區(qū)別的
對于==,將高級轉(zhuǎn)化為基礎(chǔ)類型蔫缸,進行“值”比較
因為類型不同腿准,===結(jié)果為false
7.break與continue有什么區(qū)別
- break 用于強制退出循環(huán)體,執(zhí)行循環(huán)后面的語句
- continue 用于退出本次循環(huán)拾碌,執(zhí)行下次循環(huán)
8.void 0 和 undefined在使用場景上有什么區(qū)別
undefined是一個全局屬性,表示未定義或定義了沒有賦值街望。
void是一個一元運算符校翔,不管傳入什么參數(shù)都會返回undefined。
void操作符是在ECMAScript v1中定義的灾前,而undefined是在ECMAScript v5中定義的防症。
使用void 0代替undefined是為了兼容性以及預(yù)防代碼的不規(guī)范(自己修改undefined的值)。
9.以下代碼的輸出結(jié)果是?為什么?
console.log(1+1); \\ 2 運算符兩邊都是數(shù)值哎甲,就進行加法運算蔫敲,返回數(shù)值2
console.log("2"+"4"); \\ "24" 運算符兩邊是字符串,+就是將字符串連接炭玫,返回字符串 "24"
console.log(2+"4"); \\ "24" 運算符一邊是字符串奈嘿,+就是將字符串和前面的數(shù)值2連接,返回字符串 "24"
console.log(+"4"); \\4 在只有一個字符串參數(shù)的時候會嘗試將其轉(zhuǎn)換為數(shù)字
10. 以下代碼的輸出結(jié)果是?
var a = 1;
a+++a; // 3吞加, ++運算符的優(yōu)先級比+運算符高裙犹,相當(dāng)于(a++)+a,(a++)先運算再賦值衔憨,所以a++結(jié)束后叶圃,a=2,1+2=3
typeof a+2; //"number2"践图,相當(dāng)于(typeof a)+2,(typeof a)的值是"number","number"+2的結(jié)果是"number2"
11. 以下代碼的輸出結(jié)果是? 為什么
var a = 1;
var b = 3;
console.log( a+++b ); //4 a+++b相當(dāng)于(a++)+b, a++ 先運算再賦值掺冠,也就是當(dāng)前的a++還是1,那么1+3=4
12. 遍歷數(shù)組码党,把數(shù)組里的打印數(shù)組每一項的平方
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
};
for(i in obj){
console.log(obj[i]);
}
14. 以下代碼輸出結(jié)果是? 為什么 (選做題目)
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0
console.log(val)
輸出結(jié)果為字符串"number2"
val = typeof a + b || c >0德崭,=的運算符最低悍及,所以相當(dāng)于typeof a + b || c >0賦值給val,typeof a + b || c >0相當(dāng)于(typeof a) + b || c > 0, || 運算符優(yōu)先級低,所以最后算接癌,typeof a的結(jié)果是'number',number + b的結(jié)果是'number2'心赶,由于||的前一條運算結(jié)果是true,所以||后不計算缺猛,(typeof a) + b || c > 0返回'number2',然后賦值給val
var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)
先輸出字符串'bb'缨叫,后輸出undefined
&&優(yōu)先級較低, d==5 先執(zhí)行荔燎,返回true耻姥,所以后面的console.log('bb')會執(zhí)行,執(zhí)行后輸出'bb'并返回undefined有咨, true && undefined結(jié)果是undefined
var data2 = d = 0 || console.log('haha')
console.log(data2)
先輸出字符串"haha"琐簇,再輸出undefined
=運算符優(yōu)先級最低,所以先執(zhí)行 0 || console.log("haha"),結(jié)果是undefined座享,得到結(jié)果后婉商,再賦值給d與data2
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)
輸出數(shù)字2
!!"Hello"結(jié)果是true, (!"world",!!"from here")返回的是!!"from here!!"的結(jié)果(結(jié)果為true)渣叛,true + true的結(jié)果是2