この記事では、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 はオブジェクトのプロパティ キーに似ています
String
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
型をキーとしてオブジェクトに挿入する使用法を示しています。
obj を使用する必要があることに注意してください。 [プロパティにアクセスするときの id。obj.id ではなく ]
(obj.id
は obj['id']
を表すため)。 オブジェクトのキーとして
Symbol
を使用すると、どのような効果が得られますか?
for...in はスキップされます
が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
。
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
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 サイトの他の関連記事を参照してください。