1. 程式人生 > >【JavaScript基礎筆記】字符串、對象語法

【JavaScript基礎筆記】字符串、對象語法

簡單 var 變量 ons u+ 因此 rip 不支持 無法識別

字符串

常用轉義特殊字符

  • \0 :null(\u0000
  • \b :後退鍵(\u0008
  • \f :換頁符(\u000C
  • \n :換行符(\u000A
  • \r :回車鍵(\u000D
  • \t :制表符(\u0009
  • \v :垂直制表符(\u000B
  • \‘ :單引號(\u0027
  • \" :雙引號(\u0022
  • \\ :反斜杠(\u005C

反斜杠還有三種特殊用法。

(1)\HHH

反斜杠後面緊跟三個八進制數(000377),代表一個字符。HHH對應該字符的 Unicode 碼點,比如\251表示版權符號。顯然,這種方法只能輸出256種字符。

(2)\xHH

\x後面緊跟兩個十六進制數(00FF),代表一個字符。HH對應該字符的 Unicode 碼點,比如\xA9

表示版權符號。這種方法也只能輸出256種字符。

(3)\uXXXX

\u後面緊跟四個十六進制數(0000FFFF),代表一個字符。XXXX對應該字符的 Unicode 碼點,比如\u00A9表示版權符號。

我們還需要知道,每個字符在 JavaScript 內部都是以16位(即2個字節)的 UTF-16 格式儲存。也就是說,JavaScript 的單位字符長度固定為16位長度,即2個字節。

但是,UTF-16 有兩種長度:對於碼點在U+0000U+FFFF之間的字符,長度為16位(即2個字節);對於碼點在U+10000U+10FFFF之間的字符,長度為32位(即4個字節),而且前兩個字節在0xD8000xDBFF之間,後兩個字節在0xDC00

0xDFFF之間。舉例來說,碼點U+1D306對應的字符為??,它寫成 UTF-16 就是0xD834 0xDF06

JavaScript 對 UTF-16 的支持是不完整的,由於歷史原因,只支持兩字節的字符,不支持四字節的字符。這是因為 JavaScript 第一版發布的時候,Unicode 的碼點只編到U+FFFF,因此兩字節足夠表示了。後來,Unicode 納入的字符越來越多,出現了四字節的編碼。但是,JavaScript 的標準此時已經定型了,統一將字符長度限制在兩字節,導致無法識別四字節的字符。上一節的那個四字節字符??,瀏覽器會正確識別這是一個字符,但是 JavaScript 無法識別,會認為這是兩個字符。

‘??‘.length // 2

上面代碼中,JavaScript 認為??的長度為2,而不是1。

總結一下,對於碼點在U+10000U+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

上面代碼中,引用對象objfoo屬性時,如果使用點運算符,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

上面代碼之中,對象objp屬性是不能刪除的,所以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基礎筆記】字符串、對象語法