1.JavaScript 定義了幾種數(shù)據(jù)類型? 哪些是原始類型?哪些是復雜類型?原始類型和復雜類型的區(qū)別是什么?
1.JavaScript 定義了 6 種數(shù)據(jù)類型。
數(shù)值(number):整數(shù)和小數(shù)(比如 1 和 3.14)
字符串(string):字符組成的文本(比如"Hellow Word")
布爾值(boolean):true 和 false 兩個特定值
undefined : 表示“未定義”或不存在,即此處目前沒有任何值
null :表示空缺,即此處應該有一個值,但目前為空
對象 (object):各種值組成的結(jié)合
2.原始類型和復雜類型的區(qū)別是什么?
數(shù)值、字符串、布爾值稱為原始類型(primitive type)的值,即他們是最基本的數(shù)據(jù)類型,不能再細分了。
將對象稱為復雜類型(complex type)的值,因為一個對象往往是多個原始類型的值的合成,可以看作是一個存放各種值的容器。
-
至于 undefined 和 null ,一般將它們看成兩個特殊值。
2.typeof和instanceof的作用和區(qū)別?
-
typeof 是一個一元運算符,放在一個運算數(shù)之前,運算數(shù)可以是任意類型,可判斷一個變量是否是數(shù)字、字符串、布爾、函數(shù)
- null的返回值是object,這是由于歷史原因造成的,1995年JavaScript語言的第一版,所有值都設(shè)計成32位,其中最低的3位用來表述數(shù)據(jù)類型,object對應的值是000。當時,只設(shè)計了五種數(shù)據(jù)類型(對象、整數(shù)、浮點數(shù)、字符串和布爾值),完全沒考慮null,只把它當作object的一種特殊值,32位全部為0。這是typeof null返回object的根本原因。
為了兼容以前的代碼,后來就沒法修改了。這并不是說null就屬于對象,本質(zhì)上null是一個類似于undefined的特殊值。
- null的返回值是object,這是由于歷史原因造成的,1995年JavaScript語言的第一版,所有值都設(shè)計成32位,其中最低的3位用來表述數(shù)據(jù)類型,object對應的值是000。當時,只設(shè)計了五種數(shù)據(jù)類型(對象、整數(shù)、浮點數(shù)、字符串和布爾值),完全沒考慮null,只把它當作object的一種特殊值,32位全部為0。這是typeof null返回object的根本原因。
instanceof用于判斷某個變量是否是某個對象的實例,返回值為true或false。
var 0 = {};
var a = [];
0 instanceof Array // false
a instanceof Array //true
a instanceof Object //true
typeof 對數(shù)組 []和對象{}的返回值都是Object,無法區(qū)分數(shù)組和對象,但是instanceof可以區(qū)分。
數(shù)組[]是對象的一個子類,所以 a instanceof Array返回值是true
3. 如何判斷一個變量是否是數(shù)字、字符串、布爾、函數(shù)
數(shù)字
var a = 1
typeof a // "number"
字符串
var b = "abc"
typeof b // "string"
布爾
var c = false
typeof c // "boolean"
函數(shù)
var d = function(){}
typeof d // "function"
4.NaN是什么? 有什么特別之處?
- NaN表示 no number ,主要出現(xiàn)在將字符串解析成數(shù)字的場合
- NaN和任何數(shù)值都不相等,包括它自己
- NaN不是一種獨立的數(shù)據(jù)類型,而是一種特殊數(shù)值,它的數(shù)據(jù)類型依然屬于Number,使用typeof運算符可以判斷出來。
- 任何一個涉及NaN的操作都會返回NaN
5.如何把非數(shù)值轉(zhuǎn)化為數(shù)值?
-
1 Number()
- Boolean ,true 返回 1,false 返回 0。
Number(true) // 1 Number(false)// 0- 數(shù)字值,原樣返回
- null 值,返回0.
- underfined ,返回NaN
Number(undefined)// NaN - 字符串
- 如果是字符串中只包含數(shù)字(包括前面帶正號或負號的情況),則將其轉(zhuǎn)化成十進制數(shù)值。
Number ('23') // 23 Number ('+23') // 23 Number ('-23') // -23 Number ('011') // 11 前面的0會忽略- 如果字符串中包含的有效的浮點數(shù),就會轉(zhuǎn)化成對應的浮點數(shù),前面的0會忽略。
Number ('3.14') //3.14 Number ('03.14') //3.14- 如果字符串是空字符串,則返回 0。
Number("")//0 - 如果字符串中包含除上述格式外的其他字符,則轉(zhuǎn)化成NaN。
Number("123blue") // NaN Number(message) // NaN,變量message未聲明
-
- parseInt()
- parseInt方法用于將字符串轉(zhuǎn)為整數(shù)。返回值只有兩種可能,不是一個十進制整數(shù),就是NaN。
parseInt ('120') //120 整數(shù)轉(zhuǎn)化成整數(shù) parseInt ('3.14') //3 浮點數(shù)轉(zhuǎn)化前面的整數(shù)部分 parseInt (' 10') //10 前面的空格會忽略 parseInt ('000010') //10 前面的0會忽略 - 如果parseInt的參數(shù)不是字符串,則會先轉(zhuǎn)為字符串再轉(zhuǎn)換。
parseInt(1.23) // 1 // 等同于 parseInt('1.23') // 1 - 字符串轉(zhuǎn)為整數(shù)的時候,是一個個字符依次轉(zhuǎn)換,如果遇到不能轉(zhuǎn)為數(shù)字的字符,就不再進行下去,返回已經(jīng)轉(zhuǎn)好的部分。
parseInt('8a') // 8 parseInt('12**') // 12 parseInt('12.34') // 12 parseInt('15e2') // 15 parseInt('15px') // 15 //上面代碼中,parseInt的參數(shù)都是字符串,結(jié)果只返回字符串頭部可以轉(zhuǎn)為數(shù)字的部分。 - 如果字符串的第一個字符不能轉(zhuǎn)化為數(shù)字(后面跟著數(shù)字的正負號除外),返回NaN
parseInt('abc') // NaN parseInt('.3') // NaN parseInt('') // NaN parseInt('+') // NaN parseInt('+1') // 1 - parseInt方法還可以接受第二個參數(shù)(2到36之間),表示被解析的值的進制,返回該值對應的十進制數(shù)。默認情況下,parseInt的第二個參數(shù)為10,即默認是十進制轉(zhuǎn)十進制。
parseInt('1000', 10) // 1000 以十進制解讀(默認) parseInt('1000', 2) // 8 以二進制解讀 parseInt('1000', 6) // 216 以六進制解讀 parseInt('1000', 8) // 512 以八進制解讀 parseInt('10', 37) // NaN 進制超出范圍,就返回 NaN parseInt('10', 1) // NaN 進制超出范圍,就返回 NaN parseInt('10', 0) // 10 parseInt('10', null) // 10 parseInt('10', undefined) // 10 第二個參數(shù)是0、null、undefined 則直接忽略
-
- parseFloat()
- parseFloat 用于將一個字符串轉(zhuǎn)為浮點數(shù)
parseFloat('3.14') // 3.14 浮點數(shù)轉(zhuǎn)浮點數(shù) parseFloat('314e-2') // 3.14 parseFloat('0.0314E+2') // 3.14 如果字符串符合科學計數(shù)法,則進行相應轉(zhuǎn)換 parseFloat ('3.14abc') // 3.14 如果字符串包含不能轉(zhuǎn)換為浮點數(shù)的字符,則不再往后轉(zhuǎn)換,返回已經(jīng)轉(zhuǎn)好的部分。 parseFloat (' 3.14') // 3.14 parseFloat ('00003.14') // 3.14 parseFloat方法會自動過濾字符串前面的空格 - 如果參數(shù)不是字符串,或者字符串的第一個字符不能轉(zhuǎn)換為浮點數(shù),則返回NaN。
parseFloat([]) // NaN 空數(shù)組返回 NaN parseFloat('FF2') // NaN 第一個字符不能轉(zhuǎn)化浮點數(shù) parseFloat('') // NaN 空字符串轉(zhuǎn)化為 NaN - parseFloat () 和 Number () 的區(qū)別
parseFloat(true) // NaN Number(true) // 1 parseFloat(null) // NaN Number(null) // 0 parseFloat('') // NaN Number('') // 0 parseFloat('123.45#') // 123.45 Number('123.45#') // NaN
-
區(qū)別(1):parseFloat()轉(zhuǎn)換時,第一個小數(shù)點有效,小數(shù)點對parseInt()無效
parseInt(23.34.42)//23 parseFloat(23.34.42)//23.34 -
區(qū)別(2):parseFloat()始終會忽略前導的0
parseFloat()可以識別前面討論過的所有浮點數(shù)值格式,也包括十進制整數(shù)格式。但十六進制格式的字符串則始終會被轉(zhuǎn)換成0。由于parseFloat()直解析十進制值,因此它沒有用第二個參數(shù)指定基數(shù)的用法。最后還要注意一點,如果字符串包含的是一個可解析為整數(shù)的數(shù)(沒有小數(shù)點,或者小數(shù)點后都是0),parseFloat()會返回整數(shù)。
parseFloat("1234blue") //1234
parseFloat("0xA") //0
parseFloat("22.5") //22.5
parseFloat(22.34.5) //22.34
parseFloat("0908.5") //908.5
parseFloat("3.125e7") //31250000
parseFloat("4.0000") //4
6.==與===有什么區(qū)別
- == JavaScript會幫助我們作類型轉(zhuǎn)換,然后再比較
- === 全等,嚴格意義上的相等,不僅比較值,而且還比較值的類型,只需要注意NaN不等
7.break與continue有什么區(qū)別
- break結(jié)束整個循環(huán)體,continue結(jié)束本次循環(huán)
8.void 0 和 undefined在使用場景上有什么區(qū)別
- undefined
- 變量聲明后未賦值,則變量會自動賦值為undefined
- 沒有返回值的函數(shù),默認返回undefined;
- 調(diào)用函數(shù)時,應該提供的參數(shù)沒有提供,該參數(shù)等于undefined。
- 對象沒有賦值的屬性,該屬性的值為undefined。
- void運算符
void 運算符后面接一個表達式,無論表達式的內(nèi)容是什么,只要跟在void 之后都會被調(diào)用執(zhí)行,執(zhí)行完畢之后void操作符返回undefined;
-
使用 void 運算符有三種用處:
- 生成 undefined,既減少了在原形鏈上查找 window.undefined 的時間,也避免了誤用被修改過的 undefined。
- 讓函數(shù)立即執(zhí)行
- 充當 javascript: 協(xié)議的 URI