一: JavaScript 定義的幾種數(shù)據(jù)類型船万;哪些是原始類型?哪些是復(fù)雜類型?原始類型和復(fù)雜類型的區(qū)別
-
JavaScript的數(shù)據(jù)類型崖堤,共有七種吗氏。
1 . 數(shù)值(number):整數(shù)和小數(shù)
2 . 字符串(string):字符組成的文本
3 . 布爾值(boolean):true(真)和false(假)兩個特定值
4 . undefined:表示“未定義”或不存在幅垮,即此處目前沒有任何值
5 . null:表示空缺乌昔,即此處應(yīng)該有一個值隙疚,但目前為空6 . 對象(object):各種值組成的集合,又可以分為以下子類型:
- 狹義的對象(object)
- 數(shù)組(array)
- 函數(shù)(function)
- 正則表達式(regexp)磕道;
7 . Symbol:生成一個全局唯一的值供屉。 原始類型(primitive type)的值:數(shù)值、字符串捅厂、布爾值贯卦、Symbol,它們是最基本的數(shù)據(jù)類型焙贷,不能再細分撵割。
復(fù)雜類型(complex type)的值:對象,對象往往是多個原始類型的值的合成辙芍,可以看作是一個存放各種值的容器啡彬。
特殊值:undefined和null。
原始類型和復(fù)雜類型的區(qū)別:
1 . 基本類型變量存的是值故硅,復(fù)雜類型的變量存的是內(nèi)存地址庶灿。
2 . 基本類型在賦值的時候拷貝值,復(fù)雜類型在賦值的時候只拷貝地址吃衅,不拷貝值往踢。
二: typeof和instanceof的作用和區(qū)別
- typeof運算符可以返回一個值的數(shù)據(jù)類型,可能有以下結(jié)果:
- 數(shù)值徘层、字符串峻呕、布爾值分別返回number、string趣效、boolean瘦癌。
- 函數(shù)返回function。
- undefined返回undefined跷敬。
- typeof可以用來檢查一個沒有聲明的變量讯私,而不報錯。實際編程中,這個特點通常用在判斷語句斤寇。
- 除此以外桶癣,其他情況都返回object。
- 如果我們希望獲取一個對象是否是數(shù)組抡驼,或判斷某個變量是否是某個對象的實例則要選擇使用instanceof鬼廓。instanceof通過返回一個布爾值來判斷一個變量是否某個對象的實例。
三: 怎樣判斷一個變量是否是數(shù)字致盟、字符串碎税、布爾、函數(shù)
- 使用typeof運算符
typeof 123 === 'number' //判斷是否為數(shù)字
typeof '123' === 'string' //判斷是否為字符串
typeof false ==='boolean' //判斷是否為布爾
typeof v ==='function' //判斷是否為函數(shù)
四: NaN是什么? 有什么特別之處
- NaN:Not a Number馏锡,表示非數(shù)字雷蹂,NaN和任何值都不相等,包括自己
五: 如何把非數(shù)值轉(zhuǎn)化為數(shù)值
- 有三個函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值
- Number()
- parseInt()
- parseFloat
- Number規(guī)則相當(dāng)復(fù)雜而且不合理杯道,幾乎不使用匪煌,常用的是后兩個,且規(guī)則類似:
1 . 忽略字符串前面的空白字符党巾,找到第一個非空白字符
2 . 如果第一個字符不是-或者數(shù)字返回NaN
3 . 如果是繼續(xù)解析萎庭,直到非數(shù)值模式為止
4 . 0開頭會當(dāng)做八進制,0x開頭會當(dāng)做十六進制齿拂,但是可以指定第二個參數(shù)指定基數(shù)
六: ==與===` 的區(qū)別
- ===是嚴(yán)格意義的相等驳规,只需注意NaN和NaN不等。
- 使用==時署海,javascript會進行類型轉(zhuǎn)換:
- 如果兩個值類型相同吗购,則執(zhí)行嚴(yán)格相等的運算
- 如果兩個值的類型不同
1 . 如果一個是null,一個是undefined砸狞,那么相等
2 . 如果一個是數(shù)字捻勉,一個是字符串,先將字符串轉(zhuǎn)為數(shù)字刀森,然后比較
3 . 如果一個值是true/false則將其轉(zhuǎn)為1/0比較
4 . 如果一個值是對象踱启,一個是數(shù)字或字符串,則嘗試使用valueOf和toString轉(zhuǎn)換后比較
5 . 其它就不相等了
七: break與continue 的區(qū)別
- break 用于強制退出循環(huán)體研底,執(zhí)行循環(huán)后面的語句
- continue 用于退出本次循環(huán)埠偿,執(zhí)行下次循環(huán)
八: void 0 和 undefined在使用場景上的區(qū)別
- undefined 可以在局部作用域中被覆寫
- void 運算返回值始終都是 undefined
九: 以下代碼的輸出結(jié)果是?why
console.log(1+1); //2 兩個操作數(shù)都是數(shù)字,加法運算
console.log("2"+"4"); //"24" 兩個參數(shù)都是字符串,字符串拼接
console.log(2+"4"); //"24" 有一個參數(shù)是字符串,會把另外一個參數(shù)轉(zhuǎn)換為字符串進行拼接
console.log(+"4"); //4 只有一個字符串飘哨,將其轉(zhuǎn)換為數(shù)字
十: 以下代碼的輸出結(jié)果是?
var a = 1;
a+++a; //輸出3胚想,a++優(yōu)先級高琐凭,運算結(jié)果為1芽隆,此時a=2,所以輸出3
typeof a+2; //輸出"number2",typeof優(yōu)先級高,輸出字符串"number",然后與數(shù)字2相加,數(shù)字轉(zhuǎn)換為字符串然后拼接
十一: 以下代碼的輸出結(jié)果是? 原因
var a = 1;
var b = 3;
console.log( a+++b );//輸出4胚吁,a++優(yōu)先級高牙躺,運算結(jié)果為1,然后與b相加
十二: 遍歷數(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(var 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)
//優(yōu)先級:typeof, +, >, || 依次運算輸出結(jié)果為:number2
var d = 5;
var data = d ==5 && console.log('bb')
console.log(data) //輸出:bb undefined , console.log('bb')先執(zhí)行輸出bb,&&前為ture,console.log('bb')不返回布爾值孽拷,返回undefined,所以data為undefined
var data2 = d = 0 || console.log('haha')
console.log(data2)
//輸出:haha undefined , console.log('haha')先執(zhí)行輸出haha,||優(yōu)先級高于=,比較0和console.log('haha')半抱,輸出undefined,右結(jié)合賦值給data2,所以data2為undefined
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)
//輸出:2 , !"world"為false, !!"from here!!"為ture, !!"Hello"為ture,
所以為ture+ture, 輸出為2
- 學(xué)習(xí)總結(jié)
- 我們在日常寫代碼的時候不要寫有誤解性的代碼脓恕,用()包裹可以讓你的代碼更有可讀性