对Javascript中符号使用的深刻理解

对Javascript中符号使用的深刻理解
符号是什么

符号不是图标,也不意味着可以在代码中使用小图片
这不是其他事物的语法,那么,究竟什么是符号呢

七种数据类型

当Javascript在1997中被标准化时,有6种数据类型。直到6的到来,程序中的变量必须是下列6种数据类型。

未定义

无效的

布尔



字符串

对象

每种类型的数据都是一系列值的组合,前5种数据类型的数量是有限的,只有两种布尔类型值:真与假,在将变量赋给布尔类型(共享两个真值和假数值)时不会产生新的值。标准说的是,有18437736874454810627数字类型的值(包括南)。字符串类型的数量很难统计,我以为是65535(214411518807585587 / 1)…但也许我算错了。

对象值的数量是无限的,每个对象都是唯一的,每次打开一个Web页面时,都会创建一系列对象。

符号在6也是一种数据类型,而不是一个字符串,而不是一个对象,而是一个新的数据类型:第七种类型的数据。

让我们看一个场景。也许符号可以用。

布尔值问题

有时它是把数据属于另一个对象的其他对象非常方便。例如,假设你正在编写一个js库,使用CSS过渡使DOM元素在屏幕运行,你已经知道,不能在同一个div不止一个过渡应用,否则会使动画非常漂亮,你一定有办法解决这个问题,但是首先你需要知道DIV一直在移动。

你是怎样解决这个问题的

一种方法是使用浏览器的API来检测是否在动画的元素,但杀鸡焉用牛刀,元素集的移动,你将知道图书馆元素移动。

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

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

因此,您真正想要做的是直接在元素上设置一个符号。
如果(元。正在){
smoothanimations(元);
}
element.ismoving =真;
如果(元。正在){
smoothanimations(元);
}
element.ismoving =真;

有一些潜在的问题,我们必须承认,还有其他的代码也可以运行ODM元素。

在其他程序中创建的属性,你会列举了在Object.keys();
在其他一些库中,您可能使用相同的方法(在元素上设置相同的属性),这将与代码冲突并产生意外的结果。
一些其他的库可能在将来使用相同的方法,这也会与代码冲突。
标准委员会可以添加一个native.ismoving()的每个元素的方法,所以你的代码是完全不工作
当然,在最后三个问题中,你可以选择一个没有人使用的无意义的字符串:
如果(元。__ jorendorff_animation_library美元美元美元please_do_not_use_this_property ismoving__){
smoothanimations(元);
}
元。__ jorendorff_animation_library美元美元美元please_do_not_use_this_property ismoving__ =真;

如果(元。__ jorendorff_animation_library美元美元美元please_do_not_use_this_property ismoving__){
smoothanimations(元);
}
元。__ jorendorff_animation_library美元美元美元please_do_not_use_this_property ismoving__ =真;

看不见眼睛的疼痛,似乎太不可靠了。

还可以使用加密算法生成几乎惟一的字符串:
1024个Unicode字符乱码 / /得到
VaR正= securerandom.generatename();



如果(元{正}){
smoothanimations(元);
}
元{ } =真实动人;

1024个Unicode字符乱码 / /得到
VaR正= securerandom.generatename();



如果(元{正}){
smoothanimations(元);
}
元{ } =真实动人;

