JavaScript 是一種弱類型或者說動態語言。這意味著你不用提前聲明變量的類型,在程序運行過程中,類型會被自動確定。
數據類型
最新的 ECMAScript 標準定義了7種數據類型:
- 6種基本類型:
- 數值(number)
- 字符串(string)
- 布爾值(boolean)
- undefined
- null
- Symbol
- 和對象(object)
typeof運算符
typeof運算符可以返回一個值的數據類型,返回一個字符串。
數值
根據 ECMAScript 標準,JavaScript 中只有一種數值類型:基于 IEEE 754 標準的雙精度 64 位二進制格式的值(-( $2^{63}$ -1) 到 $2^{63}$ -1)。它并沒有為整數給出一種特定的類型。除了能夠表示浮點數外,還有一些帶符號的值:+Infinity,-Infinity 和 NaN (非數值,Not-a-Number)。
在JavaScript語言的底層,根本沒有整數,所有數字都是小數(64位浮點數)。
1 === 1.0 // true
由于浮點數不是精確的值,所以涉及小數的比較和運算要特別小心。
0.1 + 0.2 === 0.3
// false
0.1 + 0.2
// 0.30000000000000004
數值的進制
JavaScript對整數提供四種進制的表示方法:十進制、十六進制、八進制、2進制。
十進制:沒有前導0的數值
八進制:有前綴0o或0O的數值,或者有前導0、且只用到0-7的七個阿拉伯數字的數值。
十六進制:有前綴0x或0X的數值。?
二進制:有前綴0b或0B的數值。
NaN
NaN是JavaScript的特殊值,表示“非數字”(Not a Number),主要出現在將字符串解析成數字出錯的場合。
typeof NaN // 'number'
運算規則
NaN不等于任何值,包括它本身。
NaN === NaN // false
字符串
字符串就是零個或多個排在一起的字符,放在單引號或雙引號之中。
'abc'
"abc"
如果長字符串必須分成多行,可以在每一行的尾部使用反斜杠。
var longString = "Long \
long \
long \
string";
longString
// "Long long long string"
轉義
反斜杠(\)在字符串內有特殊含義,用來表示一些特殊字符,所以又稱為轉義符。
\0 null(\u0000)
\b 后退鍵(\u0008)
\f 換頁符(\u000C)
\n 換行符(\u000A)
\r 回車鍵(\u000D)
\t 制表符(\u0009)
\v 垂直制表符(\u000B)
' 單引號(\u0027)
" 雙引號(\u0022)
\ 反斜杠(\u005C)
反斜杠還有三種特殊用法。
(1)\HHH
反斜杠后面緊跟三個八進制數(000到377),代表一個字符。HHH對應該字符的Unicode碼點,比如\251表示版權符號。顯然,這種方法只能輸出256種字符。
(2)\xHH
\x后面緊跟兩個十六進制數(00到FF),代表一個字符。HH對應該字符的Unicode碼點,比如\xA9表示版權符號。這種方法也只能輸出256種字符。
(3)\uXXXX
\u后面緊跟四個十六進制數(0000到FFFF),代表一個字符。HHHH對應該字符的Unicode碼點,比如\u00A9表示版權符號。
Base64轉碼
Base64是一種編碼方法,可以將任意字符轉成可打印字符。
JavaScript原生提供兩個Base64相關方法。
btoa():字符串或二進制值轉為Base64編碼
atob():Base64編碼轉為原來的編碼
var string = 'Hello World!';
btoa(string) // "SGVsbG8gV29ybGQh"
atob('SGVsbG8gV29ybGQh') // "Hello World!"
要將非ASCII碼字符轉為Base64編碼,必須中間插入一個轉碼環節,再使用這兩個方法。
function b64Encode(str) {
return btoa(encodeURIComponent(str));
}
function b64Decode(str) {
return decodeURIComponent(atob(str));
}
b64Encode('你好') // "JUU0JUJEJUEwJUU1JUE1JUJE"
b64Decode('JUU0JUJEJUEwJUU1JUE1JUJE') // "你好"
布爾值
布爾值只有兩個值:true和false。
除了下面六個值被轉為false,其他值都視為true。
undefined
null
false
0
NaN
""或''(空字符串)
null和undefined
null與undefined都可以表示“沒有”,含義非常相似。將一個變量賦值為undefined或null,老實說,語法效果幾乎沒區別。
null的特殊之處在于,JavaScript把它包含在對象類型(object)之中。
typeof null // "object"
注意,JavaScript的標識名區分大小寫,所以undefined和null不同于Undefined和Null(或者其他僅僅大小寫不同的詞形),后者只是普通的變量名。
null表示空值,即該處的值現在為空。調用函數時,某個參數未設置任何值,這時就可以傳入null。比如,某個函數接受引擎拋出的錯誤作為參數,如果運行過程中未出錯,那么這個參數就會傳入null,表示未發生錯誤。
undefined表示“未定義”。
Symbol
Symbol 是JavaScript的原始數據類型,Symbol實例是唯一且不可改變的.
let s = Symbol();
typeof s
// "symbol"
Symbol函數可以接受一個字符串作為參數,表示對 Symbol 實例的描述。注意,Symbol函數的參數只是表示對當前 Symbol 值的描述,因此相同參數的Symbol函數的返回值是不相等的。
// 沒有參數的情況
var s1 = Symbol();
var s2 = Symbol();
s1 === s2 // false
// 有參數的情況
var s1 = Symbol('foo');
var s2 = Symbol('foo');
s1 === s2 // false
對象
對象(object)是JavaScript的核心概念,也是最重要的數據類型。JavaScript的所有數據都可以被視為對象。
所謂對象,就是一種無序的數據集合,由若干個“鍵值對”(key-value)構成。
var o = {
p: 'Hello World'
};
p是“鍵名”,字符串Hello World是“鍵值”,鍵名與鍵值之間用冒號分隔。
對象的所有鍵名都是字符串。對象的每一個“鍵名”又稱為“屬性”(property),它的“鍵值”可以是任何數據類型。
檢查變量是否聲明
if ('a' in window) {
// 變量 a 聲明過
} else {
// 變量 a 未聲明
}
查看所有屬性
查看一個對象本身的所有屬性,可以使用Object.keys方法。
var o = {
key1: 1,
key2: 2
};
Object.keys(o);
// ['key1', 'key2']
(摘自 JavaScript 標準參考教程)