ホームページ >ウェブフロントエンド >jsチュートリアル >ES6 のシンボル関連の知識の紹介 (コード例)

ES6 のシンボル関連の知識の紹介 (コード例)

不言
不言転載
2018-11-26 15:59:572185ブラウズ

この記事では、ES6 のシンボル関連の知識 (コード例) を紹介します。必要な方は参考にしていただければ幸いです。

symbol は es6 で導入された型であり、プリミティブ型 (文字列、数値、ブール、null、未定義、シンボル) のカテゴリにも属します。

basic

let name = Symbol('xiaohesong')
typeof name // 'symbol'
let obj = {}
obj[name] = 'xhs'
console.log(obj[name]) //xhs

symbol for

これは共有可能です。作成時に、このキーのシンボルがグローバルに見つかるかどうかがチェックされ、存在しない場合はシンボルが直接返されます。存在する場合は、グローバルに作成および登録されます。

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)"
ここで説明する共有は、グローバル スコープと同様のグローバル共有であり、環境全体で共有されます。

symbol keyfor

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 はグローバル レジストリに存在しません。対応するキーを取得できません。

シンボルを強制的に変換することはできません。仕様に従って、ここでエラーが報告されます。 uid を文字列に変換して追加します。どうしても追加したい場合はString(uid)を追加してから追加することもできますが、現状では意味がないようです。

obj

let uid = Symbol('uid')
uid + ''

es6 のシンボル キーの取得 このために、Object.getOwnPropertySymbols メソッドが追加されました。

シンボルはほとんど使用されていないように感じますか?実際、es6 の内部ではまだ多くのシンボルが使用されています。

Symbol.hasInstance

すべての関数にこのメソッドがあります。このメソッドにはあまり馴染みがないかもしれませんが、これは実際には、instanceof が行うことです。そうです、es6 はこのメソッドを書き換えます。

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## を介して元の型に変換しようとします。 # .このメソッドは標準タイプのプロトタイプに存在します。

型変換を実行すると、toPrimitive はパラメータを呼び出す必要があります。仕様では、このパラメータは
hint と呼ばれます。このパラメータには 3 つの値があります ('number ' 、'string'、'default') のいずれか。 名前が示すように、string
string を返し、numbernumber を返します。デフォルトは指定されておらず、デフォルトです。 では、デフォルトの状況は何でしょうか?ほとんどの場合、デフォルトは数値モードです。 (日付を除き、そのデフォルト状況は文字列モードとみなされます) 実際には、型変換中に呼び出されるデフォルト状況はそれほど多くありません。 (==
,
) または Date のコンストラクター パラメーターにパラメーターを渡す場合など。

数値の場合の数値モードの動作 (優先順位が高いものから低いものまで)
  • 最初に valueOf を呼び出します (プリミティブ型の場合)。それから戻ります。
  • 前の値が元の値でない場合は、toString を呼び出してみます。元の値である場合は、
  • If を返します。存在しない場合は、エラーを報告します。
  • 文字列モード 文字列の場合、動作は若干異なります (優先度は高から低)
  • 最初に toString を呼び出し、それが元の値である場合は返します。
  • 前の値が元の値でない場合は、元の値であれば valueOf を呼び出してください。
  • エラーをスローする
  • まあ、少し混乱しているように感じます。はい、コードを説明しましょう。
let objs = {0: 'first', 1: 'second', length: 2, [Symbol.isConcatSpreadable]: true}
['arrs'].concat(objs) //["arrs", "first", "second"]
上記の出力から、ほとんどの場合、valueOf.

デフォルトの場合を含め、そのデフォルトは呼び出される数値モードであり、それらのほとんどは呼び出される数値モードであることがわかります。 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 サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。