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类型转为字符串
JavaScript の
Symbol 型は変換できません。文字列は、言語の混乱を防ぐための固有の「言語保護」メカニズムによるものです。文字列と
Symbol は本質的に異なるため、一方を他方に変換すべきではありません。
Symbol を文字列に変換できれば、一意の文字列を生成する関数になり、独立したデータ型は必要ありません。
Symbol 変数の値を知りたい場合は、次のように
.toString() メソッドを使用できます。または
.description
let id = Symbol('this is identification'); console.log(id.toString());//Symbol(this is identification);
Symbol はオブジェクトのプロパティ キーに似ています
JavaScript# の仕様によると、 ##、タイプは 2 つだけです。値はオブジェクトの属性キーとして使用できます。
String
- 他のタイプの場合が使用されると、暗黙的に文字列型に変換されます。オブジェクト キーについては前の章で詳しく紹介されているため、ここでは繰り返しません。
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.id
は obj['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]);
for ... in
を使用すると、Symbol タイプのキーが自動的に無視されることが示されます。
同様に、
Object.keys(user) もすべての
Symbol
このような機能は、自分だけが使用できる属性を作成できるなど、非常に便利な効果をもたらします。
Symbol
Object.assign
メソッドはすべての属性をコピーできます。> xiaoming
これはコピーしません。コピーされたオブジェクトは依然として
Symbol キーを取得できないため、
Symbol の非表示プロパティに影響します。
隐藏自定义属性
由于Symbol
既不能直接转为字符串,我们没有办法直观的获得它的值,又不能通过for … in
获得对象的Symbol
属性,也就是说,如果没有Symbol
变量本身,我们就没有办法获得对象内部的对应属性。
因此,通过Symbol
类型的键值,我们可以隐藏属性,这些属性只能我们自己访问,其他人都看不到我们的属性。
举个例子:
我们在开发的过程中,需要和同事“张三”合作,而这个张三创建了一个非常好用的工具Tool
,Tool
是一个对象类型,我们想白嫖张三的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
类型而不是常规的字符串呢?
原因如下:
- 对象
tool
是别人写好的代码,原则上我们不应该去修改别人的代码,这样会造成风险; - 避免命名冲突,我们直接使用字符串很有可能会和别人原有的属性键冲突,造成严重的后果;
- 使用
Symbol
永远不会发生命名冲突,因为Symbol
都是不同的; - 别人无法访问
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
它们各有用途,我们在后面的会逐步介绍道这些独特的变量。
总结
-
Symbol
对象的值是唯一的; -
Symbol
可以添加一个标签,并通过标签在全局注册表中查询对象的实体; -
Symbol
作为对象的键无法被for … in
探测到; - 我们可以通过
Symbol
到全局注册表访问全局的Symbol
对象;
但是,Symbol
并不是完全隐藏的,我们可以通过Object.getOwnPropertySymbols(obj)
获取对象所有的Symbol
,或者通过Reflect.ownKeys(obj)
获取对象所有的键。
【相关推荐:javascript视频教程、web前端】
以上がJavaScriptのシンボル型、隠し属性、グローバルレジストリの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

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

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

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

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

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

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

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