1. JavaScript 定義了幾種數據類型? 哪些是原始類型?哪些是復雜類型?原始類型和復雜類型的區別是什么?
- JavaScript的數據類型,共有六種。
1.數值(number):整數和小數(比如1和3.14)
2.字符串(string):字符組成的文本(比如"Hello World")
3.布爾值(boolean):true(真)和false(假)兩個特定值
4.undefined:表示“未定義”或不存在,即此處目前沒有任何值
5.null:表示空缺,即此處應該有一個值,但目前為空
6.對象(object):各種值組成的集合 - 原始類型:數值、字符串、布爾值
復雜類型:對象 - 一個復雜類型往往是多個原始類型的值的合成,可以看作是一個存放各種值的容器,而原始類型最基本的數據類型,不能再細分了。
- 棧存儲:因為原始類型占據空間固定,是簡單的數據段,為了便于提升變量查詢速度,將其存儲在棧(stack)中,它們的值直接存儲在變量訪問的位置。
堆存儲:復雜類型其在內存中的大小是未知的,因為復雜類型可以包含任何值,而不是一個特定的已知,所以不能將其存放在棧中,否則會降低變量查詢速度,因此其存儲在堆(heap)中,存儲在變量處的值是一個指針,指向存儲對象的內存處。
2. typeof和instanceof的作用和區別?
- typeof 運算符可以返回一個值的數據類型,數值、字符串、布爾值分別返回number、string、boolean,函數返回function,undefined返回undefined,除此以外,其他情況都返回object。
- instanceof 運算符用來判斷一個對象是否是由一個構造函數所創建的實例。
3. 如何判斷一個變量是否是數字、字符串、布爾、函數
typeof 運算符可以判斷一個變量的數據類型,數值、字符串、布爾值分別返回number、string、boolean,函數返回function。
4. NaN是什么? 有什么特別之處?
NaN是Not a Number,表示不是一個數字。NaN和任何值都不相等,包括自己。
5. 如何把非數值轉化為數值?
使用一下三個函數可以把非數值轉化為數值:
1.Number()
2.parseInt()
3.parseFloat()
6. ==與===有什么區別
==是相等運算符,===是嚴格運算符。
==僅會比較值的大小,當類型不相等時javascript會幫我們做類型轉換,而===不僅會比較值的大小,還會比較數據的類型是否相同。NaN和NaN不等。
7. break與continue有什么區別
- break 用于強制退出循環體,執行循環后面的語句。break關鍵字會使程序跳出switch語句,很多編程規范強調必須添加break,不添加不會有語法錯誤,程序會多次判斷case,進入相應流程。
- continue 用于退出本次循環,執行下次循環。
8. void 0 和 undefined在使用場景上有什么區別
void運算符的作用是執行一個表達式,然后返回undefined,void 0會返回undefined。
undefined可以被重寫,undefined其實是window的一個屬性,可以給它賦值,這樣undefined就不再是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;
結果:“number2”
typeof的優先級比加減乘除高。
a+++a與(a++)+a相等,表示a先運算,然后再自增,所以是1+1=2,a變為2,typeof a+2,先運算typeof a返回“number”,再和2拼接。
11. 以下代碼的輸出結果是? 為什么
var a = 1;
var b = 3;
console.log( a+++b );
結果:4
a+++b與(a++)+b相等,表示a先運算,然后在自增,所以是1+3=4,a變為2。
12. 遍歷數組,把數組里的打印數組每一項的平方
var arr = [3,4,5]
var arr = [3,4,5];
var new_arr = [];
for(var i = 0;i<arr.length;i++) {
new_arr[i] = arr[i]*arr[i];
}
console.log(new_arr);
13. 遍歷 JSON, 打印里面的值
var obj = { name: 'hunger', sex: 'male', age: 28 }
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for(var keys in obj){
console.log(keys+":"+obj[keys]);
};
14. 以下代碼輸出結果是? 為什么?
var a = 1, b = 2, c = 3; var val = typeof a + b || c >0 console.log(val)
結果:number2
typeof的優先級比加減乘除高
邏輯與、邏輯或優先級很低,不如加減乘除
只要 || 為true,無論 || 后面是true還是false,結果都返回前面的true。
typeof a + b等于(typeof a)+b
var d = 5; var data = d ==5 && console.log('bb') console.log(data)
結果:bb
賦值運算符的優先級相當的低,比相等運算符低。==比&&優先級高
只要&&是false,無論&&后面是true還是false,結果都將返回false。
console.log('bb')為“bb”,(d ==5) && 'bb'返回“bb”,即data = “bb”。
var data2 = d = 0 || console.log('haha') console.log(data2)
結果:haha
0 || console.log('haha')返回“haha”,data2 = d = “haha”由右至左賦值。
var x = !!"Hello" + (!"world", !!"from here!!"); console.log(x)
結果:2
!!"Hello"布爾值為true,!"world"為false,!!"from here!!"為true,true轉換為1,flase轉換為0。即1+(1+0)=2。