JavaScript 是一種弱類型或者說(shuō)動(dòng)態(tài)語(yǔ)言忧风。這意味著你不用提前聲明變量的類型,在程序運(yùn)行過(guò)程中,類型會(huì)被自動(dòng)確定招刨。
數(shù)據(jù)類型
最新的 ECMAScript 標(biāo)準(zhǔn)定義了7種數(shù)據(jù)類型:
- 6種基本類型:
- 數(shù)值(number)
- 字符串(string)
- 布爾值(boolean)
- undefined
- null
- Symbol
- 和對(duì)象(object)
typeof運(yùn)算符
typeof運(yùn)算符可以返回一個(gè)值的數(shù)據(jù)類型夹供,返回一個(gè)字符串灵份。
數(shù)值
根據(jù) ECMAScript 標(biāo)準(zhǔn),JavaScript 中只有一種數(shù)值類型:基于 IEEE 754 標(biāo)準(zhǔn)的雙精度 64 位二進(jìn)制格式的值(-( $2^{63}$ -1) 到 $2^{63}$ -1)哮洽。它并沒(méi)有為整數(shù)給出一種特定的類型填渠。除了能夠表示浮點(diǎn)數(shù)外,還有一些帶符號(hào)的值:+Infinity鸟辅,-Infinity 和 NaN (非數(shù)值氛什,Not-a-Number)。
在JavaScript語(yǔ)言的底層匪凉,根本沒(méi)有整數(shù)枪眉,所有數(shù)字都是小數(shù)(64位浮點(diǎn)數(shù))。
1 === 1.0 // true
由于浮點(diǎn)數(shù)不是精確的值再层,所以涉及小數(shù)的比較和運(yùn)算要特別小心贸铜。
0.1 + 0.2 === 0.3
// false
0.1 + 0.2
// 0.30000000000000004
數(shù)值的進(jìn)制
JavaScript對(duì)整數(shù)提供四種進(jìn)制的表示方法:十進(jìn)制堡纬、十六進(jìn)制、八進(jìn)制萨脑、2進(jìn)制隐轩。
十進(jìn)制:沒(méi)有前導(dǎo)0的數(shù)值
八進(jìn)制:有前綴0o或0O的數(shù)值,或者有前導(dǎo)0渤早、且只用到0-7的七個(gè)阿拉伯?dāng)?shù)字的數(shù)值职车。
十六進(jìn)制:有前綴0x或0X的數(shù)值。鹊杖?
二進(jìn)制:有前綴0b或0B的數(shù)值悴灵。
NaN
NaN是JavaScript的特殊值,表示“非數(shù)字”(Not a Number)骂蓖,主要出現(xiàn)在將字符串解析成數(shù)字出錯(cuò)的場(chǎng)合积瞒。
typeof NaN // 'number'
運(yùn)算規(guī)則
NaN不等于任何值,包括它本身登下。
NaN === NaN // false
字符串
字符串就是零個(gè)或多個(gè)排在一起的字符茫孔,放在單引號(hào)或雙引號(hào)之中。
'abc'
"abc"
如果長(zhǎng)字符串必須分成多行被芳,可以在每一行的尾部使用反斜杠缰贝。
var longString = "Long \
long \
long \
string";
longString
// "Long long long string"
轉(zhuǎn)義
反斜杠(\)在字符串內(nèi)有特殊含義,用來(lái)表示一些特殊字符畔濒,所以又稱為轉(zhuǎn)義符剩晴。
\0 null(\u0000)
\b 后退鍵(\u0008)
\f 換頁(yè)符(\u000C)
\n 換行符(\u000A)
\r 回車(chē)鍵(\u000D)
\t 制表符(\u0009)
\v 垂直制表符(\u000B)
' 單引號(hào)(\u0027)
" 雙引號(hào)(\u0022)
\ 反斜杠(\u005C)
反斜杠還有三種特殊用法。
(1)\HHH
反斜杠后面緊跟三個(gè)八進(jìn)制數(shù)(000到377)侵状,代表一個(gè)字符赞弥。HHH對(duì)應(yīng)該字符的Unicode碼點(diǎn),比如\251表示版權(quán)符號(hào)趣兄。顯然绽左,這種方法只能輸出256種字符。
(2)\xHH
\x后面緊跟兩個(gè)十六進(jìn)制數(shù)(00到FF)艇潭,代表一個(gè)字符妇菱。HH對(duì)應(yīng)該字符的Unicode碼點(diǎn),比如\xA9表示版權(quán)符號(hào)暴区。這種方法也只能輸出256種字符闯团。
(3)\uXXXX
\u后面緊跟四個(gè)十六進(jìn)制數(shù)(0000到FFFF),代表一個(gè)字符仙粱。HHHH對(duì)應(yīng)該字符的Unicode碼點(diǎn)房交,比如\u00A9表示版權(quán)符號(hào)。
Base64轉(zhuǎn)碼
Base64是一種編碼方法伐割,可以將任意字符轉(zhuǎn)成可打印字符候味。
JavaScript原生提供兩個(gè)Base64相關(guān)方法刃唤。
btoa():字符串或二進(jìn)制值轉(zhuǎn)為Base64編碼
atob():Base64編碼轉(zhuǎn)為原來(lái)的編碼
var string = 'Hello World!';
btoa(string) // "SGVsbG8gV29ybGQh"
atob('SGVsbG8gV29ybGQh') // "Hello World!"
要將非ASCII碼字符轉(zhuǎn)為Base64編碼,必須中間插入一個(gè)轉(zhuǎn)碼環(huán)節(jié)白群,再使用這兩個(gè)方法尚胞。
function b64Encode(str) {
return btoa(encodeURIComponent(str));
}
function b64Decode(str) {
return decodeURIComponent(atob(str));
}
b64Encode('你好') // "JUU0JUJEJUEwJUU1JUE1JUJE"
b64Decode('JUU0JUJEJUEwJUU1JUE1JUJE') // "你好"
布爾值
布爾值只有兩個(gè)值:true和false。
除了下面六個(gè)值被轉(zhuǎn)為false帜慢,其他值都視為true笼裳。
undefined
null
false
0
NaN
""或''(空字符串)
null和undefined
null與undefined都可以表示“沒(méi)有”,含義非常相似粱玲。將一個(gè)變量賦值為undefined或null躬柬,老實(shí)說(shuō),語(yǔ)法效果幾乎沒(méi)區(qū)別抽减。
null的特殊之處在于允青,JavaScript把它包含在對(duì)象類型(object)之中。
typeof null // "object"
注意卵沉,JavaScript的標(biāo)識(shí)名區(qū)分大小寫(xiě)颠锉,所以u(píng)ndefined和null不同于Undefined和Null(或者其他僅僅大小寫(xiě)不同的詞形),后者只是普通的變量名史汗。
null表示空值琼掠,即該處的值現(xiàn)在為空。調(diào)用函數(shù)時(shí)淹办,某個(gè)參數(shù)未設(shè)置任何值眉枕,這時(shí)就可以傳入null恶复。比如怜森,某個(gè)函數(shù)接受引擎拋出的錯(cuò)誤作為參數(shù),如果運(yùn)行過(guò)程中未出錯(cuò)谤牡,那么這個(gè)參數(shù)就會(huì)傳入null副硅,表示未發(fā)生錯(cuò)誤。
undefined表示“未定義”翅萤。
Symbol
Symbol 是JavaScript的原始數(shù)據(jù)類型恐疲,Symbol實(shí)例是唯一且不可改變的.
let s = Symbol();
typeof s
// "symbol"
Symbol函數(shù)可以接受一個(gè)字符串作為參數(shù),表示對(duì) Symbol 實(shí)例的描述套么。注意培己,Symbol函數(shù)的參數(shù)只是表示對(duì)當(dāng)前 Symbol 值的描述,因此相同參數(shù)的Symbol函數(shù)的返回值是不相等的胚泌。
// 沒(méi)有參數(shù)的情況
var s1 = Symbol();
var s2 = Symbol();
s1 === s2 // false
// 有參數(shù)的情況
var s1 = Symbol('foo');
var s2 = Symbol('foo');
s1 === s2 // false
對(duì)象
對(duì)象(object)是JavaScript的核心概念省咨,也是最重要的數(shù)據(jù)類型。JavaScript的所有數(shù)據(jù)都可以被視為對(duì)象玷室。
所謂對(duì)象零蓉,就是一種無(wú)序的數(shù)據(jù)集合笤受,由若干個(gè)“鍵值對(duì)”(key-value)構(gòu)成。
var o = {
p: 'Hello World'
};
p是“鍵名”敌蜂,字符串Hello World是“鍵值”,鍵名與鍵值之間用冒號(hào)分隔箩兽。
對(duì)象的所有鍵名都是字符串。對(duì)象的每一個(gè)“鍵名”又稱為“屬性”(property)章喉,它的“鍵值”可以是任何數(shù)據(jù)類型汗贫。
檢查變量是否聲明
if ('a' in window) {
// 變量 a 聲明過(guò)
} else {
// 變量 a 未聲明
}
查看所有屬性
查看一個(gè)對(duì)象本身的所有屬性,可以使用Object.keys方法囊陡。
var o = {
key1: 1,
key2: 2
};
Object.keys(o);
// ['key1', 'key2']
(摘自 JavaScript 標(biāo)準(zhǔn)參考教程)