1.JavaScript 定義了幾種數(shù)據(jù)類型? 哪些是原始類型?哪些是復(fù)雜類型?原始類型和復(fù)雜類型的區(qū)別是什么?
- 定義的數(shù)據(jù)類型有:數(shù)值、字符串、布爾、對象、undefined、null
- 原始類型:數(shù)值、字符串、布爾
- 復(fù)雜類型:對象
- 區(qū)別:原始類型數(shù)據(jù)不能再細(xì)分;復(fù)雜類型,是由多個原始類型合成,可以看作一個存儲各種值的容器。
至于undefined,null一般將它們看成兩個特殊值。
2.typeof和instanceof的作用和區(qū)別?
- typeof 一般用于判斷原始類型,還可以用于判斷變量是否賦值.
- instanceof一般用于判斷一個變量是否為某個對象的實例。
3.如何判斷一個變量是否是數(shù)字、字符串、布爾、函數(shù)
用typeof運算符進行判斷數(shù)字、字符串、布爾、函數(shù),分別返回number, string,boolean,fuction。
4.NaN是什么? 有什么特別之處?
NaN是指NOT a Number,用于表示一個本來要返回數(shù)值的操作數(shù)未返回數(shù)值的情況(這樣就不會拋出錯誤了),就會返回“NaN”值。NaN 值非常特殊,因為它“不是數(shù)字”,所以任何數(shù)跟它都不相等,甚至 NaN 本身也不等于 NaN 。
5.如何把非數(shù)值轉(zhuǎn)化為數(shù)值?
使用Number() 、parseInt() 、parseFloat()把非數(shù)值轉(zhuǎn)化為數(shù)值
- Number():當(dāng)轉(zhuǎn)換原始類型數(shù)據(jù)時,它們都能被轉(zhuǎn)成數(shù)值或NaN,Number函數(shù)將字符串轉(zhuǎn)為數(shù)值,要比parseInt函數(shù)嚴(yán)格很多。基本上,只要有一個字符無法轉(zhuǎn)成數(shù)值,整個字符串就會被轉(zhuǎn)為NaN;Number方法的參數(shù)是對象時,將返回NaN,除非是包含單個數(shù)值的數(shù)組。
- parseInt() :字符串若第一個數(shù)為數(shù)值,則返回數(shù)值,返回值為第一個數(shù)值到最后一個數(shù)值,數(shù)值之間沒有字母,只取整數(shù),遇到小數(shù)點后面的數(shù)就舍棄,若第一個數(shù)為字母,則直接返回NaN;Boolean、undefined、null返回NaN;數(shù)組返回數(shù)組的第一個數(shù)值;狹義的對象、函數(shù)返回NaN。
- parseFloat():和parseInt()類似,只是遇到小數(shù)會保留。
6.==與===有什么區(qū)別
- ==:相等運算符,比較不同類型的數(shù)據(jù)時,相等運算符會先將數(shù)據(jù)進行類型轉(zhuǎn)換,然后再用嚴(yán)格相等運算符比較。類型轉(zhuǎn)換規(guī)則如下:
- 原始類型的數(shù)據(jù)會轉(zhuǎn)換成數(shù)值類型再進行比較。
- 對象(這里指廣義的對象,包括數(shù)組和函數(shù))與原始類型的值比較時,對象轉(zhuǎn)化成原始類型的值,再進行比較。
- undefined和null與其他類型的值比較時,結(jié)果都為false,它們互相比較時結(jié)果為true。絕大多數(shù)情況下,對象與undefined和null比較,都返回false。只有在對象轉(zhuǎn)為原始值得到undefined時,才會返回true,這種情況是非常罕見的。
- 相等運算符隱藏的類型轉(zhuǎn)換,會帶來一些違反直覺的結(jié)果。
'' == '0' // false
0 == '' // true
0 == '0' // true
2 == true // false
2 == false // false
false == 'false' // false
false == '0' // true
false == undefined // false
false == null // false
null == undefined // true
' \t\r\n ' == 0 // true
- ===:嚴(yán)格相等運算符,它不僅比較值,而且還比較值的類型。比較規(guī)則:
- 如果兩個值的類型不同,直接返回false;
- 同一類型的原始類型的值(數(shù)值、字符串、布爾值)比較時,值相同就返回true,值不同就返回false;
- 兩個復(fù)合類型(對象、數(shù)組、函數(shù))的數(shù)據(jù)比較時,不是比較它們的值是否相等,而是比較它們是否指向同一個對象;
- undefined和null與自身嚴(yán)格相等。
7.break與continue有什么區(qū)別
- break:強制退出循環(huán)體,執(zhí)行循環(huán)后的語句。
- continue:退出本次循環(huán),執(zhí)行下一個循環(huán)。
注意:如果存在多重循環(huán),不帶參數(shù)的break語句和continue語句都只針對最內(nèi)層循環(huán)。
8.void 0 和 undefined在使用場景上有什么區(qū)別
undefined 現(xiàn)常用于全局環(huán)境,不能被重寫。但是在局部作用域中,還是可以被重寫的。
void 是不能被重寫的。 void 運算符能對給定的表達(dá)式進行求值,然后返回 undefined,最短的是void 0,所以用void 0 來表示undefined, void 0是在局部作用域中替代undefined的最佳選擇,避免undefined被改寫。
9.以下代碼的輸出結(jié)果是?為什么?
console.log(1+1); // 2 數(shù)值類型的值相加
console.log("2"+"4"); // "24" 字符串類型變量進行拼接
console.log(2+"4"); // "24" 字符串和數(shù)值相加會把數(shù)值轉(zhuǎn)換為字符串再進行拼接
console.log(+"4"); // 4 在只有一個字符串參數(shù)的時候會嘗試將其轉(zhuǎn)換為數(shù)字
10. 以下代碼的輸出結(jié)果是?
var a = 1;
a+++a; // 3 ,++優(yōu)先級高于 + ,先計算a++ ,1+2=3
typeof a+2; // "number2" , typeof 優(yōu)先級高于 + ,先求type a ,"number" + 2
11. 以下代碼的輸出結(jié)果是? 為什么
var a = 1;
var b = 3;
console.log( a+++b );
結(jié)果為4 , a+++b = (a++)+b = 1+3 =4
12. 遍歷數(shù)組,把數(shù)組里的打印數(shù)組每一項的平方
var arr = [3,4,5];
for(i in arr) {
console.log(arr[i]*arr[i]);
}
13. 遍歷 JSON, 打印里面的值
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for (key in obj) {
console.log(obj[key]);
}
14.
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0
console.log(val)
// 'number2', typeof 優(yōu)先級高于'+',typeof a + b 為'number2'為true,由于運算符是||,左邊true則返回左邊的值'number2'
var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)
// "bb", 運行 console.log("bb")時的輸出;
// undefined, data的值,data = true && console.log("bb"), console.log("bb")的值為undefined, 由于運算符為&&,第一個運算子的布爾值為true,則返回第二個運算子的值,則data為undefined
var data2 = d = 0 || console.log('haha')
console.log(data2)
// "haha", 運行console.log("haha")時的輸出;
// undefined, 由于運算符為||,左運算子的布爾值為false,則返回右運算子的值,則data2為undefined
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)
// 2 , !!"Hello" + (!"world", !!"from here!!") = !!(true)+(!true,!!true)=!!true + !!true =true+ true= 2
//逗號運算符用于對兩個表達(dá)式求值,并返回后一個表達(dá)式的值。