ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScriptのシンボル型、隠し属性、グローバルレジストリの詳細説明

JavaScriptのシンボル型、隠し属性、グローバルレジストリの詳細説明

WBOY
WBOY転載
2022-06-02 11:50:342817ブラウズ

この記事では、javascript に関する関連知識を提供します。主に、シンボル タイプ、隠し属性、グローバル レジストリに関連する問題を紹介します。これには、シンボル タイプの説明も含まれます。シンボルの暗黙的な文字列変換などの問題が発生します。 . 見てみましょう。皆さんの参考になれば幸いです。

JavaScriptのシンボル型、隠し属性、グローバルレジストリの詳細説明

[関連する推奨事項: JavaScript ビデオ チュートリアルWeb フロントエンド]

シンボルの紹介

Symbol 型は JavaScript の特殊な型であり、すべての Symbol 型の値は互いに異なります。 「シンボル」を使用して一意の値を表すことができます。次に、Symbol オブジェクトを作成する例を示します:

let id = Symbol();

このようにして、Symbol 型を作成します値を取得し、この値を変数 id に保存します。

シンボル型の説明

Symbol 型変数を作成するとき、パラメータに秒属性を持つ文字列を渡すことができます。この変数の使用法について説明します。
例:

let id1 = Symbol('狂拽酷炫吊炸天的小明的id');
let id2 = Symbol('低调奢华有内涵的婷婷的id');

Symbol タイプは常に異なります。たとえ同じ説明情報があっても、説明は単なるラベルであり、他の目的はありません。たとえば、次のようになります。

let id1 = Symbol('id');
let id2 = Symbol('id');
console.log(id1==id2);//false

このタグの意味は、Symbolが内部の具体的な値を直感的に見ることができないことに関係していると個人的には考えていますが、説明情報を追加して、変数Haveを定義しましょうその用途をより直感的に理解できるようになります。

シンボルは暗黙的に文字列に変換されません

JavaScript のほとんどの型は文字列型の出力に直接変換できるため、直観的に確認することはできません。たとえば、alert(123) を直接使用して、数値 123 を文字列に変換し、ポップアップ表示することができます。 ただし、
Symbol 型は特殊なので、直接変換できません。たとえば、

let id = Symbol();
alert(id);//报错,不能把Symbol类型转为字符串

JavaScriptSymbol 型は変換できません。文字列は、言語の混乱を防ぐための固有の「言語保護」メカニズムによるものです。文字列と Symbol は本質的に異なるため、一方を他方に変換すべきではありません。

想像してみてください。

Symbol を文字列に変換できれば、一意の文字列を生成する関数になり、独立したデータ型は必要ありません。

本当に

Symbol 変数の値を知りたい場合は、次のように .toString() メソッドを使用できます。または .description

属性を使用して説明情報を取得します。

let id = Symbol('this is identification');
console.log(id.toString());//Symbol(this is identification);
Symbol はオブジェクトのプロパティ キーに似ています

JavaScript# の仕様によると、 ##、タイプは 2 つだけです。値はオブジェクトの属性キーとして使用できます。

String

Symbol
  1. 他のタイプの場合が使用されると、暗黙的に文字列型に変換されます。オブジェクト キーについては前の章で詳しく紹介されているため、ここでは繰り返しません。
シンボル キーの作成

Symbol をキー値として使用するには 2 つの方法があります:

例 1:

let id = Symbol('加油,奥利给');
console.log(id.description);//加油,奥利给”
例 2:
let id = Symbol('id');
let user = {};
user[id] = 'id value';//添加Symbol键
console.log(user[id]);//id value

上の 2 つのケースは、Symbol

型をキーとしてオブジェクトに挿入する使用法を示しています。

obj を使用する必要があることに注意してください。 [プロパティにアクセスするときの id。

obj.id ではなく ] (obj.idobj['id'] を表すため)。 オブジェクトのキーとして Symbol を使用すると、どのような効果が得られますか?

for...in はスキップされます

Symbol非常に明らかな機能は、

Symbol

