基本分類
- 基本數(shù)據(jù)類型:undefined忽冻、null、boolean此疹、number僧诚、string。
- 復雜數(shù)據(jù)類型:object(廣義的對象)
1. typeof 操作符
-
typeof
是一個操作(運算)符蝗碎,不是函數(shù)湖笨。 -
typeof
運算符可以返回一個值的數(shù)據(jù)類型,如:typeof 123 // "number" typeof '123' // "string" typeof false // "boolean" typeof undefined // "undefined" typeof null // "object" typeof {} // "object" typeof [] // "object" typeof NaN // 'number' function f() {} typeof f // "function"
2. Undefined 類型
- Undefined 類型只有一個值"
undefined
"蹦骑。 - 對未初始化和未聲明的變量執(zhí)行
typeof
都返回 undefined慈省。 - 函數(shù)沒有返回值時,默認返回
undefined
3. Null 類型
- Null 類型只有一個值"
null
"眠菇。 - null 值表示一個空對象指針边败,所以使用
typeof
會返回"object
"; -
undefined
值是派生于null
的,因此會有null == undefined //true
捎废。 - null轉(zhuǎn)為數(shù)字時笑窜,自動變成0。
- null表示空值登疗,即該處的值現(xiàn)在為空排截。調(diào)用函數(shù)時,某個參數(shù)未設置任何值辐益,這時就可以傳入null断傲,表示該參數(shù)為空。
- 無論在何種情況下都沒必要把一個變量顯式地設置為
undefined
智政,但是只要意在保存對象的變量還沒有真正保存對象艳悔,就應該明確地讓該變量保存null
值。
4. Boolean 類型
- 轉(zhuǎn)換規(guī)則是除了下面六個值被轉(zhuǎn)為
false
女仰,其他值都視為true
猜年,包括空數(shù)組([])和空對象({})。- undefined
- null
- false
- 0
- NaN
- ""或''(空字符串)
類型轉(zhuǎn)換
Boolean(x)
!!x
5. Number 類型
浮點數(shù)值
- 所有數(shù)字都是以 64 位浮點數(shù)形式儲存疾忍,即使整數(shù)也是如此乔外,JavaScript 語言的底層根本沒有整數(shù)。
- 如果浮點數(shù)本身是一個整數(shù)(如:1.0)一罩,那么該值會轉(zhuǎn)換為整數(shù)(轉(zhuǎn)成32位)(1等價于1.0)杨幼。
- 浮點數(shù)計算會產(chǎn)生舍入誤差問題。(如:0.1 + 0.2 === 0.3不成立)
數(shù)值范圍
- 如果一個數(shù)大于等于2的1024次方聂渊,那么就會發(fā)生“正向溢出”差购,返回
Infinity
。 - 如果一個數(shù)小于等于2的-1075次方(指數(shù)部分最小值-1023汉嗽,再加上小數(shù)部分的52位)欲逃,那么就會發(fā)生為“負向溢出”,返回0.
- 判斷一個值是否有窮饼暑,使用
isFinite()
函數(shù)稳析。
NaN
- 該數(shù)值表示一個本來要返回數(shù)值的操作數(shù)未返回數(shù)值的情況。
- 0 / 0 結(jié)果為
NaN
弓叛。 - NaN 與任何數(shù)值不相等彰居,包括 NaN。
- 數(shù)組的
indexOf
方法內(nèi)部使用的是嚴格相等運算符撰筷,所以該方法對NaN不成立陈惰。[NaN].indexOf(NaN)
- 使用
isNaN("blue")
函數(shù),任何不能被轉(zhuǎn)換為數(shù)值的值都返回 true毕籽,但是抬闯,對于空數(shù)組和只有一個數(shù)值成員的數(shù)組,isNaN 返回 false影钉。 - 0 除以 0 也會得到 NaN画髓。
數(shù)值轉(zhuǎn)換
-
Number()
可以用于任何數(shù)據(jù)類型,parseInt()
和parseFloat()
是專門把字符串轉(zhuǎn)換為數(shù)值平委。 -
parseInt()
:
- 它的第二個參數(shù):確定轉(zhuǎn)換時的進制奈虾。
- 如果
parseInt()
的參數(shù)不是字符串,則會先轉(zhuǎn)為字符串再轉(zhuǎn)換廉赔。 - 如果字符串的第一個字符不能轉(zhuǎn)化為數(shù)字(后面跟著數(shù)字的正負號除外)肉微,返回 NaN。
- 對于那些會自動轉(zhuǎn)為科學計數(shù)法的數(shù)字蜡塌,
parseInt()
會將科學計數(shù)法的表示方法視為字符串碉纳,因此導致一些奇怪的結(jié)果。parseInt(1000000000000000000000.5) // 1 // 等同于 parseInt('1e+21') // 1 parseInt(0.0000008) // 8 // 等同于 parseInt('8e-7') // 8
parseFloat()
- 只能解析十進制馏艾。
-
parseFloat()
會將空字符串轉(zhuǎn)為 NaN劳曹。 -
parseFloat()
方法會自動過濾字符串前導的空格奴愉。 - 如果參數(shù)不是字符串,或者字符串的第一個字符不能轉(zhuǎn)化為浮點數(shù)铁孵,則返回 NaN锭硼。
- x - 0
- x
數(shù)值的進制
- 十進制:沒有前導
0
的數(shù)值。 - 八進制:有前綴
0o
或00
的數(shù)值蜕劝,或者有前導0
檀头、且只用到 0-7 的八個阿拉伯數(shù)字的數(shù)值,如果前導 0 后面有數(shù)字 8 和 9岖沛,則該數(shù)值被視為十進制暑始。 - 十六進制:有前綴
0x
或0X
的數(shù)值。 - 二進制:有前綴
0b
或0B
的數(shù)值婴削。
6. String 類型
- Boolean廊镜、Number、String 都有
toString()
方法馆蠕,但 null 和 undefined 沒有期升。 - 如果長字符串必須分成多行,可以在每一行的尾部使用反斜杠互躬。反斜杠的后面必須是換行符播赁,而不能有其他字符(比如空格),否則會報錯吼渡。(這種方式可讀性差容为,建議用連接運算符+)
var longString = 'Long \ long \ long \ string'; longString // "Long long long string"
反斜杠轉(zhuǎn)義三種特殊用法
-
\HHH
:反斜杠后面緊跟三個八進制數(shù)(000到377),代表一個字符寺酪。HHH對應該字符的 Unicode 碼點坎背,比如\251表示版權(quán)符號。顯然寄雀,這種方法只能輸出256種字符得滤。 -
\xHH
:\x后面緊跟兩個十六進制數(shù)(00到FF),代表一個字符盒犹。HH對應該字符的 Unicode 碼點懂更,比如\xA9表示版權(quán)符號。這種方法也只能輸出256種字符急膀。 -
\uXXXX
:\u后面緊跟四個十六進制數(shù)(0000到FFFF)沮协,代表一個字符。XXXX對應該字符的 Unicode 碼點卓嫂,比如\u00A9表示版權(quán)符號慷暂。
字符串與數(shù)組
- 字符串可以被視為字符數(shù)組,因此可以使用數(shù)組的方括號運算符晨雳,用來返回某個位置的字符(位置編號從0開始)行瑞。
var s = 'hello'; s[0] // "h" s[4] // "o" // 直接對字符串使用方括號運算符 'hello'[1] // "e"
- 如果方括號中的數(shù)字超過字符串的長度奸腺,或者方括號中根本不是數(shù)字,則返回
undefined
蘑辑。 - 字符串內(nèi)部的單個字符無法改變和增刪洋机,這些操作會默默地失敗。
-
字符集
- JavaScript 不僅以 Unicode 儲存字符洋魂,還允許直接在程序中使用 Unicode 碼點表示字符。
var f\u006F\u006F = 'abc'; foo // "abc"
- 每個字符在 JavaScript 內(nèi)部都是以16位(即2個字節(jié))的 UTF-16 格式儲存喜鼓。也就是說副砍,JavaScript 的單位字符長度固定為16位長度,即2個字節(jié)庄岖。但是豁翎,UTF-16 有兩種長度:對于碼點在U+0000到U+FFFF之間的字符,長度為16位(即2個字節(jié))隅忿;對于碼點在U+10000到U+10FFFF之間的字符心剥,長度為32位(即4個字節(jié)),而且前兩個字節(jié)在0xD800到0xDBFF之間背桐,后兩個字節(jié)在0xDC00到0xDFFF之間优烧。舉例來說,碼點U+1D306對應的字符為??链峭,它寫成 UTF-16 就是0xD834 0xDF06畦娄。
- JavaScript 不僅以 Unicode 儲存字符洋魂,還允許直接在程序中使用 Unicode 碼點表示字符。
Base64 轉(zhuǎn)碼
- 有時,文本里面包含一些不可打印的符號弊仪,比如 ASCII 碼0到31的符號都無法打印出來熙卡,這時可以使用 Base64 編碼,將它們轉(zhuǎn)成可以打印的字符励饵。另一個場景是,有時需要以文本格式傳遞二進制數(shù)據(jù)役听,那么也可以使用 Base64 編碼颓鲜。
- 所謂 Base64 就是一種編碼方法,可以將任意值轉(zhuǎn)成 0~9禾嫉、A~Z灾杰、a-z、+和/這64個字符組成的可打印字符熙参。
-
btoa()
:任意值轉(zhuǎn)為 Base64 編碼 -
atob()
:Base64 編碼轉(zhuǎn)為原來的值 - 要將非 ASCII 碼字符轉(zhuǎn)為 Base64 編碼艳吠,必須中間插入一個轉(zhuǎn)碼環(huán)節(jié),再使用這兩個方法孽椰。
function b64Encode(str) { return btoa(encodeURIComponent(str)); } function b64Decode(str) { return decodeURIComponent(atob(str)); } b64Encode('你好') // "JUU0JUJEJUEwJUU1JUE1JUJE" b64Decode('JUU0JUJEJUEwJUU1JUE1JUJE') // "你好"
任意類型轉(zhuǎn)字符串
-
String()
String(1) //"1" String(true) //"true" String(null) //"null" String(undefined) //"undefined" String({}) //"[object Object]"
-
toString()
(1).toString() //"1" true.toString() //"true" null.toString() //報錯 undefined.toString() //報錯 {}.toString() //報錯 ({}).toString() //"[object Object]"
-
x + ''
1 + '' //"1" true + '' //"true" null + '' //"null" undefined + '' //"undefined " {} + '' //0 var o = {}; o + ''; //"[object Object]"
7. Object 類型
- 如果鍵名是數(shù)值昭娩,會被自動轉(zhuǎn)為字符串凛篙。
var obj = { 1: 'a', 3.2: 'b', 1e2: true, 1e-2: true, .234: true, 0xFF: true }; obj // Object { // 1: "a", // 3.2: "b", // 100: true, // 0.01: true, // 0.234: true, // 255: true // } obj['100'] // true
- 如果鍵名不符合標識名的條件(比如第一個字符為數(shù)字,或者含有空格或運算符)栏渺,且也不是數(shù)字呛梆,則必須加上引號,否則會報錯磕诊。
-
{ foo: 123 }
這是表達式還是語句填物?:JavaScript 引擎的做法是,如果遇到這種情況霎终,無法確定是對象還是代碼塊滞磺,一律解釋為代碼塊。如果要解釋為對象莱褒,最好在大括號前加上圓括號击困。因為圓括號的里面,只能是表達式广凸,所以確保大括號只能解釋為對象阅茶。({ foo: 123 }) // 正確 ({ console.log(123) }) // 報錯
-
Object.keys(object)
:查看一個對象本身的所有屬性。 -
delete
:用于刪除對象的屬性谅海,刪除成功后返回true脸哀。刪除一個不存在的屬性,delete不報錯胁赢,而且返回true企蹭。無法刪除繼承的屬性。 -
in
:用于檢查對象是否包含某個屬性智末,但它不能識別哪些屬性是對象自身的谅摄,哪些屬性是繼承的。 -
hasOwnProperty("name")
: 用于檢查屬性是否在對象中系馆,不包括繼承屬性送漠。 -
isPrototypeOf(object)
: 用于檢查給定對象是否為當前對象的原型。 -
propertyIsEnumerable("name")
: 用于檢查屬性是否能用 for-in 枚舉由蘑。