1.JavaScript 定義了幾種數據類型? 哪些是原始類型?哪些是復雜類型?原始類型和復雜類型的區別是什么?
JavaScript的數據類型:
- 數值(number):整數和小數
- 字符串(string):字符組成的文本
- 布爾值(boolean):true(真)和false(假)兩個特定值
- undefined:表示未定義或者不存在,即此處目前沒有任何值
- null:表示空缺。即此處應該有一個值,但目前為空
- 對象(object):各種值組成的集合
-Symbol,ES6新類型,實例唯一且不可改變。
通常,我們將數值、字符串、布爾值稱為原始類型(primitive type)的值,即它們是最基本的數據類型,不能再細分了。
而將對象稱為合成類型(complex type)的值,因為一個對象往往是多個原始類型的值的合成,可以看作是一個存放各種值的容器。
至于undefined和null,一般將它們看成兩個特殊值。
2.typeof和instanceof的作用和區別?
typeof運算符 與 instanceof運算符 都可以用來確定一個值到底是什么類型
區別:
- typeof運算符可以返回一個值的數據類型,數據類型以字符串表示,可能有以下結果:
由于typeof {} typeof []返回的都是"object",無法區分數組與對象的類型,可以用instanceof運算符可以做到。
typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"
function f() {}
typeof f // "function"
typeof undefined // "undefined"
除此以外,其他情況都返回object。
typeof window // "object"
typeof {} // "object"
typeof [] // "object"
typeof null // "object"
-
instanceof 運算符用來檢測 constructor.prototype 是否存在于參數 object 的原型鏈上。
instanceof運算符語法:object(要檢測的對象) instanceof constructor(某個構造函數)
例如:
var a=[];
console.log(a instanceof Array); //true
console.log(a instanceof Object); //true
會打印兩次true,因為數組對象屬于Array類型的同時又屬于Object類型。
3. 如何判斷一個變量是否是數字、字符串、布爾、函數
var num = 123;
//判斷是否number類型
if(typeof num === 'number'){
console.log('is a number');
}
var str = '123';
//判斷是否字符串
if(typeof str === 'string'){
console.log('is string');
}
var boo = true;
//判斷是否布爾類型
if(typeof boo === 'boolean'){
console.log('is boolean');
}
var fn = function(){};
//判斷是否函數
if(typeof fn === 'function'){
console.log('is function');
}
4. NaN是什么? 有什么特別之處?
NaN含義是Not a Number,表示非數字,NaN和任何值都不相等,包括自己
NaN == NaN; //false
5.如何把非數值轉化為數值?
有三個函數可以把非數值轉換為數值
- Number()
- parseInt()
- parseFloat()
Number規則相當復雜而且不合理,幾乎不使用,常用的是后兩個,兩個規則類似
- 忽略字符串前面的空白字符,找到第一個非空白字符
- 如果第一個字符不是-或者數字返回NaN
- 如果是繼續解析,直到非數值模式為止
- 0開頭會當做八進制,0x開頭會當做十六進制,但是可以指定第二個參數指定基數
parseInt('blue'); //NaN
parseInt('-23ABS'); // -23
parseInt('0xf1'); // 241
parseInt('101', 2); // 5
6.==與===有什么區別
我們知道可以使用==或===判斷兩個值的相等性,其中區別相信大家清楚,===是嚴格意義的相等,只需注意NaN和NaN不等就行了。
而使用==的時候,javascript會幫我們做類型轉換,造成一些匪夷所思的結果,那么使用==的時候會在哪些情況下做類型轉換,又會換成什么樣子?
- 如果兩個值類型相同,則執行嚴格相等的運算
- 如果兩個值的類型不同
- 如果一個是null,一個是undefined,那么相等
- 如果一個是數字,一個是字符串,先將字符串轉為數字,然后比較
- 如果一個值是true/false則將其轉為1/0比較
- 如果一個值是對象,一個是數字或字符串,則嘗試使用valueOf和toString轉換后比較
- 其它就不相等了
null==undefined; //true
NaN==NaN; //false
"1"==true; //true
true == 1; //ture true會轉換成number,也就是1
true == 2; //false 當然 1 不等于 2
區別:
- 對于string,number等基礎類型,==和===是有區別的
- 不同類型間比較,==之比較“轉化成同一類型后的值”看“值”是否相等,===如果類型不同,其結果就是不等
- 同類型比較,直接進行“值”比較,兩者結果一樣
對于Array,Object等高級類型,==和===是沒有區別的
進行“指針地址”比較基礎類型與高級類型,==和===是有區別的
- 對于==,將高級轉化為基礎類型,進行“值”比較
- 因為類型不同,===結果為false
7. break與continue有什么區別
區別:
- break 用于強制退出循環體,執行循環后面的語句
- continue 用于退出本次循環,執行下次循環
8.void 0 和 undefined在使用場景上有什么區別
undefined可以被覆蓋,如:
(function(){
var undefined = 123,a;
console.log('undefined = ' + undefined);
//此時相當于判斷 123 === a,并不是預想中的判斷a是否未定義
console.log(undefined == a);
})();
void運算符的作用是執行一個表達式,然后返回undefined
常用作判斷變量是否為undefined,可以防止上面undefined被覆蓋的情況,如:
if(void 0 === a){}
9. 以下代碼的輸出結果是?為什么?
//輸出數字2,+運算符兩端的參數都是number類型,所以是加法運算,輸出運算結果2
console.log(1 + 1);
//輸出字符串24, +運算符兩端的參數都是string類型,所以+的作用是連接兩個字符串
console.log("2" + "4");
//輸出字符串24,兩個參數都是字符串或在有一個參數是字符串的情況下會把另外一個參數轉換為字符串做字符串拼接
console.log(2+ "4");
//輸出數字4, 在只有一個字符串參數的時候會嘗試將其轉換為數字
console.log(+"4");
10. 以下代碼的輸出結果是?
var a = 1;
//輸出數字2,++運算符的優先級比+運算符高,相當于(a++)+a,(a++)先運算再賦值,所以a++結束后,a=2,1+2輸出3
a+++a;
//輸出字符串number2,相當于(typeof a)+2,(typeof a)的值是"number","number"+2的結果是"number2"
typeof a+2;
11.以下代碼的輸出結果是? 為什么
var a = 1;
var b = 3;
//輸出數字4,相當于(a++)+b,(a++)的結果是1,b=3,1+3=4,所以輸出4
console.log( a+++b );
12.遍歷數組,把數組里的打印數組每一項的平方
var arr = [3,4,5];
for(var i=0,len=arr.length; i<len; i++){
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;
//輸出字符串"number2",相當于(typeof a) + b || c > 0, || 運算符優先級最低,所以最后算,typeof a的結果是'number',number + b的結果是'number2',由于||的前一條運算結果是true,所以||后不計算,(typeof a) + b || c > 0返回'number2',然后賦值給val
console.log(val);
var d = 5;
var data = d ==5 && console.log('bb')
//先輸出字符串'bb',后輸出undefined, &&優先級較低, d==5 先執行,返回true,所以后面的console.log('bb')會執行,執行后輸出'bb'并返回undefined, true && undefined結果是undefined
console.log(data)
var data2 = d = 0 || console.log('haha');
//先輸出字符串"haha",再輸出undefined, =運算符優先級最低,所以先執行 0 || console.log("haha"),結果是undefined,得到結果后,再賦值給d與data2
console.log(data2)
var x = !!"Hello" + (!"world", !!"from here!!");
//輸出數字2, !!"Hello"結果是true, (!"world",!!"from here")返回的是!!"from here!!"的結果(結果為true),true + true的結果是2
console.log(x)