1、JavaScript 定義了幾種數(shù)據(jù)類型? 哪些是原始類型?哪些是復(fù)雜類型?原始類型和復(fù)雜類型的區(qū)別是什么?
數(shù)據(jù)類型:number string null undefined boolean symbol object
原始類型:number string boolean
復(fù)雜類型:object
區(qū)別:原始數(shù)值是最基本的類型不能再細(xì)分了;復(fù)雜類型是多個原始類型的值的合成,可以看作是一個存放各種值的容器。
2、typeof和instanceof的作用和區(qū)別?
a)typeof運(yùn)算符可以返回一個值的數(shù)據(jù)類型,可能有以下結(jié)果:number string boolean undefined function object .我們可以使用typeof來獲取一個變量是否存在,如if(typeof a!="undefined"){alert("ok")},而不要去使用if(a)因?yàn)槿绻鸻不存在(未聲明)則會出錯,對于Array,Null等特 殊對象使用typeof一律返回object,這正是typeof的局限性。
b)instanceof運(yùn)算符可以用來判斷某個構(gòu)造函數(shù)的prototype屬性是否存在于另外一個要檢測對象的原型鏈上。 如var a=new Array();alert(a instanceof Array);會返回true,同時(shí)alert(a instanceof Object)也會返回true;這是因?yàn)锳rray是object的子類。
3、如何判斷一個變量是否是數(shù)字、字符串、布爾、函數(shù)
利用typeof就可以判斷,因?yàn)閿?shù)值、字符串、布爾值、函數(shù)分別返回number、string、boolean、function。
4、NaN是什么? 有什么特別之處?
NaN是not a number,表示非數(shù)字,NaN和任何值都不相等,包括自己。
5、如何把非數(shù)值轉(zhuǎn)化為數(shù)值?
a)Number()將參數(shù)轉(zhuǎn)換成數(shù)字類型
b)parseInt()將參數(shù)轉(zhuǎn)化為整數(shù)
c)parseFloat()將參數(shù)轉(zhuǎn)化成浮點(diǎn)數(shù)
Number()的強(qiáng)制類型轉(zhuǎn)換與parseInt()和parseFloat()方法的處理方式相似,只是它轉(zhuǎn)換的是整個值,而不是部分值。parseInt()和parseFloat()方法只轉(zhuǎn)換第一個無效字符之前的字符串。如“3.4.5”被轉(zhuǎn)換成“3.4”,用Number()進(jìn)行強(qiáng)制類型轉(zhuǎn)換將返回NAN,如果字符串值能被完整地轉(zhuǎn)換,Number()將判斷是調(diào)用parseInt()還是parseFloat()
parseFloat("3.4.5")
//3.4
Number("3.4.5")
//NaN
6、==與===有什么區(qū)別
==表示近似相等,等號兩邊的參數(shù)經(jīng)過轉(zhuǎn)換后值相等即可輸出true,否則輸出false;===表示絕對相等,參數(shù)不會轉(zhuǎn)換,相等輸出true ,否則false。
7、break與continue有什么區(qū)別
break 用于強(qiáng)制退出循環(huán)體,執(zhí)行循環(huán)后面的語句
continue 用于退出本次循環(huán),執(zhí)行下次循環(huán)
for(var i = 1; i< 10; i++){
if(i % 4 === 0){
break;
}
console.log(i);
}
// 1,2,3
for(var i = 1; i< 10; i++){
if(i % 4 === 0){
continue;
}
console.log(i);
}
//1,2,3,5,6,7,9
8、void 0 和 undefined在使用場景上有什么區(qū)別
void 0 運(yùn)算返回值始終都是 undefined
undefined 可以在局部作用域中被覆寫
9、以下代碼的輸出結(jié)果是?為什么?
console.log(1+1); //2,數(shù)值相加
console.log("2"+"4"); //“24”,字符串拼接
console.log(2+"4"); //“24”,第一個number轉(zhuǎn)換為string后字符串拼接
console.log(+"4"); //4 ,當(dāng)只有一個字符串時(shí),類型會發(fā)生改變
console.log(+"b"); //NaN ,當(dāng)只有一個字符串時(shí),類型會發(fā)生改變
var a = 1;
a+++a; //(a++)+a,++的運(yùn)算符優(yōu)先于+
typeof a+2; //(typeof a) + 2,typeof優(yōu)先級高于+,"number2"
var a = 1;
var b = 3;
console.log( a+++b ); //4 ,(a++)+b,++的運(yùn)算符優(yōu)先于+
10、遍歷數(shù)組以及對象
var arr = [3,4,5]
for(let i =0;i<arr.length;i++){
console.log(arr[i]*arr[i])
}
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for(let key in obj){
console.log(obj[key])
}
11、以下代碼輸出結(jié)果是? 為什么
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0
console.log(val)
//number2,根據(jù)優(yōu)先級先算((typeof a) + b )|| (c >0),("number" + 2) || (c >0),||前面的部分為真,則后面的不管,則console.log("number2") ,即為number2
var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)
//undefined
var data2 = d = 0 || console.log('haha')
console.log(data2)
//undefined
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)
// 2,!為邏輯非運(yùn)算,取值的邏輯值相反,兩個!即相當(dāng)于值原本的邏輯值。逗號運(yùn)算符返回第二項(xiàng),又因?yàn)榉强兆址倪壿嬛禃r(shí)true,而布爾值做加法運(yùn)算時(shí),true轉(zhuǎn)為1,false轉(zhuǎn)為0。因此運(yùn)算如下:true + (!"world", !!"from here!!") => true + !!"from here!!" => true + true => 1 + 1 => 2