位置: 编程技术 - 正文

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

  • 股东购买自己公司产品
  • 季度亏损还需要计提所得税吗
  • 非税收入一般缴款书一式几联
  • 连续亏损3年
  • 被客户扣钱怎么办
  • 工资薪金总额包括年终奖吗
  • 房地产土地增值税计税依据
  • 个人给公司垫付款起诉状
  • 低价股权转让是利空还是利好
  • 生产用的软件
  • 重新建账要以前的期初余额吗
  • 改建或新建建筑物含义
  • 产权转移书据有哪些
  • 收购药材再销售可以免税
  • 境内企业技术转让 增值税
  • 科技项目经费怎么申报
  • 外派人员计算个人所得税可否有附加扣除
  • 苗木发票抵扣政策2021
  • 业务招待费扣除基数的收入包括哪些
  • 什么电脑系统比较好
  • 饭店开业请客说什么
  • 债券转让增值税例子
  • win7安装包下载
  • 为什么不能零申报
  • 企业提取盈余公积会引起所有者权益变动吗
  • 劳务派遣公司的账务处理
  • 非货币性资产交换以公允价值为基础进行计量
  • 汉密尔顿岛在哪里
  • 材料入库款项未付会计分录
  • 材料成本差异怎么结转
  • 工业企业如何纳税
  • php设置中文
  • 购进的产品样品怎么入账
  • 注意力机制加在CNN的什么位置
  • nvme安装方法
  • 营业额增长率公式
  • 税务自查报告要盖什么章
  • 子公司收购母公司另一子公司会计处理
  • 公司名义送花圈
  • 进项税和销项税的分录
  • 财务报表怎么重新编制
  • 上月结余金额是什么的
  • sql行列转换结果保存为新表
  • Keepalived+HAProxy实现MySQL高可用负载均衡的配置
  • 建筑企业会计科目的设置及核算
  • 电商收服务费合法吗
  • 销项税和进项税的区别
  • 内部损益是什么
  • 办公楼开始建造前专门借款的利息费用
  • 退休人员在企业工作工资怎么算
  • 赠品当商品卖
  • 小规模取得增值税专用发票怎么做账
  • 资产负债表中应交税费为负数是什么意思
  • 根据企业会计准则第4号固定资产,企业可选用的折旧方法
  • 建筑公司直接把钱打到个人账户怎么走账
  • mysql5.7.27安装教程
  • mysql8.0二进制安装
  • SQL Server提示"选定的用户拥有对象,所以无法除去该用户”
  • Linux CentOS MySQL数据库安装配置教程
  • 怎么操作win10系统
  • win10预览版选哪个
  • mac电脑安装windows
  • mac expose
  • WIN10系统中WPS字体颜色浅
  • android app 源码
  • cocos2dx4.0教程
  • Extjs ajax同步请求时post方式参数发送方式
  • 安卓手机屏幕不好使了怎么办
  • js中cookie
  • web中class和id的区别
  • 网页制作css怎么用
  • jQuery on绑定的事件
  • 消耗cpu的软件
  • 网页中实现浏览的快捷键
  • 个人所得税发票
  • 社保欠费税务催缴
  • 农业方面有哪些有名杂志
  • 税务局纪检组为税收工作纪律保障
  • 江西国家税务局电子税务局
  • 税务局查帐怎么查
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设