所有分类
  • 所有分类
  • 后端开发
JS属性键大揭秘:为什么只能用字符串或Symbol?

JS属性键大揭秘:为什么只能用字符串或Symbol?

类型类型。这两种类型。有本质上的不同,不应该意外地将它们转换成另一个。作为键,其它类型会被转换为字符串。我们很快就会看到它的使用。是唯一标识符的基本类型有两个主要的使用场景:属性“秘密地”将一些东西隐藏到我们需要的对象中,但其他地方看不到它

你有没想过有些东西,像最亲密的那种,在JS中只用得到字符串或Symbol这两种玩意儿呀?是不是很吃惊捏?

// id 是 symbol 的一个实例化对象
let id = Symbol();

// id 是描述为 "id" 的 Symbol
let id = Symbol("id");

为啥属性键只能用字母或符号呢? 这就是为了给你的对象,比如DOM节点啊数组元素啥的,随手加个简要说明,调试起来就得心应手。至于Symbol是啥,咱就通过看toString()这个神奇手段来了解吧!

let id1 = Symbol("id");
let id2 = Symbol("id");
alert(id1 == id2); // false

let id = Symbol("id");
alert(id); // 类型错误:无法将 Symbol 值转换为字符串。

为啥用Symbol?掏心窝子说,就是能帮你不动声色地给什么东西贴上专属标签,人家一时半会儿也找不着门道去改你的主意。譬如,要是你想给你的user变量上点独特的墨水,只需要在那串”id”字后头加个Symbol(‘id’)就成了。看上去似乎没啥大不了,但是,说实话真的挺实用。不过假如你一开始就把’id’换成Symbol(‘id’)的话,那可就头疼喽!

let id = Symbol("id");
alert(id.toString()); // Symbol(id),现在它有效了

有时候你可能会发现,无论什么东西都想硬塞进一个对象中对吧?比如那种日期之类的数字属性,非要转成字符串才能行。这主要是因为在JavaScript中,用符号和字符串去定义对象属性很常见。但是,只要遇到那种非字符串类型的数据,比如日期,它就会自动给你变回字符串。

let id = Symbol("id");
alert(id.description); // id

JS属性键大揭秘:为什么只能用字符串或Symbol?

你知道吗?每个软件应用都用”ID”来标注自己。如果你想去找或者放这种键值的话,可以试试那个叫Symbol.for(key)的神器。它就像一个侦探,在整个注册表里找符合条件的小符号。找到的话,它就立马告诉你;找不到也别担心,它能轻松建个符号给你安上去。

let user = { // 属于另一个代码
 name: "John"
};
let id = Symbol("id");
user[id] = 1;
alert( user[id] ); // 我们可以使用 Symbol 作为键来访问数据

这里有个小秘密告诉大家,如果想让一个符号在咱所有软件中都能用上,那就得靠那个叫“全局符号”的神秘工具。咱们怎么操刀呢? 直接搞个Symbol.for(key)函数,想要啥符号自己画;又或者试试Symbol.keyFor(sym)方法,立马把你知道的符号变成它的大名咯!

// ...
let id = Symbol("id");
user[id] = "Their id value";

你听过没,JavaScript里头有种叫“Symbol”的玩意儿,是用 `Symbol()` 这么个函数弄出来的,然后给它起个名字就行了。这样一来,每个特别的对象都能操控得更加精细!

想让两个Symbol发音一样?简单!用下Symbol.for(key)就搞定了。要是没Symbol怎么办?别担心,它能帮你弄出个独一无二的Symbol,叫啥名儿都行,你说了算。不过要记着,不论咋用这招,最后得到的都是同一个Symbol呀。

let user = { name: "John" };
// 我们的脚本使用了 "id" 属性。
user.id = "Our id value";
// ……另一个脚本也想将 "id" 用于它的目的……  
user.id = "Their id value"
// 砰!无意中被另一个脚本重写了 id!

你懂么?为什么对象的属性要装在字符串或Symbol里头?原因,就是担心它们会长一样,最后让人搞不清状况。Symbol还有个好处就是能给对象加点神秘色彩,看着好像程序员都特别厉害似的。那今天我们就来说说这个,希望你们能学到点儿新知识。有啥不懂的尽管问我!别忘点赞、分享!感谢大家关注我这儿

let id = Symbol("id");
let user = {
 name: "John",
 [id]: 123 // 而不是 "id:123"
};

let id = Symbol("id");
let user = {
 name: "John",
 age: 30,
 [id]: 123
};
for (let key in user) alert(key); // name, age (no symbols)
// 使用 Symbol 任务直接访问
alert( "Direct: " + user[id] );

原文链接:https://www.icz.com/technicalinformation/web/2024/03/11446.html,转载请注明出处~~~
0

评论0

请先
注意:请收藏好网址www.icz.com,防止失联!站内免费资源持续上传中…!赞助我们
显示验证码
没有账号?注册  忘记密码?