1. JavaScript 定義了幾種數(shù)據(jù)類型? 哪些是原始類型?哪些是復(fù)雜類型?原始類型和復(fù)雜類型的區(qū)別是什么?
JavaScript語言的每一個(gè)值西壮,都屬于某一種數(shù)據(jù)類型磷籍。JavaScript的數(shù)據(jù)類型十气,共有六種嫁佳。
數(shù)值(number):整數(shù)和小數(shù)(比如1和3.14)
字符串(string):字符組成的文本(比如"Hello World")
布爾值(boolean):true(真)和false(假)兩個(gè)特定值
undefined:表示“未定義”或不存在纸淮,即此處目前沒有任何值
null:表示空缺允趟,即此處應(yīng)該有一個(gè)值董栽,但目前為空
對(duì)象(object):各種值組成的集合
Symbol :一種特殊的码倦、不可變的數(shù)據(jù)類型,可以作為對(duì)象屬性的標(biāo)識(shí)符使用锭碳。
原始類型和復(fù)雜類型
數(shù)值袁稽、字符串、布爾值稱為原始類型(primitive type)的值擒抛,即它們是最基本的數(shù)據(jù)類型推汽,不能再細(xì)分了补疑。
對(duì)象稱為復(fù)雜類型(complex type)的值,因?yàn)橐粋€(gè)對(duì)象往往是多個(gè)原始類型的值的合成歹撒,可以看作是一個(gè)存放各種值的容器莲组。
至于undefined和null,一般將它們看成兩個(gè)特殊值栈妆。
對(duì)象又可以分成三個(gè)子類型胁编。
狹義的對(duì)象(object)
數(shù)組(array)
函數(shù)(function)
正則表達(dá)式 (regexp)
2. typeof和instanceof的作用和區(qū)別?
- typeof
- 用于判斷基本類型
基本類型總共有六種,它們分別是
number
boolean
string
function
object
undefined - 是一元運(yùn)行符
運(yùn)算格式:
typeof xxx
比如
typeof 1
會(huì)得到
"number" - 返回結(jié)果是類型的字符串
根據(jù)typeof 1
的結(jié)果鳞尔,我們可以看到我們得到的是一個(gè)字符串嬉橙。 - 一些簡單的例子
> typeof 1
"number"
> typeof qcy
"undefined"
> typeof NaN
"number"
> typeof 0.1
"number"
> typeof true
"boolean"
> typeof false
"boolean"
> typeof 'aaa'
"string"
> typeof function() {}
"function"
> typeof {}
"object"
> typeof []
"object"
- instanceof
- 用于判斷對(duì)象的類型
所以可以使用instanceof的都必須是對(duì)象。所以不屬于object類型的基本類型是無法應(yīng)用instanceof的寥假,或者無法得到你想要的結(jié)果市框。
比如:
> 1 instanceof Number
false
你要想得到正確的結(jié)果,需要這樣做:
> new Number(1) instanceof Number
true
所以如果你的運(yùn)算內(nèi)容不是對(duì)象糕韧,你就無法得到正確的結(jié)果枫振。同樣的效果如下:
'string' instanceof String
false
new String('string') instanceof String
true
二元運(yùn)算符
instanceof 是一個(gè)二元運(yùn)算符,左邊a是被運(yùn)算的值萤彩,右邊b是運(yùn)算的類型粪滤。格式是這樣的
a instanceof b返回結(jié)果是布爾值(Boolean):true/false
所以instanceof是一個(gè)判斷,而typeof是求值雀扶。差異
對(duì)自定義類型使用 instanceof :
var ClassFirst = function () {};
var ClassSecond = function () {};
var instance = new ClassFirst();
typeof instance; // object
typeof instance == 'ClassFirst'; //false
instance instanceof Object; //true
instance instanceof ClassFirst; //true
instance instanceof ClassSecond; //false
- 對(duì)原始類型使用 typeof :
'example string' instanceof String; // false
typeof 'example string' == 'string'; //true
'example string' instanceof Object; //false
typeof 'example string' == 'object'; //false
true instanceof Boolean; // false
typeof true == 'boolean'; //true
99.99 instanceof Number; // false
typeof 99.99 == 'number'; //true
function() {} instanceof Function; //true
typeof function() {} == 'function'; //true
- 對(duì)復(fù)雜類型使用 instanceof :
/regularexpression/ instanceof RegExp; // true
typeof /regularexpression/; //object
[] instanceof Array; // true
typeof []; //object
{} instanceof Object; // true
typeof {}; //object
3. 如何判斷一個(gè)變量是否是數(shù)字杖小、字符串、布爾愚墓、函數(shù)
假設(shè)變量為x
數(shù)字
如果
typeof (x) // "number"
則變量為數(shù)字NaN (Not-A-Number)
NaN是JavaScript之中唯一不等于自身的值
所以如果有
x予权!==x // true
或者
isNaN(x) // true
則變量為NaNInfinity
Infinity 屬性用于存放表示正無窮大的數(shù)值
可以直接判斷
x == Infinity // true
則變量為Infinity字符串、布爾浪册、函數(shù)
使用
typeof(x) // string | boolean | function
即可得到相應(yīng)結(jié)果
4. NaN是什么? 有什么特別之處?
全局屬性 NaN 表示 Not-A-Number 的值扫腺。
NaN 是一個(gè)全局對(duì)象的屬性。
NaN 屬性的初始值就是 NaN村象,和 Number.NaN 的值一樣笆环。在現(xiàn)代瀏覽器中(ES5中), NaN 屬性是一個(gè)不可配置(non-configurable)厚者,不可寫(non-writable)的屬性咧织。但在ES3中,這個(gè)屬性的值是可以被更改的籍救,但是也應(yīng)該避免覆蓋习绢。
在編碼很少直接使用到 NaN。通常都是在計(jì)算失敗時(shí),作為 Math 的某個(gè)方法的返回值出現(xiàn)的(例如:Math.sqrt(-1))或者嘗試將一個(gè)字符串解析成數(shù)字但失敗了的時(shí)候(例如:parseInt("blabla"))
typeof NaN // "number"
也就是說 NaN
是一種特殊的 Number
類型值闪萄。
NaN
是JavaScript之中唯一不等于自身的值
NaN !== NaN // true
NaN === NaN // false
嚴(yán)格判斷 NaN
typeof value === 'number' && isNaN(value);
5. 如何把非數(shù)值轉(zhuǎn)化為數(shù)值?
有三個(gè)函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值
1. Number()
2. parseInt()
3. parseFloat()
6. ==與===有什么區(qū)別
== equality 等同梧却,=== identity 恒等。
==败去, 兩邊值類型不同的時(shí)候放航,要先進(jìn)行類型轉(zhuǎn)換,再比較圆裕。
===广鳍,不做類型轉(zhuǎn)換,類型不同的一定不等吓妆。
特殊情況
[] == false // true
![] == false // true
7. break與continue有什么區(qū)別
break 用于強(qiáng)制退出循環(huán)體赊时,執(zhí)行循環(huán)后面的語句
continue 用于退出本次循環(huán),執(zhí)行下次循環(huán)
8. void 0 和 undefined在使用場(chǎng)景上有什么區(qū)別
undefined可以在局部作用域中被覆寫行拢, void 0不可被重寫并且返回值是undefined祖秒,因此void 0是在局部作用域中替代undefined
9. 以下代碼的輸出結(jié)果是?為什么
console.log(1+1);
> 2 // 輸出1+1的結(jié)果
console.log("2"+"4");
> 24 // 此處 + 號(hào)意義為字符串拼接
console.log(2+"4");
> 24 // + 號(hào)兩邊類型不同,先把number類型轉(zhuǎn)換為string再進(jìn)行字符串拼接
console.log(+"4");
> 4 此處 + 號(hào)作用相當(dāng)于轉(zhuǎn)化 string 為 number
10. 以下代碼的輸出結(jié)果是?
var a = 1;
a+++a;
> 3 // a++ 優(yōu)先級(jí)比 + 高舟奠,相當(dāng)于 (a++) + a 竭缝,a++在自增之前返回值 1 再與a自增后的值 2 相加,結(jié)果為3
typeof a+2;
> number2 // typeof 優(yōu)先級(jí)比 + 高沼瘫,所以返回字符串number抬纸,再通過 + 號(hào)與2拼接
11. 以下代碼的輸出結(jié)果是? 為什么
var a = 1;
var b = 3;
console.log( a+++b );
> 4 // ++ 優(yōu)先級(jí)比 + 高,相當(dāng)于 (a++) + b 耿戚,a++在自增之前返回值 1 再與b的值 3 相加湿故,結(jié)果為 4
12. 遍歷數(shù)組,把數(shù)組里的打印數(shù)組每一項(xiàng)的平方
var arr = [3,4,5]
for (var i=0;i<arr.length;i++)
console.log(arr[i]*arr[i])
> 9
16
25
13. 遍歷 JSON, 打印里面的值
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for (prop in obj)
console.log(prop,":",obj[prop])
> 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 // 先計(jì)算 typeof a 為 number溅话,再+b為 number2 ,且能轉(zhuǎn)換為true歌焦,所以直接返回number2
var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)
> bb
undefined
依據(jù)優(yōu)先級(jí)
data = ((d == 5) && (console.log('bb')))
data = undefined
var data2 = d = 0 || console.log('haha')
console.log(data2)
> haha
undefined
依據(jù)優(yōu)先級(jí)
data2 = (d = ((0) || (console.log('haha'))))
data2 = undefined
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)
> 2
括號(hào)里的值為true
"Hello"也為true
true+true = 1+1 =2