1. 概述
JavaScript一共有7種資料型別:
- 數值(number):整數和小數
- 字串(string):文字(比如
Hello World
)。 - 布林值(boolean):表示真偽的兩個特殊值,即
true
(真)和false
(假) undefined
:表示“未定義”或不存在,即由於目前沒有定義,所以此處暫時沒有任何值null
:表示空值,即此處的值為空。- 物件(object):各種值組成的集合。
- 符號(symbol):ES6新增。暫不討論。
一般將number,string,boolean視為原始型別(primitive type)的值,物件則稱為合成型別(complex type)的值,undefined和null為JS特有的特殊的值。
物件又可以分為三個子型別:
- 狹義的物件(object)
- 陣列(array)
- 函式(function)
需要注意的是array和function並不是七種型別之一。
2. 數值
- 所有數字都是以64位浮點數形式儲存(很浪費)
- 小數運算不精確
0.1 + 0.2
0.30000000000000004
複製程式碼
- JavaScript的精度範圍為-253到253 ,能夠表示的數值範圍為21024到2-1023
- 數值的進位制:開頭有0要小心
- 十進位制:沒有前導0的數值。
- 八進位制:有字首
0o
或0O
的數值,或者有前導0、且只用到0-7的八個阿拉伯數字的數值。 - 十六進位制:有字首
0x
或0X
的數值。 - 二進位制:有字首
0b
或0B
的數值。
0xff // 255
0o377 // 255
0b11 // 3
複製程式碼
- 特殊數字
NaN
:Not a Number+Infinity
,-Infinity
3. 字串
- JavaScript 不僅以 Unicode 儲存字元,還允許直接在程式中使用 Unicode 碼點表示字元,即將字元寫成
\uxxxx
。但 JavaScript 對 UTF-16 的支援是不完整的,只編到U+FFFF
。 - 空字串:
''
- 多行字串
var a = '123' +
'456';
複製程式碼
var a = `123
456`;
複製程式碼
- 轉義符
\n :換行符(\u000A)
\r :Enter鍵(\u000D)
\' :單引號(\u0027)
\" :雙引號(\u0022)
\\ :反斜槓(\u005C)
\0 :null(\u0000)
\b :後退鍵(\u0008)
\f :換頁符(\u000C)
\t :製表符(\u0009)
\v :垂直製表符(\u000B)
複製程式碼
- Base64 轉碼
btoa()
:任意值轉為 Base64 編碼atob()
:Base64 編碼轉為原來的值- 要將非 ASCII 碼字元轉為 Base64 編碼,必須中間插入一個轉碼環節,再使用這兩個方法
4. 布林值
- 布林值代表“真”和“假”兩個狀態。“真”用關鍵字
true
表示,“假”用關鍵字false
表示。布林值只有這兩個值。 - 運算子號
前置邏輯運算子:! (Not)
相等運算子:===,!==,==,!=
比較運算子:>,>=,<,<=
複製程式碼
- 以下6個值轉化為Boolean時為
false
,稱為falsy(虛值)。undefined null false 0 NaN ""或''(空字串)
5. null 和 undefined
- 都表示沒有值,
null
表示空值,即該處的值現在為空。undefined
表示“未定義”。
undefined == null // true
複製程式碼
- (習俗)如果你想表示一個還沒賦值的物件,就用
null
。如果你想表示一個還沒賦值的字串/數字/布林/symbol,就用undefined
(但是實際上你直接var xxx
一下就行了,不用寫var xxx = undefined
)
6. 物件
- 物件就是一組“鍵值對”(key-value)的集合,是就是幾種基本資料型別(無序地)組合在一起。
- 因此物件裡面也可以有物件
- key必須為字串,不符合識別符號條件必須加引號(更多人不喜歡加)。
- 屬性讀取:有兩種方法,一種是使用點運算子,還有一種是使用方括號運算子
- 符合識別符號規則時,
object['key']
可以寫作object.key
- 如果使用方括號運算子,鍵名必須放在引號裡面,否則會被當作變數處理。注意
object['key']
與object[key]
區別
- 符合識別符號規則時,
- 屬性刪除:
delete object['key']
- 查詢該屬性值為undefined,此時key也刪掉了,用in查為false
- 如果給key賦值undefined,用in查為true
- 屬性檢視:
Object.keys
- 屬性是否存在:用
in
運算子,自身和繼承的都能看到。
var obj = { p: 1 };
'p' in obj // true
'toString' in obj // true
複製程式碼
- 屬性遍歷:
for...in
- 它遍歷的是物件所有可遍歷(enumerable)的屬性,會跳過不可遍歷的屬性。
- 它不僅遍歷物件自身的屬性,還遍歷繼承的屬性。
7. typeof 運算子
typeof可以用來判斷資料型別,但是存在兩個bug:
typeof null //'object'
- 並沒有function資料型別,但會顯示
function f() {}
typeof // "function"
複製程式碼