JavaScript Symbol
如果之前沒有接觸過ES2015,那麼肯定沒有見過Symbol的身影。
JavaScript中資料總體分為兩類,一種是引用型別,另一種是值型別,本文不做具體介紹。
symbol是一種全新值型別資料,表示一種絕對不重複的值,記住是不可能重複的值。
關於資料型別相關知識可以參閱JavaScript 資料型別一章節。
首先看一段程式碼例項:
[JavaScript] 純文字檢視 複製程式碼執行程式碼let sVal = Symbol(); console.log(typeof sVal)
上述程式碼執行結果如下:
上述程式碼分析如下:
(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());
程式碼執行效果截圖如下:
上述程式碼在建立symbol型別資料的時候,給Symbol傳遞了引數作為標識。
然後將其轉換為字串格式,可以看到這個識別符號的作用。
在文章的開頭已經介紹過此型別資料是絕對不可能重複的,下面通過程式碼做一下演示。
[JavaScript] 純文字檢視 複製程式碼執行程式碼console.log(Symbol()==Symbol()); console.log(Symbol("螞蟻部落")==Symbol("螞蟻部落"));
程式碼執行效果截圖如下:
可以看到兩個symbol型別值是絕對不可能相等的,即便傳遞的引數一樣也不可能相等。
在JavaScript中很多資料可以進行隱式資料型別轉換,但是symbol型別資料不能進行。
關於隱式資料型別轉換更多內容可以參閱JavaScript 隱式資料型別轉換一章節。
[JavaScript] 純文字檢視 複製程式碼執行程式碼let s = Symbol("螞蟻部落"); //報錯 console.log("antzone" + s);
程式碼執行效果截圖如下:
可以看到,上面程式碼試圖嘗試進行隱式資料型別轉換,但是報錯了。
但是可以進行顯示資料型別轉換,其實上面程式碼已經有涉及,再看一段程式碼:
[JavaScript] 純文字檢視 複製程式碼執行程式碼let s = Symbol("螞蟻部落"); console.log(s.toString());
上述程式碼可以正常實現資料型別轉換效果,程式碼比較簡單,下面就不截圖了。
symbol型別資料可以還可以作為物件的屬性名稱,當然有一些細節需要特別注意。
看如下程式碼例項:
[JavaScript] 純文字檢視 複製程式碼執行程式碼let s = Symbol("螞蟻部落"); let obj = { [s]: "螞蟻部落" }; console.log(obj[s])
程式碼執行效果截圖如下:
程式碼分析如下:
(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 屬性一章節。
相關文章
- [Javascript] Symbol vs Symbol.forJavaScriptSymbol
- JavaScript Symbol物件JavaScriptSymbol物件
- javascript中的symbolJavaScriptSymbol
- [Javascript] Understanding JavaScript Proxies with Symbol.toPrimitiveJavaScriptSymbolMIT
- SymbolSymbol
- [譯] JavaScript 中為什麼會有 Symbol 型別?JavaScriptSymbol型別
- 面試官:JavaScript 原始資料型別 Symbol 有什麼用?面試JavaScript資料型別Symbol
- Symbol 的作用Symbol
- Symbol.for() 方法Symbol
- Symbol.iteratorSymbol
- Symbol詳解Symbol
- ES6 symbol 以及symbol的簡單應用Symbol
- Symbol toString() 方法Symbol
- es6 symbolSymbol
- JS 中的 SymbolJSSymbol
- Symbol 及其 屬性Symbol
- psql: symbol lookup error: ./psql: undefined symbol: PQsetErrorContextVisibilitySQLSymbolErrorUndefinedContext
- Symbol資料型別Symbol資料型別
- Symbol 的作用[翻譯]Symbol
- Symbol.keyFor() 方法Symbol
- ES6之symbolSymbol
- Yet Another Intro for SymbolSymbol
- Symbol.species 屬性Symbol
- Symbol.match 屬性Symbol
- Symbol.replace 屬性Symbol
- Symbol.search 屬性Symbol
- Symbol.split 屬性Symbol
- Symbol.toPrimitive 屬性SymbolMIT
- Symbol.unscopables 屬性Symbol
- ABAP指標field symbol!指標Symbol
- iconfontのsymbol的使用Symbol
- es6-symbol的用法Symbol
- 解決 Too many symbol filesSymbol
- ES6 - symbol&generatorSymbol
- Symbol.hasInstance 屬性Symbol
- Symbol.toStringTag 屬性Symbol
- 深入解析 ES6:SymbolSymbol
- toString && valueOf && Symbol.toPrimitive 辨析SymbolMIT