VUE3.0 をすぐに始める方法:
シンボル (symbol) は ES6 の新しいデータ型です。シンボルはプリミティブ値 (基礎となるデータ型) であり、シンボル インスタンスは一意で不変です。これは、一意にマークを付けるために使用され、文字列以外の形式でオブジェクト属性として使用されるため、オブジェクト属性が一意の識別子を使用し、属性の競合の危険がないようにするために生成されます。
シンボルは、Symbol() 関数を使用して初期化する必要があります。シンボル自体はプリミティブ型であるため、typeof 演算子はシンボルに対してシンボルを返します。
sym = Symbol(); とします。 console.log(typeof sym); // シンボル
Symbol() 関数は説明する文字列パラメータを受け取ることができ、この文字列を使用してコードをデバッグできます。ただし、複数の Symbol() 関数が同じパラメータを受け入れたとしても、それらの値は等しくないことに注意してください。
genericSymbol = Symbol(); とします。 otherGenericSymbol = Symbol(); とします。 fooSymbol = Symbol("foo"); とします。 let otherFooSymbol = Symbol("foo"); console.log(genericSymbol == otherGenericSymbol); // false console.log(fooSymbol == otherFooSymbol); // false
コード内の複数の場所で同じ Symbol インスタンスを使用する必要がある場合は、文字列を渡して Symbol.for( ) メソッドを使用して、シングルトン モードと同様に、Symbol.for() を初めて使用するとき、渡されたパラメーターに基づいて Symbol.for() を使用してシンボルを作成するかどうかをグローバルに検索します。インスタンスが渡されている場合は再利用し、存在しない場合は
新しいシンボルを作成します let fooGlobalSymbol = Symbol.for("foo") // 新しいシンボルを作成します let otherFooGlobalSymbol = Symbol.for("foo"); / 再利用する Signed console.log(fooGlobalSymbol === otherFooGlobalSymbol); // true
Symbol.for() によって作成されたインスタンスと Symbol() によって作成されたインスタンスの違い: Symbol() によって作成されたインスタンスは常に一意です。入力パラメータは同じであり、他のインスタンスと等しいため、変更されません。ただし、パラメータが同じであれば、Symbol.for() によって作成されたインスタンスは同じになります。これは、同じ Symbol インスタンスを共有するためです。
let fooSymbol =シンボル("foo"); let otherFooSymbol = Symbol("foo"); console.log(fooSymbol == otherFooSymbol); // false let fooGlobalSymbol = Symbol.for("foo"); // 新しいシンボルを作成します let otherFooGlobalSymbol = Symbol.for("foo"); // 既存のシンボルを再利用します console.log(fooGlobalSymbol === otherFooGlobalSymbol);
オブジェクト内の属性は通常文字列の形式ですが、実際には Symbol インスタンスを属性として使用することもできます。この利点は、新しい属性が以前の属性を上書きしないことです
。 「ふー」)、 s2 = シンボル("バー"), s3 = シンボル("baz"), s4 = シンボル("qux"); しましょう = { [s1]: "foo val", }; // これも機能します: o[s1] = 'foo val'; コンソール.ログ(o); // {Symbol(foo): foo val} Object.defineProperty(o, s2, { value: "bar val" }); コンソール.ログ(o); // {シンボル(foo): foo val, シンボル(bar): bar val} Object.defineProperties(o, { [s3]: { 値: "baz val" }, [s4]: { 値: "qux val" }, }); コンソール.ログ(o); // {シンボル(foo): foo val, シンボル(bar): bar val, // Symbol(baz): baz val, Symbol(qux): qux val}
注:オブジェクト属性として Symbol インスタンスを作成する場合、最初にそれを受け取る変数を宣言せずにシンボルを変更した場合は、その後、そのシンボルをトラバースする必要があります。オブジェクトのすべてのシンボルを調べて、対応するプロパティ キーを見つけます。
let o = { [シンボル("foo")]: "foo val", [シンボル("バー")]: "バー値", }; コンソール.ログ(o); // {Symbol(foo): "foo val", Symbol(bar): "bar val"} let barSymbol = Object.getOwnPropertySymbols(o).find(symbol =>symbol.toString().match(/bar/)); console.log(barSymbol); // Symbol(bar)
ES6 では、開発者が言語の内部動作を直接アクセス、書き換え、またはシミュレートできるように、一般的に使用される多数の組み込みシンボル (既知のシンボル) も導入しています。行動。これらのデフォルト属性を変更すると、一部の操作の最終的な実行結果が変更される可能性があります。たとえば、for-of ループは関連するオブジェクトの Symbol.iterator プロパティを使用するため、カスタム オブジェクトの Symbol.iterator の値を再定義することで、オブジェクトを反復するときの for-of の動作を変更できます。
は、実際には Promise を返す Generator で、通常は for await とともに使用されます。
ECMAScript 仕様によれば、このシンボルは属性として「オブジェクトのデフォルトの AsyncIterator を返すメソッド」を表します。 "を使用した await -of ステートメント。つまり、このシンボルは非同期イテレータ API を実装する関数を表します。
このプロパティは、関数プロトタイプで定義されます。オブジェクト インスタンスが特定のコンストラクターに属しているかどうかを判断するために、instanceof 演算子を使用できることは誰もが知っています。原則として、instanceof 演算子は Symbol.hasInstance 関数を使用して関係
関数 Foo() {}を決定します。
let f = new Foo(); console.log(f instanceof Foo); // true クラスバー{} b = 新しい Bar(); とします。 console.log(b instanceof Bar); // true
関数の Symbol.hasInstance プロパティを再定義すると、instanceof メソッドで予期しないものを返すことができます
class Bar {} class Baz extends Bar { static [Symbol.hasInstance]() { false を返します。 } } b = 新しい Baz(); とします。 console.log(Bar[Symbol.hasInstance](b)); // true console.log(b インスタンスオブバー); // true console.log(Baz[Symbol.hasInstance](b)); // false console.log(b instanceof Baz); // false
このプロパティは Array のプロトタイプで定義されています
。ECMAScript 仕様によれば、このシンボルはプロパティとして「ブール値」を表します。これが true の場合、それは次のことを意味します。オブジェクトは Array を使用する必要があります。prototype.concat() はその配列要素を平坦化します。」 ES6 の Array.prototype.concat() メソッドは、受け取ったオブジェクト タイプに基づいて、配列のような (擬似配列) オブジェクトを配列インスタンスに結合する方法を選択します。したがって、Symbol.isConcatSpreadable の値を変更すると、この動作を変更できます。
false:オブジェクト全体を配列に追加します。 true:ペア全体を配列に追加します
。 配列 = ["バー"]; console.log(array[Symbol.isConcatSpreadable]); // 未定義 console.log(initial.concat(array)); // ['foo', 'bar'] 配列[Symbol.isConcatSpreadable] = false; console.log(initial.concat(array)); // ['foo', Array(1)] let arrayLikeObject = { 長さ: 1, 0: "baz" }; console.log(arrayLikeObject[Symbol.isConcatSpreadable]); // 未定義 console.log(initial.concat(arrayLikeObject)); // ['foo', {...}] arrayLikeObject[Symbol.isConcatSpreadable] = true; console.log(initial.concat(arrayLikeObject)); // ['foo', 'baz'] let otherObject = new Set().add("qux"); console.log(otherObject[Symbol.isConcatSpreadable]); // 未定義 console.log(initial.concat(otherObject)); // ['foo', Set(1)] otherObject[Symbol.isConcatSpreadable] = true; console.log(initial.concat(otherObject)); // ['foo']
ECMAScript 仕様によれば、このシンボルは属性として「オブジェクトのデフォルトのイテレータを返すメソッド」を表します。 of ステートメントでは、「
この属性はジェネレーター関数を返し、for of は next() メソッドを順番に呼び出します。これが、特定のオブジェクトに対して for of を使用できる理由です。
クラス エミッター { コンストラクター(最大) { this.max = 最大; この.idx = 0; } *[Symbol.iterator]() { while (this.idx < this.max) { this.idx++ を生成します。 } } } 関数 count() { エミッタ = 新しいエミッタ(5) にします。 for (エミッタの定数 x) { コンソール.ログ(x); } } カウント(); // 0 // 1 // 2 // 3 // 4
ECMAScriptの仕様によれば、このシンボルは属性として「正規表現を使用して文字列と一致する正規表現メソッド。String.prototype.match()メソッドで使用される」を表します。
String.prototype.match() メソッドは、Symbol.match をキーとする関数を使用して正規表現を評価します。したがって、正規表現の Symbol.match 属性を変更すると、String.prototype.match() で必要な値を取得できるようになります
console.log(RegExp.prototype[Symbol.match]); // ƒ [Symbol.match]() { [ネイティブコード] } console.log("foobar".match(/bar/)); // ["bar"、インデックス: 3、入力: "foobar"、グループ: 未定義] クラス FooMatcher { static [Symbol.match](ターゲット) { return target.includes("foo"); } } console.log("foobar".match(FooMatcher)); // true console.log("barbaz".match(FooMatcher)); // false クラス StringMatcher { コンストラクター(str) { this.str = str; } [シンボル.マッチ](ターゲット) { return target.includes(this.str); } } console.log("foobar".match(new StringMatcher("foo"))); // true console.log("barbaz".match(new StringMatcher("qux"))); // false
属性としてのこのシンボルは、「文字列インデックス内の一致する正規表現を返す正規表現メソッド」を表します。 String.prototype.search() メソッドで使用される式。
属性としてのこのシンボルは、「派生オブジェクトを作成するためのコンストラクターとして機能する関数の値」を表します。
このシンボルは属性として「正規表現に一致するインデックス位置で文字列を分割する正規表現メソッド。String.prototype.split()メソッドで使用される。」を表します。
このシンボルは属性として「オブジェクトを対応するプリミティブ値に変換するメソッド。ToPrimitive 抽象演算で使用されます」
を表しますこのシンボルは属性として「String が使用される文字列」を表しますオブジェクトのデフォルトの文字列説明を作成します。組み込みメソッド Object.prototype.toString() によって使用されます。"
このシンボルはオブジェクトをプロパティとして表し、オブジェクトと継承されたプロパティのすべてが派生されます。環境バインディングに関連付けられた Excluded from オブジェクトから