最新要闻
- 中梁控股2023年1-4月累计交付房屋22399套
- 世界资讯:对标千元级耳机!真我Buds Air5 Pro无线耳机官宣
- 天天热文:全球首例!我国完成介入式脑机接口非人灵长类动物试验:比马斯克公司更安全
- 一老年代步三轮车高速路狂飙:大众车速95km/h勉强跟上-全球新动态
- 新研究表明:超7成用户在手机电量低于20%时感到焦虑
- 《原子之心》通过Steam Deck验证 上手把玩姐妹花! 当前时讯
- 全球热资讯!歌尔股份发布首款XR智能交互手环参考设计
- 淘金币在哪里看_淘金币多久过期 世界讯息
- Redmi MAX 90英寸巨屏电视发布 首发只要7999元 天天关注
- 没有5G卖4G的华为手机好起来了!一季度出货量增加14%:排名全球第十|焦点滚动
- 没有肛门只吃不拉!儿时经常把玩的小虫:如今一斤卖6千-当前看点
- 环球动态:手机通话增加患高血压风险 专家建议:每周接打电话不超半小时
- 反串还是自爆?一日产轩逸车主:高速只开80、尽量不走慢车道_世界焦点
- 厨电行业消费疲软,老板电器该如何突围?
- 奥赛康:股东拟减持公司不超1%股份|环球焦点
- 每日看点!李蓓回应基金封盘:宁肯选择维持第二梯队的规模并争取维持一流的业绩
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
记录-Symbol学习笔记|环球速看
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
Symbol是JavaScript中的原始数据类型之一,它表示一个唯一的、不可变的值,通常用作对象属性的键值。由于Symbol值是唯一的,因此可以防止对象属性被意外地覆盖或修改。以下是Symbol的方法和属性整理:
属性
Symbol.length
Symbol构造函数的length属性值为0。
示例代码:
(相关资料图)
console.log(Symbol.length); // 0
方法
Symbol.for()
Symbol.for()方法会根据给定的字符串key,返回一个已经存在的symbol值。如果不存在,则会创建一个新的Symbol值并将其注册到全局Symbol注册表中。
示例代码:
const symbol1 = Symbol.for("foo");const symbol2 = Symbol.for("foo");console.log(symbol1 === symbol2); // true
使用场景: 当我们需要使用一个全局唯一的Symbol值时,可以使用Symbol.for()方法来获取或创建该值。例如,在多个模块之间共享某个Symbol值时,我们可以使用Symbol.for()来确保获取到的Symbol值是唯一的。
Symbol.keyFor()
Symbol.keyFor()方法会返回一个已经存在的Symbol值的key。如果给定的Symbol值不存在于全局Symbol注册表中,则返回undefined。
示例代码:
const symbol1 = Symbol.for("foo");const key1 = Symbol.keyFor(symbol1);const symbol2 = Symbol("bar");const key2 = Symbol.keyFor(symbol2);console.log(key1); // "foo"console.log(key2); // undefined
使用场景: 当我们需要获取一个全局唯一的Symbol值的key时,可以使用Symbol.keyFor()方法。但需要注意的是,只有在该Symbol值被注册到全局Symbol注册表中时,才能使用Symbol.keyFor()方法获取到其key。
Symbol()
Symbol()函数会返回一个新的、唯一的Symbol值。可以使用可选参数description来为Symbol值添加一个描述信息。
示例代码:
const symbol1 = Symbol("foo");const symbol2 = Symbol("foo");console.log(symbol1 === symbol2); // false
使用场景: 当我们需要使用一个唯一的Symbol值时,可以使用Symbol()函数来创建该值。通常情况下,我们会将Symbol值用作对象属性的键值,以确保该属性不会被意外地覆盖或修改。
Symbol.prototype.toString()
Symbol.prototype.toString()方法会返回Symbol值的字符串表示形式,该表示形式包含Symbol()函数创建时指定的描述信息。
示例代码:
const symbol = Symbol("foo");console.log(symbol.toString()); // "Symbol(foo)"
使用场景: 当我们需要将一个Symbol值转换成字符串时,可以使用Symbol.prototype.toString()方法。
Symbol.prototype.valueOf()
Symbol.prototype.valueOf()方法会返回Symbol值本身。
示例代码:
const symbol = Symbol("foo");console.log(symbol.valueOf()); // Symbol(foo)
使用场景: 当我们需要获取一个Symbol值本身时,可以使用Symbol.prototype.valueOf()方法。
Symbol.iterator
Symbol.iterator是一个预定义好的Symbol值,表示对象的默认迭代器方法。该方法返回一个迭代器对象,可以用于遍历该对象的所有可遍历属性。
示例代码:
const obj = { a: 1, b: 2 };for (const key of Object.keys(obj)) { console.log(key);}// Output:// "a"// "b"for (const key of Object.getOwnPropertyNames(obj)) { console.log(key);}// Output:// "a"// "b"for (const key of Object.getOwnPropertySymbols(obj)) { console.log(key);}// Output: // No outputobj[Symbol.iterator] = function* () { for (const key of Object.keys(this)) { yield key; }}for (const key of obj) { console.log(key);}// Output:// "a"// "b"
使用场景: 当我们需要自定义一个对象的迭代行为时,可以通过定义Symbol.iterator属性来实现。例如,对于自定义的数据结构,我们可以定义它的Symbol.iterator方法以便能够使用for...of语句进行遍历。
Symbol.hasInstance
Symbol.hasInstance是一个预定义好的Symbol值,用于定义对象的 instanceof 操作符行为。当一个对象的原型链中存在Symbol.hasInstance方法时,该对象可以被instanceof运算符使用。
示例代码:
class Foo { static [Symbol.hasInstance](obj) { return obj instanceof Array; }}console.log([] instanceof Foo); // trueconsole.log({} instanceof Foo); // false
使用场景: 当我们需要自定义一个对象的 instanceof 行为时,可以通过定义Symbol.hasInstance方法来实现。
Symbol.isConcatSpreadable
Symbol.isConcatSpreadable是一个预定义好的Symbol值,用于定义对象在使用concat()方法时的展开行为。如果一个对象的Symbol.isConcatSpreadable属性为false,则在调用concat()方法时,该对象不会被展开。
示例代码:
const arr1 = [1, 2];const arr2 = [3, 4];const obj = { length: 2, 0: 5, 1: 6, [Symbol.isConcatSpreadable]: false };console.log(arr1.concat(arr2)); // [1, 2, 3, 4]console.log(arr1.concat(obj)); // [1, 2, { length: 2, 0: 5, 1: 6, [Symbol(Symbol.isConcatSpreadable)]: false }]
使用场景: 当我们需要自定义一个对象在使用concat()方法时的展开行为时,可以通过定义Symbol.isConcatSpreadable属性来实现。
Symbol.toPrimitive
Symbol.toPrimitive是一个预定义好的Symbol值,用于定义对象在被强制类型转换时的行为。如果一个对象定义了Symbol.toPrimitive方法,则在将该对象转换为原始值时,会调用该方法。
示例代码:
const obj = { valueOf() { return 1; }, [Symbol.toPrimitive](hint) { if (hint === "number") { return 2; } else if (hint === "string") { return "foo"; } else { return "default"; } }};console.log(+obj); // 2console.log(`${obj}`); // "foo"console.log(obj + ""); // "default"
使用场景: 当我们需要自定义一个对象在被强制类型转换时的行为时,可以通过定义Symbol.toPrimitive方法来实现。
Symbol.toStringTag
Symbol.toStringTag是一个预定义好的Symbol值,用于定义对象在调用Object.prototype.toString()方法时返回的字符串。如果一个对象定义了Symbol.toStringTag属性,则在调用该对象的toString()方法时,会返回该属性对应的字符串。
示例代码:
class Foo { get [Symbol.toStringTag]() { return "Bar"; }}console.log(Object.prototype.toString.call(new Foo())); // "[object Bar]"
使用场景: 当我们需要自定义一个对象在调用Object.prototype.toString()方法时返回的字符串时,可以通过定义Symbol.toStringTag属性来实现。
Symbol.species
Symbol.species是一个预定义好的Symbol值,用于定义派生对象的构造函数。如果一个对象定义了Symbol.species属性,则在调用该对象的派生方法(如Array.prototype.map())时,返回的新对象会使用该属性指定的构造函数。
示例代码:
class MyArray extends Array { static get [Symbol.species]() { return Array; }}const myArr = new MyArray(1, 2, 3);const arr = myArr.map(x => x * 2);console.log(arr instanceof MyArray); // falseconsole.log(arr instanceof Array); // true
使用场景: 当我们需要自定义一个派生对象的构造函数时,可以通过定义Symbol.species属性来实现。
Symbol.match
Symbol.match是一个预定义好的Symbol值,用于定义对象在调用String.prototype.match()方法时的行为。如果一个对象定义了Symbol.match方法,则在调用该对象的match()方法时,会调用该方法进行匹配。
示例代码:
class Foo { [Symbol.match](str) { return str.indexOf("foo") !== -1; }}console.log("foobar".match(new Foo())); // trueconsole.log("barbaz".match(new Foo())); // false
使用场景: 当我们需要自定义一个对象在调用String.prototype.match()方法时的行为时,可以通过定义Symbol.match方法来实现。
Symbol.replace
Symbol.replace是一个预定义好的Symbol值,用于定义对象在调用String.prototype.replace()方法时的行为。如果一个对象定义了Symbol.replace方法,则在调用该对象的replace()方法时,会调用该方法进行替换。
示例代码:
class Foo { [Symbol.replace](str, replacement) { return str.replace("foo", replacement); }}console.log("foobar".replace(new Foo(), "baz")); // "bazbar"console.log("barbaz".replace(new Foo(), "baz")); // "barbaz"
使用场景: 当我们需要自定义一个对象在调用String.prototype.replace()方法时的行为时,可以通过定义Symbol.replace方法来实现。
Symbol.search
Symbol.search是一个预定义好的Symbol值,用于定义对象在调用String.prototype.search()方法时的行为。如果一个对象定义了Symbol.search
class Foo { [Symbol.search](str) { return str.indexOf("foo"); }}console.log("foobar".search(new Foo())); // 0console.log("barbaz".search(new Foo())); // -1
使用场景: 当我们需要自定义一个对象在调用String.prototype.search()方法时的行为时,可以通过定义Symbol.search方法来实现。
Symbol.split
Symbol.split是一个预定义好的Symbol值,用于定义对象在调用String.prototype.split()方法时的行为。如果一个对象定义了Symbol.split方法,则在调用该对象的split()方法时,会调用该方法进行分割。
示例代码:
class Foo { [Symbol.split](str) { return str.split(" "); }}console.log("foo bar baz".split(new Foo())); // ["foo", "bar", "baz"]console.log("foobarbaz".split(new Foo())); // ["foobarbaz"]
使用场景: 当我们需要自定义一个对象在调用String.prototype.split()方法时的行为时,可以通过定义Symbol.split方法来实现。
Symbol.iterator
Symbol.iterator是一个预定义好的Symbol值,用于定义对象在被遍历时的行为。如果一个对象定义了Symbol.iterator方法,则可以使用for...of循环、扩展运算符等方式来遍历该对象。
示例代码:
class Foo { constructor() { this.items = ["foo", "bar", "baz"]; } *[Symbol.iterator]() { for (const item of this.items) { yield item; } }}const foo = new Foo();for (const item of foo) { console.log(item);}// "foo"// "bar"// "baz"
使用场景: 当我们需要自定义一个对象在被遍历时的行为时,可以通过定义Symbol.iterator方法来实现。比如,我们可以通过实现Symbol.iterator方法来支持自定义数据结构的遍历。
Symbol.toPrimitive
Symbol.toPrimitive是一个预定义好的Symbol值,用于定义对象在被强制类型转换时的行为。如果一个对象定义了Symbol.toPrimitive方法,则可以通过调用该方法来进行强制类型转换。
示例代码:
const obj = { valueOf() { return 1; }, [Symbol.toPrimitive](hint) { if (hint === "default") { return "default"; } else if (hint === "number") { return 2; } else { return "foo"; } }};console.log(+obj); // 2console.log(`${obj}`); // "foo"console.log(obj + ""); // "default"
使用场景: 当我们需要自定义一个对象在被强制类型转换时的行为时,可以通过定义Symbol.toPrimitive方法来实现。
Symbol.toStringTag
Symbol.toStringTag是一个预定义好的Symbol值,用于定义对象在调用Object.prototype.toString()方法时返回的字符串。如果一个对象定义了Symbol.toStringTag属性,则在调用该对象的toString()方法时,会返回该属性对应的字符串。
示例代码:
class Foo { get [Symbol.toStringTag]() { return "Bar"; }}console.log(Object.prototype.toString.call(new Foo())); // "[object Bar]"
使用场景: 当我们需要自定义一个对象在调用Object.prototype.toString()方法时返回的字符串时,可以通过定义Symbol.toStringTag属性来实现。这样做有助于我们更清晰地表示对象的类型。
Symbol.unscopables
Symbol.unscopables是一个预定义好的Symbol值,用于定义对象在使用with语句时的行为。如果一个对象定义了Symbol.unscopables属性,则在使用with语句时,该对象的指定属性将不会被绑定到with语句的环境中。
示例代码:
const obj = { a: 1, b: 2, c: 3, [Symbol.unscopables]: { c: true }};with (obj) { console.log(a); // 1 console.log(b); // 2 console.log(c); // ReferenceError: c is not defined}
使用场景: 由于with语句会带来一些安全性问题和性能问题,因此在实际开发中不建议使用。但是,如果确实需要使用with语句,可以通过定义Symbol.unscopables属性来避免某些属性被误绑定到with语句的环境中。
Symbol.hasInstance
Symbol.hasInstance是一个预定义好的Symbol值,用于定义对象在调用instanceof运算符时的行为。如果一个对象定义了Symbol.hasInstance方法,则在调用该对象的instanceof运算符时,会调用该方法来判断目标对象是否为该对象的实例。
示例代码:
class Foo { static [Symbol.hasInstance](obj) { return Array.isArray(obj); }}console.log([] instanceof Foo); // trueconsole.log({} instanceof Foo); // false
使用场景: 当我们需要自定义一个对象在调用instanceof运算符时的行为时,可以通过定义Symbol.hasInstance方法来实现。比如,我们可以通过实现Symbol.hasInstance方法来支持自定义数据类型的判断。
总结
Symbol是ES6中新增的一种基本数据类型,用于表示独一无二的值。Symbol值在语言层面上解决了属性名冲突的问题,可以作为对象的属性名使用,并且不会被意外覆盖。除此之外,Symbol还具有以下特点:
- Symbol值是唯一的,每个Symbol值都是独一无二的,即使是通过相同的描述字符串创建的Symbol值,也不会相等;
- Symbol值可以作为对象的属性名使用,并且不会被意外覆盖;
- Symbol值可以作为私有属性来使用,因为无法通过对象外部访问对象中的Symbol属性;
- Symbol值可以被用作常量,因为它们是唯一的;
- Symbol值可以用于定义迭代器、类型转换规则、私有属性、元编程等高级功能。
在使用Symbol时需要注意以下几点:
- Symbol值不能使用new运算符创建;
- Symbol值可以通过描述字符串来创建,但是描述字符串并不是Symbol值的唯一标识符;
- Symbol属性在使用时需要用[]来访问,不能使用.运算符;
- 同一对象中的多个Symbol属性是独立的,它们之间不会互相影响。
总之,Symbol是一个非常有用的数据类型,在JavaScript中具有非常广泛的应用。使用Symbol可以有效地避免属性名冲突问题,并且可以为对象提供一些高级功能。熟练掌握Symbol,有助于我们写出更加健壮、高效和可维护的JavaScript代码。
本文转载于:
https://juejin.cn/post/7226193000496463928
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
关键词:
-
世界热讯:elementUi+table实现表格数据滚动
elementUi+table实现表格数据滚动引用vue和elementUICDN 引用elementUICDN<scriptsrc="https: unpkg com
来源: 记录-Symbol学习笔记|环球速看
璞华助力“数字人社”,为成都市人社数字化建设提供多方位的产品与技术支持!
ChatGPT背后的打工人:你不干,有的是AI干_今热点
世界热讯:elementUi+table实现表格数据滚动
中梁控股2023年1-4月累计交付房屋22399套
全球热消息:【金融街发布】上交所修订发布公司债券存续期信息披露业务指引
每日头条!【财经分析】北京银行多项指标大幅落后同行 城商行“一哥”地位堪忧
世界资讯:对标千元级耳机!真我Buds Air5 Pro无线耳机官宣
天天热文:全球首例!我国完成介入式脑机接口非人灵长类动物试验:比马斯克公司更安全
一老年代步三轮车高速路狂飙:大众车速95km/h勉强跟上-全球新动态
新研究表明:超7成用户在手机电量低于20%时感到焦虑
《原子之心》通过Steam Deck验证 上手把玩姐妹花! 当前时讯
全球热资讯!歌尔股份发布首款XR智能交互手环参考设计
速讯:《安富莱嵌入式周报》第311期:300V可调节全隔离USB PD电源,开源交流负载分析仪,CANFD Trace,6位半多斜率精密ADC设计,开源数学库
淘金币在哪里看_淘金币多久过期 世界讯息
嵘泰转债异常交易处理结果出炉:匹配成交取消 不影响转股赎回|世界信息
Redmi MAX 90英寸巨屏电视发布 首发只要7999元 天天关注
没有5G卖4G的华为手机好起来了!一季度出货量增加14%:排名全球第十|焦点滚动
没有肛门只吃不拉!儿时经常把玩的小虫:如今一斤卖6千-当前看点
环球动态:手机通话增加患高血压风险 专家建议:每周接打电话不超半小时
反串还是自爆?一日产轩逸车主:高速只开80、尽量不走慢车道_世界焦点
厨电行业消费疲软,老板电器该如何突围?
天天百事通!绘画手残党的福音:涂鸦线稿秒变绝美图像
天天快播:保障用户买到限量版玩具,泡泡玛特用AIGC加持的验证码防范羊毛党
【光伏预报/太阳能预报】上海道宁与Solargi为您提供开发地理数据库模拟工具和网络服务 天天亮点
今日热门!Vue3项目(Vite+TS)使用Web Serial Api全记录
【快播报】抓住医院信息集成平台建设核心诉求
奥赛康:股东拟减持公司不超1%股份|环球焦点
世界黄金协会:一季度黄金总需求同比增长1% 央行购金仍可能成为今年支撑黄金需求的基石
每日看点!李蓓回应基金封盘:宁肯选择维持第二梯队的规模并争取维持一流的业绩
小伙日行三万步逛杭州 “特种兵式旅游”致半月板损伤
国内一集装箱惊现三辆特斯拉新跑车:被遗弃13年-全球讯息
凌晨四点的淄博什么样?烧烤店老板凌晨抢肉:热闹非凡_今日聚焦
自媒体称4月份接2笔理想商单共计30万 李想:造谣、法务部出来干活|每日消息
官方晒蒂法8岁、13岁美术设定图 身着连衣裙天真烂漫
网盘教育专享版,助力高校信息化和科研
环球信息:基于原子范数的深度展开网络实现
天天看热讯:Apache 配置https虚拟主机
世界快看点丨到底什么是小程序插件?
天天报道:如何不显示我的电脑、回收站等图标?
烟台高新区不断推进工程建设项目审批“应享尽享”水平 世界速看料
不愧是高端旗舰 RTX 4090游戏本性能爆棚:前提不差钱
高达12种!小米13成为史上颜色最多的小米手机
掀翻OLED!苹果自研MicroLED屏幕:进展顺利-每日速看
咋回事?董明珠1150万股格力股份遭冻结 市值约4亿元
对标拼多多?抖音推出“超便宜的小店”:试水低价电商|全球快看点
无锡市举办纪念五四运动 104周年主题团日活动
【天天速看料】Java基础学习之大数字处理相关的类有哪些?
将Windows系统设置NTP服务器-NetTime篇
金仓数据库字符串分割函数_天天速看料
深圳:港澳青年在深创业个人最高可贷60万元
苹果联合创始人炮轰马斯克自动驾驶画饼:想死就买特斯拉!
李佳琦面试75岁奶奶主播引围观:老人直呼为推广国货努力 这是国家自信
环球即时:调试器是个大骗子!
快速高效的C#FTP文件传输库FluentFTP|全球速讯
开心档之MySQL 导入数据-焦点报道
开封市通许县四所楼镇:让社情民意联络点当好民声传话筒|全球快讯
支持华为HMS服务!酷比魔方Pad 50Pro发布 首发899元
世界热点评!陌陌被苹果下架 官方回应:技术问题正解决 老用户不影响
这五一超20万人去淄博:鲁C变身网红旅游名城_快资讯
当前讯息:怎么看?老人欲插队被服务员严词拒绝:前有插队婆孙被网曝 还被做车贴很恶心
功能不成熟 马斯克推特直播秒变马赛克 网友吐槽:8-Bit埃隆_世界新要闻
今年全国快递业务量突破400亿件
常用的热门 API 汇总 环球热推荐
即时看!jasperreport开发手册--ireport教程
世界百事通!什么是EMR?为什么要以电子病历(EMR)为核心,建设医院信息集成平台?
安全验证必备——语音验证码短信 API 当前快看
火山引擎 DataTester 上线全新 MAB 智能调优实验
坎普斯boss怎么打_坎普斯怎么打_当前快讯
一机多用:劲能电钻/电动螺丝刀39元起(100元大额券) 每日速递
【天天热闻】向华为供货740万块硬盘 被重罚3亿美元!希捷:已和解并开始付罚金
当前观点:特斯拉公共充电桩功率仅23KW 比亚迪车主一度愧疚:把人家功率吸走了
又一五菱神车!宝骏悦也5月15日首发:车尾背个“大手表”
iPhone平均售价越来越高了!Pro和Pro Max最受果粉喜爱
当前短讯!浙江师范大学2023年硕士研究生复试录取办法
seventeen是哪个公司?seventeen在韩国是几线?seventeen有几个人?
冰淇淋和冰激凌区别是什么?明胶在冰淇淋中的作用是什么?
厨师的高帽子叫什么?为什么厨师要戴白色高帽子?
梦华录里的西京是哪里?梦华录是在哪些地方取景?
富士山在日本的哪里?富士山是私人的吗?富士山为什么是私人的?
boot priority是什么意思?boot priority怎么设置?
小米3s什么时候上市的?小米3s参数配置
百度网盘邀请码怎么使用?百度网盘邀请码大全
辽篮回沈阳!全员餐厅吃饭,张镇麟狂笑,莫兰德搞怪,回去仍加练-今亮点
centos7安装oracle11g11.2.0.4.0
【解决办法】三层交换机通过静态路由和接口互联,实现不同VLAN间通信的两种方法
ES全文检索,Neo4J,activiti审批流的知识库管理系统
thinkpad扩展坞接口怎么用?thinkpad的扩展坞有什么用?
移动磁盘无法写入文件怎么回事?移动磁盘无法写入文件怎么解决?
调查显示:电影“五一”档女性观众购票用户首次突破六成
699元 70迈4K旗舰行车记录仪A810发布:首发索尼IMX678_环球热头条
祝融号有重大发现:火星低纬度存在液态水
联想小新K3机械键盘发布:199元 91键小而全
天天头条:国内油价有望怒跌超3毛!基本抵消掉第八轮的微涨4毛
热血又感人!海外影迷评《长空之王》:5岁儿子非常喜欢
有景区免费发冰棍,有景区一盘炒鸡蛋48元——记者调查五一小长假山西景区旅游现状
当前关注:Zabbix“专家坐诊”第190期问答汇总
Linux IMX6ULL RTC掉电不保存问题解决|全球快报
苏宁零钱宝在哪里查看_苏宁零钱宝 环球看点
小记者手抄报 赛场小记者手抄报