この記事では、ES6 のシンボル関連の知識 (コード例) を紹介します。必要な方は参考にしていただければ幸いです。
symbol は es6 で導入された型であり、プリミティブ型 (文字列、数値、ブール、null、未定義、シンボル) のカテゴリにも属します。
let name = Symbol('xiaohesong') typeof name // 'symbol' let obj = {} obj[name] = 'xhs' console.log(obj[name]) //xhs
これは共有可能です。作成時に、このキーのシンボルがグローバルに見つかるかどうかがチェックされ、存在しない場合はシンボルが直接返されます。存在する場合は、グローバルに作成および登録されます。
let uid = Symbol.for("uid"); let object = { [uid]: "12345" }; console.log(object[uid]); // "12345" console.log(uid); // "Symbol(uid)" let uid2 = Symbol.for("uid"); console.log(uid === uid2); // true console.log(object[uid2]); // "12345" console.log(uid2); // "Symbol(uid)"
let uid = Symbol.for("uid"); console.log(Symbol.keyFor(uid)); // "uid" let uid2 = Symbol.for("uid"); console.log(Symbol.keyFor(uid2)); // "uid" let uid3 = Symbol("uid"); console.log(Symbol.keyFor(uid3)); // undefined
共有シンボル uid3 はグローバル レジストリに存在しません。対応するキーを取得できません。
obj
let uid = Symbol('uid') uid + ''
シンボルはほとんど使用されていないように感じますか?実際、es6 の内部ではまだ多くのシンボルが使用されています。
Symbol.hasInstance
let uid = Symbol('uid') let obj = { [uid]: 'uid' } console.log(Object.keys(obj)) // [] console.log(Object.getOwnPropertyNames(obj)) // [] console.log(Object.getOwnPropertySymbols(obj)) // [Symbol(uid)]
実際には、es6 がそれを行います。
function Xiao(){} const xiao = new Xiao xiao instanceof Xiao // true
これは内部メソッドであり、書き換えはサポートされていません。もちろん、プロトタイプ上で書き直すことはできます。
Xiao[Symbol.hasInstance](xiao)
対応する値がブール型かどうかを返すように書き換えていることがわかります。
Symbol.isConcatSpreadable
Object.definePrototype(Xiao, Symbol.hasInstance, { value: (v) : Boolean(v) }) const x = new Xiao x instanceof Xiao //true 0 instanceof Xiao //false 1 instanceof Xiao //true
Symbol.toPrimitive
型変換を実行すると、toPrimitive
はパラメータを呼び出す必要があります。仕様では、このパラメータは
hint と呼ばれます。このパラメータには 3 つの値があります ('number ' 、'string'、'default') のいずれか。
名前が示すように、string
は
string を返し、
number は
number を返します。デフォルトは指定されておらず、デフォルトです。
では、デフォルトの状況は何でしょうか?ほとんどの場合、デフォルトは数値モードです。 (日付を除き、そのデフォルト状況は文字列モードとみなされます) 実際には、型変換中に呼び出されるデフォルト状況はそれほど多くありません。 (
==
,
) または
Date のコンストラクター パラメーターにパラメーターを渡す場合など。
最初に toString を呼び出し、それが元の値である場合は返します。
エラーをスローする
let objs = {0: 'first', 1: 'second', length: 2, [Symbol.isConcatSpreadable]: true} ['arrs'].concat(objs) //["arrs", "first", "second"]
デフォルトの場合を含め、そのデフォルトは呼び出される数値モードであり、それらのほとんどは呼び出される数値モードであることがわかります。 toString が string を呼び出すモードであることがわかります。したがって、文字列モードでない限り、基本的には数値モードであると考えることができます。
この通話モードについてよくわかりませんか?大丈夫、es6 はこの内部メソッドを外部に公開しているので、書き換えてヒントのタイプを出力できます。let obj = { valueOf: function(){console.log('valueOf')}, toString: function(){console.log('toString')} } // console.log value is obj + 2 //valueOf obj == 2 // valueOf Number(obj) // valueOf String(obj) // toString
以上がES6 のシンボル関連の知識の紹介 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。