がobject キーとして、Symbol 型のプロパティには、for...in ステートメントを使用してアクセスできません。 例: <pre class="brush:php;toolbar:false">let id = Symbol('id'); let user = { [id]:'id value',//注意这里的方括号 }; console.log(user[id]);</pre>上記のコードを実行すると、次の結果が得られます:

let id = Symbol('id');
let user = {
	name : 'xiaoming',
	[id] : 'id',
};
for (let key in user) console.log(user[key]);

[id]## の値が確認できます。 # object is not print というメッセージが表示され、オブジェクト属性リストで

for ... in

を使用すると、

Symbol タイプのキーが自動的に無視されることが示されます。 同様に、Object.keys(user) もすべての Symbol

タイプのキーを無視します。

このような機能は、自分だけが使用できる属性を作成できるなど、非常に便利な効果をもたらします。 Symbol

キーを直接取得する方法はありませんが、

Object.assign

メソッドはすべての属性をコピーできます。

> xiaoming
これはコピーしません。コピーされたオブジェクトは依然として Symbol キーを取得できないため、Symbol の非表示プロパティに影響します。

隐藏自定义属性

由于Symbol既不能直接转为字符串,我们没有办法直观的获得它的值,又不能通过for … in获得对象的Symbol属性,也就是说,如果没有Symbol变量本身,我们就没有办法获得对象内部的对应属性。

因此,通过Symbol类型的键值,我们可以隐藏属性,这些属性只能我们自己访问,其他人都看不到我们的属性。

举个例子:

我们在开发的过程中,需要和同事“张三”合作,而这个张三创建了一个非常好用的工具ToolTool是一个对象类型,我们想白嫖张三的Tool,并在此基础上添加一些自己的属性。

我们就可以通过添加Symbol类型的键:

let tool = {//张三写好了的Tool
    usage : "Can do anything",
}

let name = Symbol("My tool obj");
tool[name] = "This is my tool";
console.log(tool[name]);

以上示例展示了如何在别人写好的对象上添加自己的属性,那么为什么要使用Symbol类型而不是常规的字符串呢?

原因如下:

  1. 对象tool是别人写好的代码,原则上我们不应该去修改别人的代码,这样会造成风险;
  2. 避免命名冲突,我们直接使用字符串很有可能会和别人原有的属性键冲突,造成严重的后果;
  3. 使用Symbol永远不会发生命名冲突,因为Symbol都是不同的;
  4. 别人无法访问Symbol类型的键,相当于不会和别人的代码冲突;

错误示范:
如果我们不使用Symbol类型,很可能出现以下情况:

let tool = {//张三写好了的Tool
    usage : "Can do anything",
}

tool.usage = "Boom Boom";
console.log(tool.usage);

以上代码由于重复使用”usage”,从而重写了原属性,会造成对象原功能异常。

Symbol全局注册表

所有的Symbol变量都是不同的,即使他们有用相同的标签(描述)。
有些时候,我们希望通过一个字符串名称(标签),访问同一个Symbol对象,例如我们在代码的不同地方访问相同的Symbol

JavaScript会维护一个全局的Symbol注册表,我们可以通过向注册表中插入Symbol对象,并为对象起一个字符串名称访问该对象。

向注册表插入或者读取Symbol对象需要使用Symbol.for(key)方法,如果注册表中有名为key的对象,就返回该对象,否则就插入新对象再返回。

举个例子:

let id1 = Symbol.for('id');//注册表内没有名为id的Symbol,创建并返回
let id2 = Symbol.for('id');//注册表内已有名为id的Symbol,直接返回
console.log(id1===id2);//true

我们通过Symbol.for(key)就能以全局变量的方式使用Symbol对象,并使用一个字符串标记对象的名字。

相反的,我们还可以使用Symbol.keyFor(Symbol)反向的从对象获取名称。

举个例子:

let id = Symbol.for('id');//注册表内没有名为id的Symbol,创建并返回
let name = Symbol.keyFor(id);
console.log(name);//id

Symbol.keyFor()函数只能用在全局Symbol对象上(使用Symbol.for插入的对象),如果用在非全局对象上,就会返回undefined

举个例子:

let id = Symbol('id');//局部Symbol
let name = Symbol.keyFor(id);
console.log(name);//undefined

系统Symbol

JavaScript有许多系统Symbol,例如:

  • Symbol.hasInstance
  • Symbol.iterator
  • Symbol.toPrimitive

它们各有用途,我们在后面的会逐步介绍道这些独特的变量。

总结

  1. Symbol对象的值是唯一的;
  2. Symbol可以添加一个标签,并通过标签在全局注册表中查询对象的实体;
  3. Symbol作为对象的键无法被for … in探测到;
  4. 我们可以通过Symbol到全局注册表访问全局的Symbol对象;

但是,Symbol并不是完全隐藏的,我们可以通过Object.getOwnPropertySymbols(obj)获取对象所有的Symbol,或者通过Reflect.ownKeys(obj)获取对象所有的键。

【相关推荐:javascript视频教程web前端

以上がJavaScriptのシンボル型、隠し属性、グローバルレジストリの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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