著名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); // 42Symbol.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:// 4Symbol.hasInstanceSymbol.hasInstance:该symbol被用来确认一个对象是否是构造函数的实例。它可以用来更改instanceof操作符的行为。
class MyArray { static [Symbol.hasInstance](instance) { return Array.isArray(instance); }}const arr = [1, 2, 3];console.log(arr instanceof MyArray); // trueSymbol.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); // trueSymbol.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); // falseP.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纳入其中的可行性,以使代码更加简洁、优雅,达到预期的效果。
以上就是本文的全部内容,如果对你有所帮助,欢迎收藏、点赞、转发~
下一篇:最后一页
X 关闭
-
你需要知道的Symbols|世界资讯
著名symbol著名symbol是一个在不同领域中都相同且未注册的symbol。如果我们要列出著名symbol,它们会是:Symbol iteratorSymbol toStringTagSy
-
每日聚焦:“任意拘押帝国”严重践踏人权(钟声)
美国在国内外实施任意拘押的骇人听闻事实昭告世人,美国是不折不扣的“任意拘押帝国”,也是当今世界上践踏人权最严重的国家 免于任意
-
柳宗元三戒原文和翻译赏析_柳宗元三戒
一、题文柳宗元的《三戒》读后感二、解答柳宗元之《三戒》读后感昨晚,在中央电视台10频道上看了北京师范大学康震教授在《百家
-
王琇瑛_关于王琇瑛介绍 精彩看点
王琇瑛,关于王琇瑛介绍这个很多人还不知道,我们一起来看看!1、王琇瑛(1908年5月28日~2000年9月4日),护理专家和学者。2、中国第一个获得国际红十
