JavaScript Symbol

admin發表於2019-04-25

如果之前沒有接觸過ES2015,那麼肯定沒有見過Symbol的身影。

JavaScript中資料總體分為兩類,一種是引用型別,另一種是值型別,本文不做具體介紹。

symbol是一種全新值型別資料,表示一種絕對不重複的值,記住是不可能重複的值。

關於資料型別相關知識可以參閱JavaScript 資料型別一章節。

首先看一段程式碼例項:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let sVal = Symbol();
console.log(typeof sVal)

上述程式碼執行結果如下:

a:3:{s:3:\"pic\";s:43:\"portal/201904/25/153341rgm4gew7wvnwunen.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

上述程式碼分析如下:

(1).呼叫Symbol函式建立一個symbol型別資料,需要注意的是並不是通過建構函式方式。

(2).然後通過typeof運算子檢測器資料型別,列印結果為symbol。

關於typeof運算子的用法可以參閱JavaScript typeof 運算子一章節。

[JavaScript] 純文字檢視 複製程式碼
let s1 = Symbol("前端教程");
let s2 = Symbol("青島市南區");

上述程式碼分析如下:

(1).在建立symbol型別資料的時候,可以為Symbol()函式傳遞引數。

(2).此引數的作用就是作為當前資料的一個標識,便於識別。

(3).最後再強調一遍,建立symbol型別資料,直接呼叫Symbol函式,前面不能加new。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let s1 = Symbol("前端教程");
let s2 = Symbol("青島市南區");
console.log(s1.toString());
console.log(s2.toString());

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201904/25/153444xb07bb720bxbp727.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

上述程式碼在建立symbol型別資料的時候,給Symbol傳遞了引數作為標識。

然後將其轉換為字串格式,可以看到這個識別符號的作用。

在文章的開頭已經介紹過此型別資料是絕對不可能重複的,下面通過程式碼做一下演示。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
console.log(Symbol()==Symbol());
console.log(Symbol("螞蟻部落")==Symbol("螞蟻部落"));

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201904/25/153512mf33aou46r3g693f.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

可以看到兩個symbol型別值是絕對不可能相等的,即便傳遞的引數一樣也不可能相等。

在JavaScript中很多資料可以進行隱式資料型別轉換,但是symbol型別資料不能進行。

關於隱式資料型別轉換更多內容可以參閱JavaScript 隱式資料型別轉換一章節。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let s = Symbol("螞蟻部落");
//報錯
console.log("antzone" + s);

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201904/25/153558b3jfj6jwztjjg7qi.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

可以看到,上面程式碼試圖嘗試進行隱式資料型別轉換,但是報錯了。

但是可以進行顯示資料型別轉換,其實上面程式碼已經有涉及,再看一段程式碼:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let s = Symbol("螞蟻部落");
console.log(s.toString());

上述程式碼可以正常實現資料型別轉換效果,程式碼比較簡單,下面就不截圖了。

symbol型別資料可以還可以作為物件的屬性名稱,當然有一些細節需要特別注意。

看如下程式碼例項:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let s = Symbol("螞蟻部落");
let obj = {
  [s]: "螞蟻部落"
};
console.log(obj[s])

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201904/25/153639ntzg0jd28g0t04j7.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

程式碼分析如下:

(1).建立一個symbol型別資料s。

(2).並將其用作物件的屬性,需要注意的是,此時必須使用表示式方式,用了一箇中括號包裹。

如果屬性是symbol型別資料,那麼具有一些特殊的情況,與其他屬性有所不同,分別羅列如下:

(1).屬性不能夠被for in和for of遍歷到。

(2).屬性值不能被Object.keys()和Object.getOwnPropertyNames()方法獲取到。

(3).屬性值可以被Object.getOwnPropertySymbols()和Reflect.ownKeys方法獲取到。

方法與屬性:

此型別資料對應的方法和屬性非常的多,本文就不一一介紹了。

下面你給出對應文章的連結,需要的朋友檢視對應文章即可:

(1).Symbol.for() 方法一章節。

(2).Symbol.keyFor() 方法一章節。

(3).Symbol.prototype.toString() 方法一章節。

(4).Symbol.iterator 屬性一章節。

(5).Symbol.match 屬性一章節。

(6).Symbol.species 屬性一章節。

(7).Symbol.hasInstance 屬性一章節。

(8).Symbol.isConcatSpreadable 屬性一章節。

(9).Symbol.replace 屬性一章節。

(10).Symbol.search 屬性一章節。

(11).Symbol.split 屬性一章節。

(12).Symbol.toPrimitive 屬性一章節。

(13).Symbol.toStringTag 屬性一章節。

(14).Symbol.unscopables 屬性一章節。

相關文章