对象{语法允许我们使用任何字符串作为属性名,并且代码可以正常工作。冲突几乎是不可能的。代码看起来更漂亮。

但现在这会导致调试体验不好。当你使用console.log()打印包含该属性的元素,你可以看到一个巨大的垃圾串,如果有多个这样的属性每次刷新后,属性名称都已更改。你如何使这些属性看起来更直观

为什么这么难我们只是想留下一个小标记。

用符号解决问题

符号值可以由程序创建,可以用作属性名,而不必担心属性名冲突。
无功mysymbol =符号();

无功mysymbol =符号();

调用符号()方法将创建一个新的符号类型值,该值不等于任何其他值。

与数字和字符串一样,符号的值也可以用作对象的属性名,因为它不等于任何其他值,相应的属性也不会冲突。

obj { } =好mysymbol!;//保证不会碰撞
console.log(obj { mysymbol }); / /好!

obj { } =好mysymbol!;//保证不会碰撞
console.log(obj { mysymbol }); / /好!
下面是用符号解决以上问题:
一个唯一的符号
VaR正=符号(正);



如果(元{正}){
smoothanimations(元);
}
元{ } =真实动人;

一个唯一的符号
VaR正=符号(正);



如果(元{正}){
smoothanimations(元);
}
元{ } =真实动人;

上面的代码需要注意:

正在字符串的方法的符号(正)被称为符号的描述信息,这对调试很有帮助。它可以打印通过console.log(正在)或转换为字符串的正ismoving.tostring(),或在一些错误信息显示
元素{正}访问是符号键属性,这是其他属性相同,除了属性名称是象征型的价值。
与数组一样,运算符无法访问符号键控属性。必须使用方括号。
符号键控属性的操作也非常方便。通过上面的代码,我们已经知道如何获取和设置元素的值} {动人。我们也可以用这种方式:如果(则在元)或删除元素{正}。
另一方面,只能在范围内正在使用上面的代码,可以实现弱封装机制:在一个模块中创建一些符号,只有在模块对象使用的内部,不与其它模块的代码冲突的恐惧。
符号是为了避免冲突而设计的,当遍历Javascript对象,而不是建立标志枚举的属性,例如,对周期只会遍历字符串的关键属性,Object.keys(obj)和Object.getOwnPropertyNames(obj)是相同的,但这并不意味着符号关键属性的不可数是:Object.getOwnPropertySymbols(obj)这个新方法可以列举,并reflect.ownkeys(obj)这个新方法可以返回所有的字符串和符号键的对象。(我会给一个详细介绍了新的特征,反映在以后的文章。)

库和框架的设计者将发现符号的许多用途,稍后我们将看到Javascript语言本身有着广泛的应用。

符号到底是什么
> >类型的符号()
符号

> >类型的符号()
符号

符号是一个完全不同的事情。一旦创建,你不能改变它,你不能设置属性(如果你尝试在一个严格的模式,你会得到一个错误类型),它们可以被用来作为属性的名字,和他们没有不同从字符串的属性名称。

另一方面,每个符号都是唯一的,它不像创建一个对象一样方便,而不需要与其他符号(甚至使用相同的符号描述)创建重复来创建符号。

在6符号类似于传统语言的符号(如LISP和红宝石),但不完全转移到Javascript。在Lisp,所有的标识符号;在Javascript中,标识符和大多数属性仍然是字符串,符号只提供了一个额外的选择。

值得注意的是,与其他类型不同,符号不能自动转换为字符串。当试图将符号转换为一个字符串,它将返回一个列表。
> VAR符号=符号(<3);
> >你的符号+符号
不能将符号串 / /列表:
> > `你的符号$ {符号} `
不能将符号串 / /列表:

> VAR符号=符号(<3);
> >你的符号+符号
不能将符号串 / /列表:
> > `你的符号$ {符号} `
不能将符号串 / /列表:

这种强制是应该避免的,应转换使用字符串(符号)或sym.tostring()。

获取符号的三种方法

每次调用时,符号()返回一个唯一的符号。
symbol.for(字符串)从符号注册表返回相应的符号。不同于以往的方法,在符号注册符号是共享的,如果你打电话给symbol.for(猫)三次,你将返回相同的符号。注册表是非常有用的在不同的页面或同一页面的不同模块需要共享的符号。
symbol.iterator返回一些符号预定义的语言,每一种都有其自己的特殊用途。
如果您仍然不确定符号是否有用,那么下一个内容将非常有趣,因为我将向您展示符号的实际应用程序

符号在6规范中的应用

我们已经知道,符号可以用来避免代码碰撞。在迭代器的介绍,我们也分析了(对MyArray VaR是调用MyArray {项目)的象征。迭代器}()开始,当我提到这个方法可以用来代替myarray.iterator(符号),但落后采用兼容性更好。

还有6中所使用的符号的一些地方。(这些功能尚未实现在Firefox中。)

使是可扩展的,6,对象实例构造函数表达规范化的一种方式,构造函数:构造函数{符号。hasinstance }(对象),这意味着它是可扩展的。
消除新特性与旧代码之间的冲突。
支持新类型的字符串匹配,ES5,当str.match(MyObject)称,将MyObject为RegExp对象的首次尝试。在6,首先检查是否有一个MyObject {符号。比赛}(STR)的方法,它可以提供一个MyObject,自定义字符串解析法在所有正则表达式的工作。
这些用途相对较窄,但它是很难看到明显的影响,这些新功能只能通过代码在我的文章。象征,Javascript是一种改进的PHP和Python __doubleunderscores版。标准组织将使用它为语言添加新特性,但不使用现有代码。

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部