JavaScript定義了六種數(shù)據(jù)類型:
- Number類型
- String類型
- Boolean類型
- Object類型
- undefined類型
- null類型
原始類型和復(fù)雜類型
原始類型
數(shù)值候引、字符串、布爾值稱為原始類型(primitive type)的值塘秦,即它們是最原始的數(shù)據(jù)類型媳危,不能再細(xì)分了灰瞻。復(fù)雜類型
而將對象(Object類型)稱為復(fù)雜類型(complex type)的值周偎,因為一個對象往往是多個原始類型的值的合成缆巧,可以看作是一個
存放各種值的容器窃植。至于undefined和null领铐,是兩個特殊值悯森。-
對象類型
對象類型還可以細(xì)分為三個子類型- 狹義的對象(Object)
- 數(shù)組(array)
- 函數(shù)(function)
- 正則表達(dá)式(regexp)
關(guān)于typeof和instanceof的作用和區(qū)別。
typeof
在變量和值上調(diào)用typeof绪撵,將返回一個字符串瓢姻,這個字符串標(biāo)示了這個變量或值的類型。如果這個變量或值是一個引用類型將會返回"object"音诈。其中typeof null 返回的object幻碱,這是因為JavaScript最初設(shè)計的一個錯誤绎狭,然后被沿用到現(xiàn)在。
返回的判斷類型一共有六種
- number
- boolean
- string
- function
- object
- undefined
instanceof
instanceof用于判斷一個變量是否某個對象的實例褥傍,運算符返回一個布爾值儡嘶,instanceof只能用來判斷對象和函數(shù),不能用來判斷字符串和數(shù)字等恍风。
所以instanceof是一個判斷蹦狂,而typeof是求值。
如何判斷一個變量是否是數(shù)字朋贬、字符串凯楔、布爾、函數(shù)
用 typeof 變量名;就可返回一個此變量類型的字符串,假如此變量名為a:
- typeof a === "number";
- typeof a === "string";
- typeof a === "boolean";
- typeof a === "function";
NaN是什么? 有什么特別之處?
NaN是JavaScript的特殊值 锦募,表示“非數(shù)字”(Not a Number)摆屯。
注意
NaN不是數(shù)字但是它的數(shù)據(jù)類型是數(shù)字。
typeof NaN //Number
NaN是JavaScript中唯一一個不等于任何值(包括自身)的值糠亩。
NaN == NaN //false
NaN在Boolean運算的時候被當(dāng)做false
Boolean(NaN)//false
NaN和任何數(shù)(包括自身)運算結(jié)果都是NaN
NaN+1 //NaN
判斷NaN的方法
typeof value === 'number' && isNaN(value);
如何把非數(shù)值轉(zhuǎn)化為數(shù)值?
- parseInt()虐骑、parseFloat()專門用于把字符串轉(zhuǎn)換成數(shù)值(比較常用的)。
- Number()可以用于任何數(shù)據(jù)類型(此函數(shù)平時很少使用)赎线。
Number()的轉(zhuǎn)換規(guī)則:
如果是Boolean值廷没,true和false將分別被轉(zhuǎn)換為1和0。
如果是數(shù)字值氛驮,只是簡單的傳入和返回腕柜。
如果是null值,返回0矫废。
如果是undefined盏缤,返回NaN。
-
如果是字符串蓖扑,遵循下列規(guī)則:
- 如果字符串中只包含數(shù)字(包括前面帶正號或負(fù)號的情況)唉铜,則將其轉(zhuǎn)化為十進制數(shù)值,既"1"變成1律杠,"123"變成123潭流,但是"012"會變成11(注意:前導(dǎo)的零被忽略了);
- 如果字符串中包含有效的十六進制格式柜去,如"0xf"則將其轉(zhuǎn)換為相同大小的十進制整數(shù)值灰嫉;
- 如果字符串是空的(不包含任何字符),則將其轉(zhuǎn)換為0嗓奢;
- 如果字符串中包含除上述格式之外的字符讼撒,則將其轉(zhuǎn)換為NaN;
- 如果是對象,則調(diào)用對象的valueOf方法根盒,然后依照前面的規(guī)則轉(zhuǎn)換返回的值钳幅。如果轉(zhuǎn)換的結(jié)果是NaN,則調(diào)用對象的toString()方法炎滞,然后再次依照前面的規(guī)則轉(zhuǎn)換返回的字符串值敢艰。
==與===的區(qū)別
- "==":等于運算,但是不比較值的類型册赛, 兩邊值類型不同的時候钠导,要先進行類型轉(zhuǎn)換,再比較森瘪。
- "===":完全等于運算辈双,不僅比較值,而且還比較值的類型柜砾,當(dāng)兩邊類型不一致時,不做類型轉(zhuǎn)換换衬,類型不同的一定不等痰驱,只有兩者一致才為真。
break與continue有什么區(qū)別
- break用于強制退出循環(huán)體瞳浦,執(zhí)行循環(huán)后面的語句
- continue 用于退出本次循環(huán)担映,執(zhí)行下次循環(huán)
void 0 和 undefined在使用場景上有什么區(qū)別
一般都是用來對某個值做if判斷,判斷是否等于undefined叫潦。
但是一般用void 0來代替undefined,undefined 是windows的一個屬性蝇完,每次使用都要調(diào)用,比較費時矗蕊,而且它還是一個可以重定義的變量短蜕,容易出錯。
不管void后的運算數(shù)是什么傻咖,只管返回undefined朋魔,用void 0.只是比較省事,也可用void 1; void100;
一些面試題
以下代碼的輸出結(jié)果是?為什么?
-
console.log(1+1);
//2 -
console.log("2"+"4");
//"24" -
console.log(2+"4");
//"24" -
console.log(+"4");
//4
var a = 1;
a+++a; //a++的結(jié)是1 后面+a的值是2 卿操,整個表達(dá)式值為3
typeof a+2; //typeof的優(yōu)先級比+高
//輸出結(jié)果:"number2"
var a = 1;
var b = 3;
console.log( a+++b );
//輸出結(jié)果4
遍歷數(shù)組警检,把數(shù)組里的打印數(shù)組每一項的平方
var arr = [3,4,5];
for(var i = 0 ; i < arr.length ;i++)
{
console.log(arr[i]*arr[i]);
}
//輸出結(jié)果
9
16
25
遍歷 JSON, 打印里面的值
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for(key in obj){
console.log(obj[key])
}
//輸出結(jié)果
hunger
male
28
以下代碼輸出結(jié)果是
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0
console.log(val)
//輸出結(jié)果
“number2”
var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)
//輸出結(jié)果
bb
var data2 = d = 0 || console.log('haha')
console.log(data2)
//輸出結(jié)果
haha
var x = !!"Hello" + (!"world", !!"from here!!");
//(!"world", !!"from here!!") 返回后者 !!"from here!!" =>true;
//!!"Hello"=>true
//true + true =2;