1. JavaScript 定義了幾種數據類型? 哪些是原始類型?哪些是復雜類型?原始類型和復雜類型的區別是什么?
- 數值 number:整數和小數
- 字符串 string:字符組成的文本
- 布爾型 boolean:true 和 false 兩個特定值
- undefined:表示“未定義”或“不存在”,即此處目前沒有任何值
- null:表示空缺,即此處應該有一個值,但目前為空
- 對象 object:各種值組成的集合,可以看為一個容器
數值、字符串、布爾值稱為原始類型(primitive type)的值,即它們是最基本的數據類型, 不能再拆分。
將對象稱為復雜類型(complex type)的值,因為一個對象往往是多個原始類型的值的合成,可以看作是一個存放各種值的容器。
undefined 和 null,一般被看作兩個特殊值。
2. typeof 和 instanceof 的作用和區別?
typeof
用以獲取一個變量或者表達式的類型,typeof 一般只能返回如下幾個結果:
number,boolean,string,function,undefined,object(包括 NULL,數組,對象)。
typeof (123); //返回"number"
typeof ("123"); //返回"string"
我們可以使用typeof來獲取一個變量是否存在,如 if ( typeof v != "undefined" ) { },而不要去使用if(v)因為如果v不存在(未聲明)則會出錯,錯誤顯示 v 沒有聲明。
由于 typeof 遇到 null、數組、對象時都會返回object類型,所以當我們要判斷一個對象是否是數組時、判斷某個變量是否是某個對象的實例時,要選擇使用另一個關鍵語法instanceof
。
instanceof 用于判斷一個變量是否某個對象的實例,如
var a=new Array();
console.log(a instanceof Array);
會返回 true,同時 alert(a instanceof Object) 也會返回true;這是因為 Array 是 object 的子類。
再如:
function test(){};
var a=new test();
console.log(a instanceof test);
會返回 true。
3. 如何判斷一個變量是否是數字、字符串、布爾、函數
利用 typeof( ) 操作符,其可以返回 undefined/boolean/number/string/function/object 等字符串,用以判斷變量類型。
4. NaN 是什么? 有什么特別之處?
NaN 是非數值(Not a number)的意思,其自身是一個特殊的數值,用于表示一個本來要返回數值的操作數未返回數值的情況,這樣子就可以避免拋出錯誤。
NaN 有兩個特點:
- 任何設計 NaN 的操作都會返回 NaN;
- NaN 與任何值都不相等,包括 NaN 本身,
NaN==NaN
會返回 false
5. 如何把非數值轉化為數值?
有三個函數可以把非數值轉換為數值
- Number()
- parseInt()
- parseFloat()
利用+
號也可以將非數值轉化為數值
6. ==與===有什么區別
===是嚴格意義的相等,只需注意 NaN 和 NaN 不等就行了。<span style="color:red">一般寫代碼都要用===。</span>而使用==的時候,javascript會幫我們做類型轉換,造成一些特別的結果:
- 如果兩個值類型相同,則執行嚴格相等的運算
- 如果兩個值的類型不同
- 如果一個是 null,一個是 undefined,那么相等
- 如果一個是數字,一個是字符串,先將字符串轉為數字,然后比較
- 如果一個值是 true/false 則將其轉為 1/0 比較
- 如果一個值是對象,一個是數字或字符串,則嘗試使用 valueOf 和 toString 轉換后比較
7. break與continue有什么區別
break 和 continue 語句用于在循環中精準的控制代碼的執行,其中 break 語句會立即退出循環,強制繼續執行循環后面的語句。而 continue 語句雖然也是立即退出循環,但退出循環后會從循環的頂部繼續執行。
var num = 0;
for(var i=0; i<10; i++) {
if(i==5){
break;
}
num++;
}
console.log(num);
// 循環結束后,num 值為4,i 總共循環5次,第5次時 break 循環打斷,num++ 沒有再執行
var num = 0;
for(var i=0; i<10; i++) {
if(i==5){
continue;
}
num++;
}
console.log(num);
//循環結束后,num 值為9,i 循環10次,第5次時 continue 將下一步 num++ 跳過,直接進行下一次循環
8. void 0 和 undefined 在使用場景上有什么區別
undefined 并不是保留字,而是全局對象的一個屬性,在 ES5 之前的版本中可以被重寫,在某些極端情況下使用 undefined 會出現一些錯誤。
void 運算符能對給定的表達式進行求值,然后返回 undefined。也就是說,void 后面隨便跟上一個表達式,返回的都是 undefined,可以完美代替 undefined。其中最短的就是 void 0 了,其實 void 1,void (1+1),void (0) 或者 void “hello”,void (new Date()) 等都是一樣的。
最重要的是,void 是不能被重寫的(cannot be overidden)。并且在 ES5 大環境下,用 void 0 代替 undefined 能節省不少字節的大小。
9. 以下代碼的輸出結果是?為什么?
console.log(1+1); //2,普通的數值相加
console.log("2"+"4"); //"24",字符串相加結果是兩個字符串的拼接
console.log(2+"4"); // "24",數值和字符串相加,數值轉化為字符串,然后進行字符串拼接
console.log(+"4"); // 4,對字符串進行單純+運算,結果將字符串轉化為數值
10. 以下代碼的輸出結果是?
var a = 1;
a+++a; //
typeof a+2; //number
輸出是 "number2",由于最后一行運算根據優先級,先進行 typeof a 運算得到字符串 "number",然后進行字符串和數值相加運算得到"number2"
11. 以下代碼的輸出結果是? 為什么
var a = 1;
var b = 3;
console.log( a+++b );
輸出為4,因為 a+++b 先進行 a++ 運算,此時 a 的數值加1但是 a++ 的數值依然保持為1,然后與 b 做相加運算得到結果為4。
12. 遍歷數組,把數組里的打印數組每一項的平方
var arr = [3,4,5]
for (var item in arr) {
console.log(arr[item] * arr[item]);
}
13. 遍歷 JSON, 打印里面的值
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for (var item in obj) {
console.log(obj[item]);
}
14. 以下代碼輸出結果是? 為什么 (選做題目)
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0;
console.log(val) ;
var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)
var data2 = d = 0 || console.log('haha')
console.log(data2)
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0;
// 運算順序為:var val = {[(typeof a) + b] || (c > 0)},
// 由于[(typeof a) + b]的值為 "number2",
// 被邏輯 || 判斷為真,所以全部運算式返回[(typeof a) + b] 的值
console.log(val) ;
// 此時顯示"number2"
var d = 5;
var data = d ==5 && console.log('bb')
// 運算順序為:var data = [(d == 5) && console.log('bb')]
// (d==5)為真,此時邏輯 && 運算返回 console.log('bb')的值即 undefined
// 同時會先顯示出'bb',然后 undefined 被賦值給 data
console.log(data)
// 顯示 undefined
var data2 = d = 0 || console.log('haha')
// 運算順序為:var data2 = [d = (0 || console.log('haha'))]
// 0 為假此時邏輯 || 運算返回 console.log('haha') 的值即為 undefined
// 同時會先顯示出 'haha',然后將 undefined 賦值給 data2
console.log(data2)
// 顯示 undefined
var x = !!"Hello" + (!"world", !!"from here!!");
// 運算順序為:var x = !!"Hello" + (!"world", !!"from here!!");
// 結果為2,空字符串為false,非空則為true,var x = true+(false+true)
// true為1,1+1=2。
console.log(x)