JavaScript 定義了幾種數(shù)據(jù)類型? 哪些是原始類型?哪些是復(fù)雜類型?原始類型和復(fù)雜類型的區(qū)別是什么?
- JavaScript的數(shù)據(jù)類型:
- 數(shù)值(number):整數(shù)和小數(shù)(比如1和3.14)
- 字符串(string):字符組成的文本(比如"Hello World")
- 布爾值(boolean):true(真)和false(假)兩個(gè)特定值
- undefined:表示“未定義”或不存在,即此處目前沒有任何值
- null:表示空缺癌椿,即此處應(yīng)該有一個(gè)值是鬼,但目前為空
- 對(duì)象(object):各種值組成的集合
- 原始類型
原始類型是最基本的數(shù)據(jù)類型,不能再細(xì)分了袱贮。數(shù)值鸠真、字符串呼巷、布爾值都是原始類型。 - 復(fù)雜類型是多個(gè)原始類型的值的合成捞烟,可以看作是一個(gè)存放各種值的容器薄声。“對(duì)象”被稱為復(fù)雜類型题画。
- 原始類型和復(fù)雜類型的區(qū)別
如上述
typeof和instanceof的作用和區(qū)別?
- typeof運(yùn)算符可以返回一個(gè)值的數(shù)據(jù)類型默辨,可能有以下結(jié)果。
- 原始類型
數(shù)值苍息、字符串缩幸、布爾值分別返回number、string竞思、boolean表谊。
typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"
- 函數(shù)
函數(shù)返回function
function f() {}
typeof f
// "function"
- undefind
undefined返回undefined。
typeof undefined
// "undefined"
typeof undefined 范例
利用這一點(diǎn)盖喷,typeof可以用來檢查一個(gè)沒有聲明的變量爆办,而不報(bào)錯(cuò)。
v // ReferenceError: v is not defined
typeof v // "undefined"
實(shí)際編程中课梳,這個(gè)特點(diǎn)通常用在判斷語句距辆。
// 錯(cuò)誤的寫法
if (v) { } // ReferenceError: v is not defined
// 正確的寫法
if (typeof v === "undefined") { }
除此以外余佃,其他情況都返回object。
typeof window // "object"
typeof {} // "object"
typeof [] // "object"
typeof null // "object"
- instanceof用于判斷一個(gè)變量是否某個(gè)對(duì)象的實(shí)例跨算,運(yùn)算符返回一個(gè)布爾值咙冗。instanceof只能用來判斷對(duì)象和函數(shù),不能用來判斷字符串和數(shù)字等漂彤。
如何判斷一個(gè)變量是否是數(shù)字、字符串灾搏、布爾挫望、函數(shù)
用typeof,例如:
typeof 11 === 'number'//true
typeof 'aa' === 'string'//true
NaN是什么? 有什么特別之處?
NaN含義是Not a Number狂窑,表示非數(shù)字媳板,NaN和任何值都不相等,包括自己
NaN == NaN; //false
如何把非數(shù)值轉(zhuǎn)化為數(shù)值?
parseInt('abc'); //NaN
==與===有什么區(qū)別
==
是近似等于泉哈,===
是嚴(yán)格等于蛉幸。
在近似等于時(shí),JavaScript會(huì)對(duì)數(shù)據(jù)進(jìn)行類型轉(zhuǎn)換:
- 如果兩個(gè)值類型相同丛晦,則執(zhí)行嚴(yán)格相等的運(yùn)算
如果兩個(gè)值的類型不同
如果一個(gè)是null奕纫,一個(gè)是undefined,那么相等
如果一個(gè)是數(shù)字烫沙,一個(gè)是字符串匹层,先將字符串轉(zhuǎn)為數(shù)字,然后比較
如果一個(gè)值是true/false則將其轉(zhuǎn)為1/0比較
如果一個(gè)值是對(duì)象锌蓄,一個(gè)是數(shù)字或字符串升筏,則嘗試使用valueOf和toString轉(zhuǎn)換后比較
其它就不相等了
break與continue有什么區(qū)別
break
是跳出循環(huán)不再繼續(xù)本循環(huán),continue
是跳出此次循環(huán)但重新執(zhí)行當(dāng)前循環(huán)體瘸爽。
void 0 和 undefined在使用場(chǎng)景上有什么區(qū)別
void運(yùn)算符的作用是執(zhí)行一個(gè)表達(dá)式您访,然后返回undefined。但是某些情境下undefined是可以被賦值的剪决,比如在函數(shù)中灵汪,這樣的話就不能用undefined來進(jìn)行判斷了。所以用void 0返回undefined來進(jìn)行判斷昼捍。既減少了在原形鏈上查找 window.undefined 的時(shí)間识虚,也避免了誤用被修改過的 undefined。
以下代碼的輸出結(jié)果是?為什么?
console.log(1+1); //輸出'2'妒茬,兩個(gè)數(shù)字進(jìn)行加法運(yùn)算
console.log("2"+"4"); //輸出'24'担锤,兩個(gè)字符串拼接
console.log(2+"4"); //輸出'24',數(shù)字和字符串的進(jìn)行拼接
console.log(+"4"); //輸出'4'乍钻,字符串轉(zhuǎn)換成數(shù)字輸出
操作符對(duì)不同的數(shù)據(jù)類型有不同的含義肛循,比如 +
在兩個(gè)操作數(shù)都是數(shù)字的時(shí)候铭腕,會(huì)做加法運(yùn)算
兩個(gè)參數(shù)都是字符串或在有一個(gè)參數(shù)是字符串的情況下會(huì)把另外一個(gè)參數(shù)轉(zhuǎn)換為字符串做字符串拼接
在參數(shù)有對(duì)象的情況下會(huì)調(diào)用其valueOf或toString
在只有一個(gè)字符串參數(shù)的時(shí)候會(huì)嘗試將其轉(zhuǎn)換為數(shù)字
在只有一個(gè)數(shù)字參數(shù)的時(shí)候返回其正數(shù)值
10. 以下代碼的輸出結(jié)果是?
var a = 1;
a+++a; /*輸出'3',a++優(yōu)先計(jì)算多糠,a++為1但a自增為2累舷,所以a++ +a相當(dāng)于1+2*/
typeof a+2;/* 輸出'number2',typeof優(yōu)先級(jí)最高夹孔,typeof a求的是a的數(shù)據(jù)類
型被盈,得到'number',最后計(jì)算+2搭伤,將字符串'number'與數(shù)字2進(jìn)行
拼接得到'number2' */
11. 以下代碼的輸出結(jié)果是? 為什么
var a = 1;
var b = 3;
console.log( a+++b );/* 輸出'4'只怎,a++優(yōu)先級(jí)最高,a++運(yùn)算之后a結(jié)果為1怜俐,
a自增為2但不參與運(yùn)算身堡,所以a+++b為4 */
12. 遍歷數(shù)組,把數(shù)組里的打印數(shù)組每一項(xiàng)的平方
var arr = [3,4,5]
for(i = 0; i<arr.length; i++)
{
console.log(arr[i]*arr[i]);
}
輸出
3
9
25
13. 遍歷 JSON, 打印里面的值
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for (key in obj)
{
console.log(obj);
}
輸出
Object {name: "hunger", sex: "male", age: 28}
Object {name: "hunger", sex: "male", age: 28}
Object {name: "hunger", sex: "male", age: 28}
14. 以下代碼輸出結(jié)果是? 為什么 (選做題目)
var a = 1, b = 2, c = 3;
var val = typeof a + b || c > 0
console.log(val) /*輸出'number2'拍鲤,只要邏輯或運(yùn)算符前面的值為true贴谎,無論運(yùn)算符
后面的值是什么都取運(yùn)算符前面的值,然后賦給val*/
var d = 5;
var data = d == 5 && console.log('bb')//輸出'bb'
console.log(data)/*輸出'bb'季稳,data值為undefined擅这,d == 5結(jié)果為true,
d == 5 && console.log('bb')結(jié)果為undefined*/
var data2 = d = 0 || console.log('haha')
console.log(data2)/*輸出'haha'绞幌,data2值為undefined蕾哟,0 || console.log()
結(jié)果為undefined*/
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)/*輸出'2',!"world"求字符串的布爾值取反莲蜘,其結(jié)果為false谭确,則
!!"from here!!"和!!"Hello"的結(jié)果均為true,(false,true)
結(jié)果取逗號(hào)后面的true票渠,true = 1逐哈,true + true = 2*/