一、數(shù)據(jù)類型
- JavaScript 語言的每一個值,都屬于某一種數(shù)據(jù)類型。 JavaScript 共有七種數(shù)據(jù)類型:
- 數(shù)值(number):包括整數(shù)和小數(shù)(比如
1和3.14)- 字符串(string):即文本(比如
Hello World)- 布爾值(boolean):表示真?zhèn)蔚膬蓚€特殊值,即
true和false- Symbol:ES6 新增,定義對象的唯一屬性名
- undefined:表示“未定義”或不存在,即由于目前沒有定義,所以此處暫時沒有任何值
- null:表示空值,即此處的值為空
- 對象(object):各種值組成的集合
-
基本(簡單)數(shù)據(jù)類型:數(shù)值、字符串、布爾值、Symbol、undefined、null
復(fù)雜數(shù)據(jù)類型:對象 - 對象是最復(fù)雜的數(shù)據(jù)類型,又可以分成三個子類型:狹義的對象(object)、數(shù)組(array)、函數(shù)(function)。
- 空數(shù)組
[]的類型也是 object,本質(zhì)上只是一種特殊的對象。
-
typeof運(yùn)算符
用以判斷數(shù)據(jù)類型,返回一個值的數(shù)據(jù)類型。
typeof 123 // "number"
typeof 'abc' // "string"
typeof false // "boolean"
typeof undefined // "undefined"
typeof {} // "object"
- 兩種特殊情況:
null和function
function f() {} // "function"
typeof null // "object"
二、 null 和 undefined
null與undefined都可以表示“沒有”,含義非常相似。
- 二者區(qū)別:
-
null是一個表示“空”的對象,轉(zhuǎn)為數(shù)值時為 0. -
undefined是一個表示”此處無定義”的原始值,轉(zhuǎn)為數(shù)值時為 NaN.
- 常見語法慣例:
- 變量沒有賦值 —— undefined
- 聲明一個對象 object,暫時不想給值
var obj = null—— null
聲明一個非對象,暫時不想給值var n (= undefined)—— undefined
三、布爾值
布爾值代表“真”和“假”兩個狀態(tài)。
“真”用關(guān)鍵字 true 表示,“假”用關(guān)鍵字 false 表示。
- 下列運(yùn)算符會返回布爾值:
兩元邏輯運(yùn)算符:
&&(And),||(Or)
前置邏輯運(yùn)算符:!(Not)
相等運(yùn)算符:===,!==,==,!=
比較運(yùn)算符:>,>=,<,<=
- 兩元運(yùn)算符運(yùn)算規(guī)則:
a && b:
true && true = true 、 true && false = false 、 false && false = false
a || b:
true && true = true 、 true && false = true 、 false && false = false
- 如果 JavaScript 預(yù)期某個位置應(yīng)該是布爾值,會將該位置上現(xiàn)有的值自動轉(zhuǎn)為布爾值。轉(zhuǎn)換規(guī)則是除了下面六個值被轉(zhuǎn)為 false,其他值都視為 true。
undefined、null、false、0、NaN、""或''(空字符串)
- 布爾值往往用于程序流程的控制。
四、數(shù)值
- 整數(shù)和浮點數(shù)
- JavaScript 內(nèi)部,所有數(shù)字都是以 64 位浮點數(shù)形式儲存,整數(shù)也是。所以
1===1.0,它們是同一個數(shù)。 - JavaScript 語言的底層根本沒有整數(shù),所有數(shù)字都是小數(shù)(64位浮點數(shù))
- 數(shù)值精度
-
JavaScript 浮點數(shù)的 64 個二進(jìn)制位組成(從最左邊開始):
第 1 位:符號位,
0表示正數(shù),1表示負(fù)數(shù)
第 2 位到第 12 位(共11位):指數(shù)部分
第 13 位到第 64 位(共52位):小數(shù)部分(即有效數(shù)字) 符號位決定了一個數(shù)的正負(fù),指數(shù)部分決定了數(shù)值的大小,小數(shù)部分決定了數(shù)值的精度。
正常情況下(指數(shù)部分在 0 到 2047 之間),一個數(shù)在 JavaScript 內(nèi)部實際的表示形式:
(-1)^符號位 * 1.xx...xx * 2^指數(shù)部分JavaScript 提供的有效數(shù)字最長為 53 個二進(jìn)制位,絕對值小于等于2的53次方的整數(shù),即 -2^53 到 2^53,都可以精確表示。由于 2 的 53 次方是一個 16 位的十進(jìn)制數(shù)值,所以 JavaScript 對 15 位的十進(jìn)制數(shù)都可以精確處理。大于 2 的 53 次方以后,多出來的有效數(shù)字都會無法保存,變成 0.
Math.pow(2, 53)
// 9007199254740992
9007199254740992111
// 9007199254740992000 多出的三個有效數(shù)字,將無法保存
- 進(jìn)制
二進(jìn)制:前綴為
0b的數(shù)字
八進(jìn)制:前綴為0u的數(shù)字,或以0開頭且只含0~7的數(shù)字
十進(jìn)制:不以0開頭的數(shù)字
十六進(jìn)制:前綴為0x的數(shù)字
- JavaScript 內(nèi)部會自動默認(rèn)將八進(jìn)制、十六進(jìn)制、二進(jìn)制轉(zhuǎn)為十進(jìn)制。
- 十進(jìn)制數(shù)值的記法包括整數(shù)、小數(shù) 和 科學(xué)計數(shù)法(
1.23e2 = 123)。
- 特殊數(shù)值
正 0 和負(fù) 0
幾乎所有場合,正 0 和負(fù) 0 都會被當(dāng)作正常的 0:+0 === -0 === 0
唯一有區(qū)別的場合是,+0 或 -0 當(dāng)作分母,返回的值是不相等的。NaN
NaN是 JavaScript 的特殊值,表示“非數(shù)字”(Not a Number)。
NaN不是獨(dú)立的數(shù)據(jù)類型,而是一個特殊數(shù)值,它的數(shù)據(jù)類型依然屬于 Number.
NaN在布爾運(yùn)算時被當(dāng)作false.
NaN不等于任何值,包括它本身;0 除以 0 等于NaN;NaN與任何數(shù)(包括它自己)的運(yùn)算,得到的都是NaN.Infinity
Infinity表示“無窮”,用來表示兩種場景:一種是一個正的數(shù)值太大或一個負(fù)的數(shù)值太小,無法表示;另一種是非 0 數(shù)值除以 0,得到Infinity。
Math.pow(2, 1024) // Infinity
0 / 0 // NaN
1 / 0 // Infinity
Infinity 有正負(fù)之分,Infinity 表示正的無窮,-Infinity 表示負(fù)的無窮。
Infinity與NaN比較,總是返回 false.
五、字符串
- 定義
-
字符串:放在
''或""之間的 0 個或多個字符。
''字符串里面可以用"";""字符串里面可以用''。 -
''含0 個字符,為“空字符串”,length=0;
' '含一個空格,為“空格字符串”,length=1. - 很多項目約定 JavaScript 語言的字符串只使用
''。
- 多行字符串
- 字符串默認(rèn)只能寫在一行內(nèi),分成多行將會報錯;
- 如果長字符串必須分成多行,可以在每一行的尾部使用反斜杠
\ - 反斜杠的后面必須是換行符,而不能有空格等其他字符,否則會報錯。
'ab \
cd \
ef'
// abcdef
- 模板字符串 (template string)(ES6 新增)
用反引號(`)標(biāo)識,可以用作普通字符串,也可以用來定義多行字符串(length 中包含回車),或在字符串中嵌入變量:
`ab
cd
ef`
// abcdef
- 連接運(yùn)算符
+
+可以連接多個單行字符串,將長字符串拆成多行書寫,輸出的時候也是單行。
'ab'
+ 'cd'
+ 'ef'
// abcdef
- 轉(zhuǎn)義
反斜杠\在字符串內(nèi)有特殊含義,用來表示一些特殊字符,又稱為轉(zhuǎn)義符。
\0:null(\u0000)
\b:后退鍵(\u0008)
\f:換頁符(\u000C)
\n:換行符(\u000A)
\r:回車鍵(\u000D)
\t:制表符(\u0009)
\v:垂直制表符(\u000B)
\':單引號(\u0027)
\":雙引號(\u0022)
\\:反斜杠(\u005C)
- 反斜杠的三種特殊用法:
(1)\HHH
\后面緊跟三個八進(jìn)制數(shù)(000到377),代表一個字符。
(2)\xHH
\x后面緊跟兩個十六進(jìn)制數(shù)(00到FF),代表一個字符。
(3)\uXXXX
\u后面緊跟四個十六進(jìn)制數(shù)(0000到FFFF),代表一個字符。
-
lenth 屬性
length屬性返回字符串的長度,該屬性是無法改變的。
var s = 'hello';
s.length // 5
- 字符集
- JavaScript 引擎內(nèi)部以 Unicode 儲存字符,所有字符都用 Unicode 表示。
- 程序中可使用 Unicode 碼點表示字符,即將字符寫成\uxxxx的形式:
var a = '\u006F\u006F';
a // "oo"
- 每個字符在 JavaScript 內(nèi)部都是以16位(即2個字節(jié))的 UTF-16 格式儲存。即 JavaScript 的單位字符長度固定為16位長度,2個字節(jié)。
(1)但UTF-16 有兩種長度:碼點在U+0000到U+FFFF之間的字符,長度為16位(即2個字節(jié));碼點在U+10000到U+10FFFF之間的字符,長度為32位(即4個字節(jié))。
(2)對于碼點在U+10000到U+10FFFF之間的字符,JavaScript 總是認(rèn)為它們是兩個字符(length屬性為2)。因此JavaScript 返回的 length 可能不正確。 - JavaScript 引擎不能自動識別編號大于 0xFFFF 的 Unicode 字符。
- Base64 轉(zhuǎn)碼
- Base64 是一種編碼方法,可以將任意值轉(zhuǎn)成 0~9、A~Z、a-z、+和/這64個字符組成的可打印字符。使不出現(xiàn)特殊字符,簡化程序的處理。
btoa():任意值轉(zhuǎn)為 Base64 編碼
atob():Base64 編碼轉(zhuǎn)為原來的值
var string = 'Hello World!';
btoa(string) // "SGVsbG8gV29ybGQh"
atob('SGVsbG8gV29ybGQh') // "Hello World!"
- 要將非ASCII碼(比如中文)字符轉(zhuǎn)為Base64編碼,必須中間插入一個轉(zhuǎn)碼環(huán)節(jié)。
六、對象
- 定義
- 對象(object)是一組“鍵值對”(key-value)的集合,是一種無序的復(fù)合數(shù)據(jù)集合(哈希表)。
- 對象是復(fù)雜類型(其他六類為簡單類型),由其他簡單類型組成。
- 對想是 JavaScript 語言的核心概念,也是最重要的數(shù)據(jù)類型。
- 語法
- 對象的所有鍵名(屬性)都是字符串(ES6 中 Symbol 值也可以作為鍵名),所以加不加引號都可以;空字符串也可以作為鍵名。
- 如果鍵名不符合“標(biāo)識符原則”(標(biāo)識符只能包含字母或數(shù)字或漢字或下劃線(“_”)或美元符號(“$”),且不能以數(shù)字開頭),并且也不是數(shù)字,則必須加上引號,否則會報錯。
- 鍵值可以為各種類型,鍵值的類型也可以為一個“對象”。
- 對象的屬性之間用逗號分隔。
var person = {
name: 'Frank',
age: 26,
gender: 'female',
married: true,
children: {name: 'Micle',age: 3} , // 鍵值也可以為對象
'': 'Frank' , // 屬性名也可以為空字符串
'9a':'Frank'
}
- 屬性的操作
- 讀取屬性的兩種方法:
person['name'](屬性名必須放在引號里,''不可省略)
person.name(特例,當(dāng)屬性名符合標(biāo)識符規(guī)則時才可用)
注意:數(shù)值鍵名不能使用點運(yùn)算符(會被當(dāng)成小數(shù)點);
使用方括號運(yùn)算符,可以不加引號,因為會自動轉(zhuǎn)成字符串:
var obj = {
123: 'Hello'
};
obj.123 // 報錯
obj['123'] // "Hello"
obj[123] // "Hello"
- 查看所有屬性:
Object.keys方法
Object.keys(person);
// ['name', 'age','gender','married','children','','9a']
- 刪除屬性:
delete
用于刪除對象的屬性,刪除成功后返回 true.
delete person['name'] // true
person.name // undefined
注意:若 delete 一個不存在的屬性, 不報錯且返回 true.
-
in運(yùn)算符
檢查對象是否包含某個屬性,包含就返回 true,否則返回 false.
'age' in person // true
'phone' in person // false
-
for...in循環(huán)
遍歷一個對象的全部屬性。
for (var key in person) {
console.log(key);
}
// name (順序隨機(jī))
// age
// ......
for (var key in person) {
console.log(person[key]);
}
// Frank
// 26
// ......
(1)for...in循環(huán)會跳過不可遍歷的屬性。
(2)它不僅遍歷對象自身的屬性,還遍歷繼承的屬性。
(3)循環(huán)不按聲明的順序遍歷屬性,順序隨機(jī)。