你需要知道的Symbols|世界资讯
著名symbol是一个在不同领域中都相同且未注册的symbol。如果我们要列出著名symbol,它们会是:
Symbol.iteratorSymbol.toStringTagSymbol.toPrimitiveSymbol.asyncIteratorSymbol.hasInstanceSymbol.isConcatSpreadableSymbol.speciesSymbol.matchSymbol.matchallSymbol.replaceSymbol.searchSymbol.splitSymbol.unscopablesSymbol.dispose让我们看一些例子来了解其有用性。
Symbol.iteratorSymbol.iterator
:该symbol被用来为对象定义默认的迭代器。它被用来在for-of
循环中实现对对象的迭代,或用于扩展操作符。
(资料图片)
const obj = { a: 1, b: 2, c: 3 };obj[Symbol.iterator] = function*() { for (const key of Object.keys(this)) { yield [key, this[key]]; }};for (const [key, value] of obj) { console.log(`${key}: ${value}`);}
Symbol.toStringTagSymbol.toStringTag
:该symbol被用来指定在调用Object.prototype.toString
方法时返回的字符串值,以便为对象提供自定义的字符串表示形式。
class MyClass { static [Symbol.toStringTag] = "MyClass";}const myInstance = new MyClass();console.log(myInstance.toString()); // outputs "[object MyClass]"
Symbol.toPrimitiveSymbol.toPrimitive
:该symbol被用来指定对象在隐式调用valueOf
和toString
方法时的行为。可以用它来为对象提供自定义的字符串和数字表示形式。
class Life { valueOf() { return 42; } [Symbol.toPrimitive](hint) { switch (hint) { case "number": return this.valueOf(); case "string": return "Forty Two"; case "default": return true; } }}const myLife = new Life();console.log(+myLife); // 42console.log(`${myLife}`); // "Forty Two"console.log(myLife + 0); // 42
Symbol.asyncIteratorSymbol.asyncIterator
:该symbol被用来为对象定义一个异步的迭代器。可以用它来为对象启用异步迭代。
class MyAsyncIterable { async *[Symbol.asyncIterator]() { for (let i = 0; i < 5; i++) { await new Promise(resolve => setTimeout(resolve, 1000)); yield i; } }}(async () => { for await (const value of new MyAsyncIterable()) { console.log(value); }})();// Output after one second:// 0// Output after two seconds:// 1// Output after three seconds:// 2// Output after four seconds:// 3// Output after five seconds:// 4
Symbol.hasInstanceSymbol.hasInstance
:该symbol被用来确认一个对象是否是构造函数的实例。它可以用来更改instanceof
操作符的行为。
class MyArray { static [Symbol.hasInstance](instance) { return Array.isArray(instance); }}const arr = [1, 2, 3];console.log(arr instanceof MyArray); // true
Symbol.isConcatSpreadableSymbol.isConcatSpreadable
:该symbol被用来确定对象在与其他对象连接时是否应该被展开。它可以用来更改Array.prototype.concat
方法的行为。
const arr1 = [1, 2, 3];const spreadable = { [Symbol.isConcatSpreadable]: true, 0: 4, 1: 5, 2: 6, length: 3 };console.log([].concat(arr1, spreadable)); // [1, 2, 3, 4, 5, 6]
Symbol.speciesSymbol.species
:该symbol被用来指定创建派生对象时要使用的构造函数。它可以用来自定义创建新对象的内置方法的行为。
class MyArray extends Array { static get [Symbol.species]() { return Array; }}const myArray = new MyArray(1, 2, 3);const mappedArray = myArray.map(x => x * 2);console.log(mappedArray instanceof MyArray); // falseconsole.log(mappedArray instanceof Array); // true
Symbol.matchP.S:这一功能在未来可能会被删除。
Symbol.match
:该symbol被用来在使用String.prototype.match
方法时确定要搜索的值。它可以用来更改类似于RegExp
对象的match
方法的行为。
const myRegex = /test/;"/test/".startsWith(myRegex); // Throws TypeErrorconst re = /foo/;re[Symbol.match] = false;"/foo/".startsWith(re); // true"/bar/".endsWith(re); // false
P.S: 这个symbol的存在是标志着一个对象是"regex"的原因。
const myRegex = /foo/g;const str = "How many foos in the the foo foo bar?";for (result of myRegex[Symbol.matchAll](str)) { console.log(result); // we will get the matches}
Symbol.replaceSymbol.replace
:该symbol被用来在使用String.prototype.replace
方法时确定替换值。它可以用来更改类似于RegExp
对象的replace
方法的行为。
const customReplace = str => str.replace(/\d+/g, match => `-${match}-`);const customString = { [Symbol.replace]: customReplace};const originalString = "foo123bar456baz";const result = originalString.replace(customString, "*");console.log(result); // outputs "foo-123-bar-456-baz"
Symbol.splitSymbol.split
:该symbol被用来在使用String.prototype.split
方法时确定分隔值。它可以用来更改类似于RegExp
对象的split
方法的行为。
const { Symbol } = require("es6-symbol");const customSplit = str => str.split(/\d+/);const customRegExp = { [Symbol.split]: customSplit};const string = "foo123bar456baz";string.split(customRegExp); // outputs [ "foo", "bar", "baz" ]
Symbol.unscopablesSymbol.unscopables
:该symbol被用于确定应该从with
语句的作用域中排除哪些对象属性。它可以用来更改with
语句的行为。
const person = { age: 42};person[Symbol.unscopables] = { age: true};with (person) { console.log(age); // Expected output: Error: age is not defined}
Symbol.disposeSymbol.dispose
:“显式资源管理”是指用户通过使用命令式方法(如Symbol.dispose)或声明式方法(如使用块作用域声明)显式地管理“资源”的生命周期的系统。
{ console.log(1); using { [Symbol.dispose]() { console.log(2); } }; console.log(3); }// will log 1, 3, 2
总结这篇信息性的博客旨在深入介绍JavaScript语言中固有的著名symbol,例如Symbol.iterator
、Symbol.toStringTag
和Symbol.for
。这些symbol代表着复杂而多才多艺的工具,可以用来增强和调节代码的行为。在JavaScript环境中全面理解可用symbol是开发高性能、可维护和可扩展应用程序的关键。因此,在项目的概念化和实施阶段,建议评估将这些symbol纳入其中的可行性,以使代码更加简洁、优雅,达到预期的效果。
以上就是本文的全部内容,如果对你有所帮助,欢迎收藏、点赞、转发~
关键词:
下一篇:最后一页
- 个人护理小家电市场结构迎变局 新兴渠道规模不容小觑
- 广州科技活动周进入预热 明日正式启动300多场主题活动接踵而来
- 深化重点领域信用建设 广州正式出台新型监管机制实施方案
- 女童不慎掉入20米深井 18岁小姨三次下井成功营救
- 西安3个区域12月28日起每日开展全员核酸 官方提倡民众居家健身
- 浙江乐清一核酸检测结果异常人员 复采复检为阴性
- 浙江本轮疫情报告确诊病例490例 提倡“双节”非必要不出省
- 西安警方通报6起涉疫违法案件
- 西安新一轮核酸筛查日检测能力达160万管
- 西安市累计报告本土确诊病例811例
-
江口:巧打“生态牌”念好“山字经” 大力发展抹茶产业 热点评
近年来,我县巧打“生态牌”,念好“山字经”,大力发展抹茶产业,着力把绿水青山变成金山银山。独特的地理环境和气候,赋予了我
-
挪威军工厂告状!TikTok妨碍他们造弹药送乌克兰 天天微资讯
挪威军工厂告状!TikTok妨碍他们造弹药送乌克兰,挪威,弹药,芬兰,乌克兰,俄罗斯,军工厂,tiktok
-
新消息丨库里:和维金斯联系不多&要给他空间 虽然我们也想让他回来
库里:和维金斯联系不多&要给他空间虽然我们也想让他回来,勇士,给他,维金斯,美国篮球,新奥尔良鹈鹕,nba常规赛,斯蒂芬·库里,奥林匹克运动会,布
-
双壁波纹管公称直径和外径对照表(双壁波纹管外径尺寸表) 天天热头条
1、HDPE双壁波纹管外径跟内径区别在于:双壁波纹管外壁是波纹状,内壁圆弧面,要求规格用外壁的用外壁系列,要求内经的用内经系列。2、一般来
-
文学的发展_关于文学的发展简介
1、文学的发展是随着社会的发展而发展的。2、作为一种社会意识形态,文学的内容、形式以及创作方法等,都要受到一定时代的
-
聚焦:厦门建发确定15亿元公司债券利率为4.50%
3月29日,厦门建发集团有限公司2023年面向专业投资者公开发行可续期公司债券(第一期)票面利率公告。据悉,本期债券计划
-
环球快报:特斯拉新款Model S/X开启中国市场交付
特斯拉新款ModelS X正式开始在中国市场的交付。在上海特斯拉闵行交付中心,上海首批车主已经提到新车。同时,特斯拉全国各地特斯拉直营门店也
-
环北部湾广东水资源配置工程湛江分干线项目计划4月全面动工建设|今日报
3月28日,记者从市水务局获悉,备受关注的环北部湾广东水资源配置工程湛江分干线项目加快推进,湛江分干线工程首个开工点已于3月15日在麻章区
-
AI制药概念股持续活跃 机构称短期需注意波动风险
近期,AI制药概念股表现活跃。其中,成都先导继上一交易日20%幅度涨停后,昨日再大涨超14%,3月以来累计涨幅超过66%;和元生物昨日收涨5 8%,
-
萨曼莎·巴克斯_关于萨曼莎·巴克斯的简介
1、萨曼莎·巴克斯兼有歌手、演员身份,舞蹈也是她的长项,3岁起就学习过芭蕾舞、现代舞等。2007年她发行了自己的首张
X 关闭
你需要知道的Symbols|世界资讯
每日聚焦:“任意拘押帝国”严重践踏人权(钟声)
柳宗元三戒原文和翻译赏析_柳宗元三戒
王琇瑛_关于王琇瑛介绍 精彩看点
江西会昌:“四驱联动”筑牢消防安全“防火墙”
X 关闭
焦点讯息:水发燃气董秘回复:根据《上海证券交易所股票上市规则》的规定
西安警方完成研考安保工作 共出动警力逾1.3万人次
得知西安疫情防控“升级” 男子夜骑共享单车回咸阳淳化
中国医生将任SIU主席背后:从追随者同行者到引领者
海南省通报政法队伍教育整顿成果