位置: 编程技术 - 正文

深入了解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中的箭头函数(深入理解新发展理念,推进供给侧结构性改革)

  • 纳税信用等级评定在哪里查询
  • 什么是试算平衡?如何进行试算平衡
  • 金税盘是每天有5次机会吗
  • 金蝶k3如何设置凭证保存自动新增
  • 外地工程款没有预缴会怎么样
  • 未确认融资收益对应的科目是什么
  • 单位边际贡献和边际贡献一样吗
  • 作家以及作品
  • 自查补交以前年度增值税怎么做账
  • 库存商品公司自己用怎么下账
  • 企业购进材料的会计分录
  • 固定资产减半征收2%申报如何填增值税纳税申报表
  • 增值税专用发票抵扣最新规定
  • 收到借款是承兑付款吗
  • 取得稳岗补贴后怎么办
  • 实物型产品的基础知识
  • 财务费用利息收入在损益表中怎么填
  • 分支机构增值税汇总纳税如何申报?
  • 差额征税一般纳税人认定标准
  • 一般纳税人证明在哪里打印
  • 企业资产损失会计处理
  • 矿山机械设备租赁有限公司
  • 王者荣耀中刘邦技能解析以及如何连招
  • php数组函数实现机选双色球
  • linux怎么操作
  • 建筑行业收到工程款会计分录
  • win11wifi功能消失了
  • 代付收款入账是什么意思
  • 应付票据可以直接填列吗
  • css禁用button按钮
  • 竣工工程成本核算
  • 买了土地没有土地证怎么办理
  • php中各种定义变量的值
  • PHP:imagecolorresolve()的用法_GD库图像处理函数
  • php获取文章内容图片
  • 爬坑图片卡通
  • 废品损失属于产品成本项目吗
  • 宝塔面板使用教程
  • Stable Diffusion 关键词tag语法教程
  • uniapp简介
  • linux php redis扩展
  • 公司搞研发是什么意思
  • python 字典中的字典
  • 带附件的目录
  • vue连接webapi
  • python 记录日志
  • mac安装mysql8.0
  • 公司代扣代缴个人所得税是怎么算的
  • 为客户购买的机票怎么入账
  • 工业设备种类
  • 购买材料增值税税率
  • 特许权使用费收入按照收到特许权使用费的日期确认收入
  • 存货跌价准备什么科目
  • 小规模纳税人什么时候用3%什么时候用5%
  • 长期股权投资成本法会计处理
  • 如何解决私账流失问题
  • 长期待摊费用摊完了之后怎么处理
  • 银行扣掉的手续费怎么算
  • 电子秤计入什么费用
  • cmd命令行窗口快捷键
  • win8系统忘记电脑开机密码怎么办
  • “linux”
  • centos怎么配置dns
  • dwm exe是什么
  • ubuntudde 中文
  • winxp打开任务管理器的快捷键
  • Win10 Redstone 11082视频快速上手:已知bug及新变化一览
  • windows8应用商店在哪
  • 注册win7账号
  • cocos2dx官方教程
  • 深入剖析kubernetes pdf
  • python编程术语
  • python3正则
  • jquery设置图片路径
  • android PopupWindow显示位置设置
  • javascript面向对象吗
  • 阜阳市税务局地址
  • 关税税率表包括哪些
  • 买新车还要交套餐费吗
  • 贵州地税电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设