symbol是一種基本資料型別,常常用symbol([description])返回乙個symbol型別的值。
// 只能通過 變數 來獲取值。(還有一種,後面說道)
let n =
symbol
('a');
let obj =
console.
log( obj[n]
)
symbol類似於內建物件類,具有constructor
(symbol.prototype),但不能new
。
var sym =
newsymbol()
;// typeerror
let n =
symbol()
;// 返回乙個唯一值。
let m =
symbol
('aa');
symbol
('foo'
)===
symbol
('foo'
)// false
乙個應用場景
// redux
//let v_d = 'vvv_ddd';
let v_d =
symbol
('vvv_ddd');
switch
(active.type)
當轉為number值時,會拋錯。轉字串時也會出錯。
// symbol 不能參與運算
let n =
symbol()
console.
log( n +12)
// typeerror
console.
log( n +
'uzi'
)// typeerror
number
(n)// typeerror
// 下面的可以執行
string
(n)// "symbol()"
object
(n)// symbol
boolean
(n)// true
for...in
語句可以用來迭代 陣列、類陣列、字串等可以進行迭代迴圈,他們有乙個共同點:具備可列舉性。
for...in
、object.keys(obj)
、object.getownpropertynames(obj)
均無法遍歷到 symbol 型別值。
我們可以用過object.getownpropertysymbols(obj)
來返回獲取其包含symbol型別值的陣列。
// 可被迭代物件:擁有symbol.iterator這個屬性。
let n =
symbol
('a');
let obj =
// 拿symbol的另一種方法。
let symbolarr = object.
getownpropertysymbols
(obj)
// 獲取symbol的 鍵
symbolarr.
foreach
( item =>
)
注意:當物件含有symbol型別值的鍵值對時,使用深轉殖(json)會轉殖不到symbol型別的值。
let n =
symbol
('a');
let obj =
json
.parse
(json
.stringify
(obj)
)
symbol 的hasinstance
屬性。
判斷某物件是否為某構造器的例項。
let obj =
console.
log( obj instanceof
object
)// true
// instanceof 的實現原理就是 依據 symbol.hasinstance 進行判斷。
// 使用 instanceof 就會預設呼叫 symbol.hasinstance
console.
log( object[symbol.hasinstance]
(obj)
)// true
// eg2
class
person
let p1 =
newperson
;console.
log( p1 instanceof
person
)// true
console.
log( person[symbol.hasinstance]
(p1)
)// true
symbol的isconcatspreadable
屬性,值為布林值,表示該物件用於array.prototype.concat()時,是否可以展開。
const alpha =
['a'
,'b'
,'c'];
const numeric =[1
,2,3
];let alphanumeric = alpha.
concat
(numeric)
;numeric[symbol.isconcatspreadable]
=false
// 該陣列不展開
console.
log( alpha.
concat
(numeric)
)
symbol.iterator
擁有該屬性的物件被稱作為可被迭代的物件,可以使用for...of
迴圈。
// 所有可被迭代的物件才能用 for of 迴圈
// 可被得迭代的物件:擁有symbol.iterator這個屬性。
let obj =
for(
let item in obj )
symbol.toprimitive
該物件被轉化成原始型別的值的時候,會呼叫這個方法,返回該物件對應的原始型別值。
hint
:表示要轉換到的原始值的預期型別。 hint 引數的取值是 「number」、「string」 和 「default」 中的任意乙個。
let a =
}// a 會轉換型別,觸發 symbol.toprimitive
if( a ==
1&& a ==
2&& a ==3)
注:在進行型別轉化的時候,若沒有symbol.toprimitive
,則會呼叫valueof(){}
let a =}if
( a ==
1&& a ==
2&& a ==3)
symbol.tostringtag
在該物件上面呼叫object.prototype.tostring
方法時,如果屬性存在,它的返回值會出現在tostring的返回值的字串之中,表示物件的型別。
class
person
let p =
newperson()
console.
log( object.prototype.tostring.
call
(p))
// [object object]
// 擁有自己像設定的型別
class
person
}let p =
newperson()
console.
log( object.prototype.tostring.
call
(p))
// [object person]
ES6 symbol 以及symbol的簡單應用
1.es6 引入了一種新的原始資料型別symbol,表示獨一無二的值。2.symbol 值通過symbol函式生成。3.symbol 函式可以接受乙個字串作為引數,表示對 symbol 例項的描述,主要是為了在控制台顯示,或者轉為字串時,比較容易區分。4.es2019 提供了乙個例項屬性descri...
make 知識點 symbol 常用符號問題
1.symbol is for target now is edit is for the whole prerequisties now is hello.j a hi.j a work.j a is for the first prerequistie now is hello.j a exam...
Ruby 學習筆記 Symbol
ruby 學習筆記 symbol symbol 在 ruby 中是由乙個標示符前面加乙個冒號 組成的。從程式設計師的角度說它不是字串,不是變數,不是常量,他僅是個名字,它的值是它自己。從直譯器的角度說,它是乙個指向乙個 symbol table 的指標,這個 symbol table 是乙個ruby...