位置: 编程技术 - 正文

深入了解JavaScript中的Symbol的使用方法(深入了解工作优势怎么回答)

编辑:rootadmin

推荐整理分享深入了解JavaScript中的Symbol的使用方法(深入了解工作优势怎么回答),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:深入了解的高级表达,深入了解图片,深入了解英语,深入了解javascript特性读后感,深入了解求助者时首先要进行工作室,深入了解的高级表达,深入了解对方的36个问题,深入了解javascript特性读后感,内容如对您有帮助,希望把文章链接给更多的朋友!

Symbol 是什么?

Symbols 不是图标,也不是指在代码中可以使用小图片:

Notice: Undefined index: CMSdown in /data/webroot/gcms/lib/Api/Open/Article.php on line img////_d3feb8ecd.jpg" alt="查看图片" />

也不是指代其他一些东西的语法。那么,Symbol 到究竟是什么呢?七种数据类型

JavaScript 在 年被标准化时,就有 6 种数据类型,直到 ES6 出现之前,程序中的变量一定是以下 6 种数据类型之一:

Undefined Null Boolean Number String Object

每种数据类型都是一系列值的组合,前面 5 种数据类型值的数量都是有限的。Boolean 类型只有两个值:true 和 false,为 Boolean 类型的变量赋值时,并不会产生新的值(共享了true 和 false 这两个值)。对于 Number 和 String 来说,它们的值则多得多了,标准的说法是有 ,,,,,, 个 Number 类型的值(包括 NAN)。String 类型的个数就难以统计了,我原以为是 (,,,,, &#; 1) ÷ ,…不过也许我算错了。

对象值的个数是无限的,每个对象都是独一无二的,每次打开一个网页,都创建了一系列的对象。

ES6 中的 Symbol 也是一种数据类型,但是不是字符串,也不是对象,而是一种新的数据类型:第七种数据类型。

下面我们来看一个场景,也许 Symbol 能派上用场。一个布尔值引出的问题

有时,把一些属于其他对象的数据暂存在另一个对象中是非常方便的。例如,假设你正在编写一个 JS 库,使用 CSS 中的 transition 来让一个 DOM 元素在屏幕上飞奔,你已经知道不能同时将多个 transition 应用在同一个 div 上,否则将使得动画非常不美观,你也确实有办法来解决这个问题,但是首先你需要知道该 div 是否已经在移动中。

怎么解决这个问题呢?

其中一个方法是使用浏览器提供的 API 来探测元素是否处于动画状态,但杀鸡焉用牛刀,在将元素设置为移动时,你的库就知道了该元素正在移动。

你真正需要的是一种机制来跟踪哪些元素正在移动,你可以将正在移动的元素保存在一个数组中,每次要为一个元素设置动画时,首先检查一下这个元素是否已经在这个列表中。

啊哈,但是如果你的数组非常庞大,即便是这样的线性搜索也会产生性能问题。

那么,你真正想做的就是直接在元素上设置一个标志:

这也有一些潜在的问题,不得不承认这样一个事实:还有其他代码也可能操作该 ODM 元素。

在其他代码中,你创建的属性会被 for-in 或 Object.keys() 枚举出来; 在其他一些库中也许已经使用了同样的方式(在元素上设置了相同的属性),那么这将和你的代码发生冲突,产生不可预计的结果; 其他一些库可能在将来会使用同样的方式,这也会与你的代码发生冲突; 标准委员会可能会为每个元素添加一个 .isMoving() 原生方法,那么你的代码就彻底不能工作了。

当然,对于最后三个问题,你可以选择一个无意义的不会有人会使用到的字符串:

这似乎太不靠谱了,看了让人眼睛痛。

深入了解JavaScript中的Symbol的使用方法(深入了解工作优势怎么回答)

你还可以用加密算法来生成一个几乎唯一的字符串:

object[name] 语法允许我们将任何字符串作为属性名,代码能正常工作,冲突几乎是不可能了,代码看起来也美观多了。

但是,这回导致糟糕的调试体验,每次使用 console.log() 打印出包含该属性的元素时,你回看到一个庞大的垃圾字符串,并且如果还不止一个这样的属性呢?每次刷新后属性名都发生了变化,怎么样使这些属性看起来更加直观呢?

为什么这么难?我们只是为了保存一个小小的标志位。用 Symbol 来解决问题

Symbol 值可以由程序创建,并可以作为属性名,而且不用担心属性名冲突。

调用 Symbol() 方法将创建一个新的 Symbol 类型的值,并且该值不与其它任何值相等。

与数字和字符串一样,Symbol 类型的值也可以作为对象的属性名,正是由于它不与任何其它值相等,对应的属性也不会发生冲突:

下面是使用 Symbol 来解决上面的问题:

上面代码需要注意几点:

方法 Symbol("isMoving") 中的 "isMoving" 字符串被称为 Symbol 的描述信息,这对调试非常有帮助。可以通过 console.log(isMoving) 打印出来,或通过 isMoving.toString() 将 isMoving 转换为字符串时,或在一些错误信息中显示出来。 element[isMoving] 访问的是 symbol-keyed 属性,除了属性名是 Symbol 类型的值之外,与其它属性都一样。 和数组一样,symbol-keyed 属性不能通过 . 操作符来访问,必须使用方括号的方式。 操作 symbol-keyed 属性也非常方便,通过上面代码我们已经知道如何获取和设置 element[isMoving] 的值,我们还可以这样使用:if (isMoving in element) 或 delete element[isMoving]。 另一方面,只有在 isMoving 的作用域范围内才可以使用上述代码,这可以实现弱封装机制:在一个模块内创建一些 Symbol,只有在该模块内部的对象才能使用,而不用担心与其它模块的代码发生冲突。

由于 Symbol 的设计初衷是为了避免冲突,当遍历 JavaScript 对象时,并不会枚举到以 Symbol 作为建的属性,比如,for-in 循环只会遍历到以字符串作为键的属性,Object.keys(obj)和 Object.getOwnPropertyNames(obj) 也一样,但这并不意味着 Symbol 为键的属性是不可枚举的:使用 Object.getOwnPropertySymbols(obj) 这个新方法可以枚举出来,还有 Reflect.ownKeys(obj) 这个新方法可以返回对象中所有字符串和 Symbol 键。(我将在后面的文章中详细介绍 Reflect 这个新特性。)

库和框架的设计者将会发现很多 Symbol 的用途,稍后我们将看到,JavaScript 语言本身也对其有广泛的应用。Symbol 究竟是什么呢

Symbol 是完全不一样的东西。一旦创建后就不可更改,不能对它们设置属性(如果在严格模式下尝试这样做,你将得到一个 TypeError)。它们可以作为属性名,这时它们和字符串的属性名没有什么区别。

另一方面,每个 Symbol 都是独一无二的,不与其它 Symbol 重复(即便是使用相同的 Symbol 描述创建),创建一个 Symbol 就跟创建一个对象一样方便。

ES6 中的 Symbol 与传统语言(如 Lisp 和 Ruby)中的 Symbol 中的类似,但并不是完全照搬到 JavaScript 中。在 Lisp 中,所有标识符都是 Symbol;在 JavaScript 中,标识符和大多数属性仍然是字符串,Symbol 只是提供了一个额外的选择。

值得注意的是:与其它类型不同的是,Symbol 不能自动被转换为字符串,当尝试将一个 Symbol 强制转换为字符串时,将返回一个 TypeError。

应该避免这样的强制转换,应该使用 String(sym) 或 sym.toString() 来转换。获取 Symbol 的三种方法

Symbol() 每次调用时都返回一个唯一的 Symbol。 Symbol.for(string) 从 Symbol 注册表中返回相应的 Symbol,与上个方法不同的是,Symbol 注册表中的 Symbol 是共享的。也就是说,如果你调用 Symbol.for("cat") 三次,都将返回相同的 Symbol。当不同页面或同一页面不同模块需要共享 Symbol 时,注册表就非常有用。 Symbol.iterator 返回语言预定义的一些 Symbol,每个都有其特殊的用途。

如果你仍不确定 Symbol 是否有用,那么接下来的内容将非常有趣,因为我将为你演示 Symbol 的实际应用。Symbol 在 ES6 规范中的应用

我们已经知道可以使用 Symbol 来避免代码冲突。之前在介绍 iterator 时,我们还解析了 for (var item of myArray) 内部是以调用 myArray[Symbol.iterator]() 开始的,当时我提到这个方法可以使用 myArray.iterator() 来代替,但是使用 Symbol 的后向兼容性更好。

在 ES6 中还有一些地方使用到了 Symbol。(这些特性还没有在 FireFox 中实现。)

使 instanceof 可扩展。在 ES6 中,object instanceof constructor 表达式被标准化为构造函数的一个方法:constructor[Symbol.hasInstance](object),这意味着它是可扩展的。 消除新特性和旧代码之间的冲突。 支持新类型的字符串匹配。在 ES5 中,调用 str.match(myObject) 时,首先会尝试将 myObject 转换为 RegExp 对象。在 ES6 中,首先将检查 myObject 中是否有 myObject[Symbol.match](str) 方法,在所有正则表达式工作的地方都可以提供一个自定义的字符串解析方法。

这些用途还比较窄,但仅仅通过我文章中的代码很难看到这些新特性产生的重大影响。JavaScript 的 Symbol 是 PHP 和 Python 中 __doubleUnderscores 的改进版本,标准组织将使用它来为语言添加新特性,而不会对已有代码产生影响。

深入理解JavaScript中的箭头函数 从一开始箭头就是JavaScript的一部分,在第一个JavaScript中就建议将内联的脚本代码包裹在HTML的注释中,这可以防止那些不支持JavaScript的浏览器错误滴将

解析JavaScript的ES6版本中的解构赋值 什么是解构赋值?解构赋值允许你使用类似数组或对象字面量的语法将数组和对象的属性值赋给一系列变量。这个语法非常简洁,而且比传统的属性访

使用AmplifyJS组件配合JavaScript进行编程的指南 事件分发的作用在为页面添加各类交互功能时,我们熟知的最简单的做法就是为页面元素绑定事件,然后在事件处理函数中,做我们想要做的动作。就

标签: 深入了解工作优势怎么回答

本文链接地址:https://www.jiuchutong.com/biancheng/377571.html 转载请保留说明!

上一篇:详解JavaScript ES6中的Generator

下一篇:深入理解JavaScript中的箭头函数(深入理解新发展理念,推进供给侧结构性改革)

  • 加班费计入个税吗
  • 异地车辆流程
  • 统一机构信用代码查询系统
  • 技术开发免征增值税吗
  • 原始凭证分割单样本
  • 汇算清缴企业所得税退税账务处理
  • 企业所得税公益捐赠扣除限额
  • 福利性收入属于什么分配
  • 进货有商业折扣商品怎么入库
  • 计入增值税应税销售额
  • 收到利息计入哪个会计科目
  • 工程预缴税款会计分录
  • 小微企业计算公式
  • 税率简并的影响因素
  • 其他收益小企业会计报表没有怎么填
  • 机会成本怎么计量
  • 客户退货发到付怎么办
  • 税务公司属于什么性质
  • 金蝶软件测试笔试题及答案
  • linux zen3
  • php session实例
  • 微软手机
  • 银行存款收款凭证属于什么凭证
  • 鸿蒙系统怎么退出开发者选项
  • 政府划入资产会计处理
  • 公司为员工缴纳社保的法律规定
  • php7.1
  • maven jni
  • idea 创建maven项目读取pom报错
  • ps中文字复制粘贴
  • 现金管理的四个方面
  • 用现金付款应填什么凭证
  • 采购商品没有进账怎么做账
  • 报表怎么报送
  • sql server 2008打开界面
  • db2入门
  • 企业购进材料取得增值税专用发票
  • 以前年度损益调整会计分录
  • 有形动产经营性租赁光租业务是什么意思
  • 稳岗返还资金最新账务处理
  • 员工过生日公司有福利吗
  • 固定资产怎么入费用
  • 房产契税新政策2023
  • 当月销售下月开票
  • 做好年底冲刺
  • 进项税额转出多了怎么调整
  • 供应商奖惩制度具体办法
  • 收到股东投入材料怎么做账
  • 公司注册资金可以变更减少吗
  • 对账簿设置的要求是什么
  • 系统32位和64位的区别 Windows系统32位和64位的区别在哪里
  • win7系统如何关闭系统自检
  • FreeBSD, Debian, CentOS一个网卡绑定多个IP
  • 容器内存限制
  • 如何快速删除windows.old
  • win8系统怎么创建局域网
  • 如何让计算机自动关机
  • win7网卡驱动怎么卸载
  • win8.1系统HDMI高清线连接电视后没有声音的原因及解决办法
  • 在ubuntu上安装gcc
  • win7怎么查看
  • win8.1怎么用
  • win10 系统
  • linux防火墙的主要内容
  • 32/64位Win10预览版11102(中英日韩等)多国语言包官方iso镜像下载大全
  • win7 win8.1双系统安装教程
  • windows8网页版
  • 路径可分为
  • JavaScript创建数量n由用户决定的数组
  • 如何删除命令
  • 网页设计中的几种齐方式及其特点
  • vps 备份
  • python,for循环
  • 正途科技有限公司
  • jquery 菜单
  • 中国有多少人2022
  • 广东省电子税务局电话
  • 报税软件怎么用
  • 云南省残疾人就业服务中心官网
  • 通州税务短信
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设