【JavaScript基礎筆記】字符串、對象語法
字符串
常用轉義特殊字符
\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
(3)\uXXXX
\u
後面緊跟四個十六進制數(0000
到FFFF
),代表一個字符。XXXX
對應該字符的 Unicode 碼點,比如\u00A9
表示版權符號。
我們還需要知道,每個字符在 JavaScript 內部都是以16位(即2個字節)的 UTF-16 格式儲存。也就是說,JavaScript 的單位字符長度固定為16位長度,即2個字節。
但是,UTF-16 有兩種長度:對於碼點在U+0000
到U+FFFF
之間的字符,長度為16位(即2個字節);對於碼點在U+10000
到U+10FFFF
之間的字符,長度為32位(即4個字節),而且前兩個字節在0xD800
到0xDBFF
之間,後兩個字節在0xDC00
0xDFFF
之間。舉例來說,碼點U+1D306
對應的字符為??,
它寫成 UTF-16 就是0xD834 0xDF06
。
JavaScript 對 UTF-16 的支持是不完整的,由於歷史原因,只支持兩字節的字符,不支持四字節的字符。這是因為 JavaScript 第一版發布的時候,Unicode 的碼點只編到U+FFFF
,因此兩字節足夠表示了。後來,Unicode 納入的字符越來越多,出現了四字節的編碼。但是,JavaScript 的標準此時已經定型了,統一將字符長度限制在兩字節,導致無法識別四字節的字符。上一節的那個四字節字符??
,瀏覽器會正確識別這是一個字符,但是 JavaScript 無法識別,會認為這是兩個字符。
‘??‘.length // 2
上面代碼中,JavaScript 認為??
的長度為2,而不是1。
總結一下,對於碼點在U+10000
到U+10FFFF
之間的字符,JavaScript 總是認為它們是兩個字符(length
屬性為2)。所以處理的時候,必須把這一點考慮在內,也就是說,JavaScript 返回的字符串長度可能是不正確的。
btoa()
:任意值轉為 Base64 編碼
atob()
:Base64 編碼轉為原來的值
要將非 ASCII 碼字符轉為 Base64 編碼,必須中間插入一個轉碼環節,再使用這兩個方法。
對象
簡單說,對象就是一組“鍵值對”(key-value)的集合,是一種無序的復合數據集合。
鍵值/value/屬性,可以動態創建,不必在對象聲明時就指定。
null 空對象
undefined 空的非對象
對象采用大括號表示,這導致了一個問題:如果行首是一個大括號,它到底是表達式還是語句?
{ foo: 123 }
JavaScript 引擎讀到上面這行代碼,會發現可能有兩種含義。第一種可能是,這是一個表達式,表示一個包含foo
屬性的對象;第二種可能是,這是一個語句,表示一個代碼區塊,裏面有一個標簽foo
,指向表達式123
。
為了避免這種歧義,V8 引擎規定,如果行首是大括號,一律解釋為對象。不過,為了避免歧義,最好還是在大括號前加上圓括號。
讀取或賦值
讀取或者賦值對象的屬性,有兩種方法,一種是使用點運算符,還有一種是使用方括號運算符。
註意,數值鍵名不能使用點運算符(因為會被當成小數點),只能使用方括號運算符。
var foo = ‘bar‘;
var obj = {
foo: 1,
bar: 2
};
obj.foo // 1
obj[foo] // 2
上面代碼中,引用對象obj
的foo
屬性時,如果使用點運算符,foo
就是字符串;如果使用方括號運算符,但是不使用引號,那麽foo
就是一個變量,指向字符串bar
。
查看一個對象本身的所有屬性,可以使用Object.keys
方法。
var obj = {
key1: 1,
key2: 2
};
Object.keys(obj);
刪除
var person = {name: john}
delete person[‘name‘] // 這樣會將value和key同時刪除,name in person = false
person.name = undefined //這樣會刪除value,保留key,name in person =ture
註意,刪除一個不存在的屬性,delete
不報錯,而且返回true
。
只有一種情況,delete
命令會返回false
,那就是該屬性存在,且不得刪除。
var obj = Object.defineProperty({}, ‘p‘, {
value: 123,
configurable: false
});
obj.p // 123
delete obj.p // false
上面代碼之中,對象obj
的p
屬性是不能刪除的,所以delete
命令返回false
(關於Object.defineProperty
方法的介紹,請看《標準庫》的 Object 對象一章)。
另外,需要註意的是,delete
命令只能刪除對象本身的屬性,無法刪除繼承的屬性(關於繼承參見《面向對象編程》章節)。
遍歷
如果繼承的屬性是可遍歷的,那麽就會被for...in
循環遍歷到。但是,一般情況下,都是只想遍歷對象自身的屬性,所以使用for...in
的時候,應該結合使用hasOwnProperty
方法,在循環內部判斷一下,某個屬性是否為對象自身的屬性。
with語句
它的作用是操作同一個對象的多個屬性時,提供一些書寫的方便。
// 例一
var obj = {
p1: 1,
p2: 2,
};
with (obj) {
p1 = 4;
p2 = 5;
}
// 等同於
obj.p1 = 4;
obj.p2 = 5;
// 例二
with (document.links[0]){
console.log(href);
console.log(title);
console.log(style);
}
// 等同於
console.log(document.links[0].href);
console.log(document.links[0].title);
console.log(document.links[0].style);
上述筆記引用自——阮一峰《JavaScript 標準參考教程(alpha)》
【JavaScript基礎筆記】字符串、對象語法