目次
シンボルの紹介
シンボル型の説明
シンボルは暗黙的に文字列に変換されません
JavaScript# の仕様によると、 ##、タイプは 2 つだけです。値はオブジェクトの属性キーとして使用できます。
隐藏自定义属性
Symbol全局注册表
系统Symbol
总结
ホームページ ウェブフロントエンド jsチュートリアル JavaScriptのシンボル型、隠し属性、グローバルレジストリの詳細説明

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

Jun 02, 2022 am 11:50 AM
javascript

この記事では、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 ステートメントを使用してアクセスできません。 例: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">let id = Symbol('id'); let user = { [id]:'id value',//注意这里的方括号 }; console.log(user[id]);</pre><div class="contentsignin">ログイン後にコピー</div></div>上記のコードを実行すると、次の結果が得られます:

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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 Dec 17, 2023 pm 02:54 PM

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー Dec 17, 2023 pm 05:30 PM

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 Dec 17, 2023 pm 12:09 PM

JavaScript と WebSocket を使用してリアルタイム オンライン注文システムを実装する方法の紹介: インターネットの普及とテクノロジーの進歩に伴い、ますます多くのレストランがオンライン注文サービスを提供し始めています。リアルタイムのオンライン注文システムを実装するには、JavaScript と WebSocket テクノロジを使用できます。 WebSocket は、TCP プロトコルをベースとした全二重通信プロトコルで、クライアントとサーバー間のリアルタイム双方向通信を実現します。リアルタイムオンラインオーダーシステムにおいて、ユーザーが料理を選択して注文するとき

WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 Dec 17, 2023 am 09:39 AM

WebSocket と JavaScript を使用してオンライン予約システムを実装する方法 今日のデジタル時代では、ますます多くの企業やサービスがオンライン予約機能を提供する必要があります。効率的かつリアルタイムのオンライン予約システムを実装することが重要です。この記事では、WebSocket と JavaScript を使用してオンライン予約システムを実装する方法と、具体的なコード例を紹介します。 1. WebSocket とは何ですか? WebSocket は、単一の TCP 接続における全二重方式です。

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 Dec 17, 2023 pm 05:13 PM

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

JavaScriptでinsertBeforeを使用する方法 JavaScriptでinsertBeforeを使用する方法 Nov 24, 2023 am 11:56 AM

使用法: JavaScript では、insertBefore() メソッドを使用して、DOM ツリーに新しいノードを挿入します。このメソッドには、挿入される新しいノードと参照ノード (つまり、新しいノードが挿入されるノード) の 2 つのパラメータが必要です。

JavaScript で HTTP ステータス コードを簡単に取得する方法 JavaScript で HTTP ステータス コードを簡単に取得する方法 Jan 05, 2024 pm 01:37 PM

JavaScript で HTTP ステータス コードを取得する方法の紹介: フロントエンド開発では、バックエンド インターフェイスとの対話を処理する必要があることが多く、HTTP ステータス コードはその非常に重要な部分です。 HTTP ステータス コードを理解して取得すると、インターフェイスから返されたデータをより適切に処理できるようになります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法と、具体的なコード例を紹介します。 1. HTTP ステータス コードとは何ですか? HTTP ステータス コードとは、ブラウザがサーバーへのリクエストを開始したときに、サービスが

See all articles