1.JavaScript 定義了幾種數據類型? 哪些是原始類型?哪些是復雜類型?原始類型和復雜類型的區別是什么?
- 數值(number):整數和小數(比如1和3.14)
- 字符串(string):字符組成的文本(比如"Hello World")
- 布爾值(boolean):true(真)和false(假)兩個特定值
- undefined:表示“未定義”或不存在,即此處目前沒有任何值
- null:表示空缺,即此處應該有一個值,但目前為空
- 對象(object):各種值組成的集合。對象又可以分成三個子類型:狹義的對象(object),數組(array),函數(function),正則表達式 (regexp)。
數值、字符串、布爾值稱為原始類型(primitive type)的值,即它們是最基本的數據類型,不能再細分了。
將對象稱為復雜類型(complex type)的值,因為一個對象往往是多個原始類型的值的合成,可以看作是一個存放各種值的容器。
至于undefined和null,一般將它們看成兩個特殊值
2.typeof和instanceof的作用和區別?
- **typeof **是一元運算符,返回值為字符串,該字符串用來說明運算數的數據類型。
- 用來獲取運算數的數據類型。返回的值有number、boolean、undefined、function、object、string
- number:數字會返回number類型
- boolean:boolean值只有true和false
- undefined:當變量未被聲明時會返回undefined,這與
var name;alert(name)
;是不一樣的。后者是指變量已聲明,但未被初始化。
function:當運算數為函數時,返回function - obeject:對象、數組、null會返回object。正因為typeof遇到數組、null都會返回object,所以我們要判斷某個對象是否是數組或者某個變量是否是對象的實例時就要使用instanceof
- string:當運算數為字符串時會返回string。
2.** instanceof**用于判斷某個變量是否是某個對象的實例,返回值為true或false。
var array=new Array();
var object=new Object();
var regexp=new RegExp();
function func(){};
var func1=new func();
alert(array instanceof Array); //true
alert(object instanceof Object); //true
alert(regexp instanceof RegExp); //true
alert(func1 instanceof func); //true
typeof 和instanceof 的目的都是檢測變量的類型,兩個的區別在于typeof一般是檢測的是基本數據類型,instanceof主要檢測的是引用類型!
3.如何判斷一個變量是否是數字、字符串、布爾、函數。
typeof 123 === 'number' 判斷是否是數字
typeof '123' === 'string' 判斷是否為字符串
typeof true ==='boolean' 判斷是否為布爾
typeof a ==='function' 判斷是否為函數
4.NaN是什么? 有什么特別之處?
NaN含義是Not a Number,表示非數字,NaN和任何值都不相等,包括自己。
5.如何把非數值轉化為數值?
有三個函數可以把非數值轉換為數值:
- Number()
- parseInt()
- parseFloat()
6.==與===有什么區別?
==是值相等,javascript會幫我們做類型轉換,
- 如果兩個值類型相同,則執行嚴格相等的運算
- 如果兩個值的類型不同
- 如果一個是null,一個是undefined,那么相等
- 如果一個是數字,一個是字符串,先將字符串轉為數字,然后比較
- 如果一個值是true/false則將其轉為1/0比較
- 如果一個值是對象,一個是數字或字符串,則嘗試使用valueOf和toString轉換后比較
- 其它就不相等了
===是嚴格意義的相等,需要數值和數據類型都要相等。
7.break與continue有什么區別?
break 用于強制退出循環體,執行循環后面的語句;
**continue **用于退出本次循環,執行下次循環。
8.void 0 和 undefined在使用場景上有什么區別?
**void **會執行后面的表達式并返回 undefined,但是某些情境下 undefined 是可以被賦值的,比如在函數中,這樣的話就不能用 undefined 來進行判斷了。所以用void 0返回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; //輸出3,理解為a++ + a,++運算符比+運算優先級更高,a++結果為1,但是a已經變成了2,所以結果為1+2=3。
typeof a+2; //輸出"number2",typeof的優先級高于+運算,所以輸出字符串number,字符串與數字相加時,數字轉換為字符串,然后字符串拼接就變成"number2"
11.以下代碼的輸出結果是? 為什么?
var a = 1;
var b = 3;
console.log( a+++b ); //輸出結果為4,++運算優先于+運算,理解為(a++)+b,a++結果為1,運算為1+3=4。
12. 遍歷數組,把數組里的打印數組每一項的平方。
var arr = [3,4,5]
//for(i=0;i<arr.length;i++){console.log(arr[i]*arr[i])}
//輸出結果為9 16 25。
13.遍歷 JSON, 打印里面的值。
// json 解析
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for(a in obj){
console.log(a+":"+obj[a])
}
//結果name:hunger sex:male age:28
14.以下代碼輸出結果是? 為什么 (選做題目)。
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0;
console.log(val); //結果為number2。val值為"number2",||前面為ture,返回前面的值,為false,返回后面的值。
var d = 5;
var data = d ==5 && console.log('bb');
console.log(data);//結果為bb,data值為bb,&&前面為ture,返回后面的值,為false返回后面的值。
var data2 = d = 0 || console.log('haha');
console.log(data2);//結果為haha,只要“||”前面為false,無論“||”后面是true還是false,結果都返回“||”后面的值。
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x);//結果為2,空字符串為false,非空則為true,var x = true+(false+true),true為1,false為0,1+1=2。
能被轉換為false的值有null, 0, NaN, 空字符串("")和undefined。