在JS中,有九种类型的字符串旋转值:
这些方法的结果的差异如下表所示:
比较表的源代码已发布到需要获取的https://airing.ursb.me/web/int.html。
除了运行结果的差异外,这些方法还具有性能差异。在NODEJS V8环境中,这些方法的微型基本测试结果如下:
可以看出,最低效率,只有大约2%的其他操作,最慢的效率,只有1%。
为什么有不同的方式?如何在发动机层中解释这些操作?从主流JS发动机(例如V8,JavascriptCore,QuickJS等)的角度来看,它将探索这些方法的特定实现。
首先看看。
eCMAScript(ECMA-262)Parseint
在V8 [→src/init/bootstrapper.cc]中定义构建-in js语言的标准对象。我们可以找到它的定义:
可以看出,parseint和全局对象的parseint基于注册。它将将API安装在分离株中,并用bundin.js侧调用是发动机侧呼叫。
内置(内置功能)是一个代码块,当V8在V8中运行时可以执行,该代码块用于在运行时表达对VM的更改。在目前,内置在V8版本中具有以下5个实现方法:
返回到上一篇文章的功能,您可以在[→src/nelidins/builds.h]中看到定义:
因此,在此功能中注册的原始名称将在[→SRC/incelions/number.tq]中实现,该名称是基于扭矩的内置实现。
在查看此代码之前,在科学科学下,V8中的几个数据结构:(可以看到V8中所有数据结构的定义[→SRC/Objects/Objects.h])
我们知道两个形状的参数在这里是相同的。实现过程如下:
然后焦点来了。[→SRC/Runtime/Runtime-numbers.cc]
这种逻辑相对简单,因此我不会解释它。值得注意的是,根据标准,如果不在2?36的范围内,NAN将被返回。
让我们看一下JavaScriptCore。
javascriptCore中JS语言的构建对象的注册是[→Runtime/jsglobalobjectfuntiontions.cpp] file ::
WebKit中的代码注释非常易于阅读,并且不再在此处解释。从[→Runtime/parseint.h]中放置JavaScriptCore的实现。核心代码如下:
该代码是直接发布的,因为JavascriptCore中的API严格紧随其后的是Ecmascript(ECMA-262)Parseint标准,并且可读性和注释也非常好。强烈建议读者自己阅读。
QuickJS的核心代码在[→QuickJs.c]中。第一个注册代码:
实施的逻辑如下:
贝拉德的代码评论很小,但同时非常精致。
在这一点上,本文在三个引擎下介绍了其实施。这三个是基于标准实现的,但是由于代码样式不同,因此似乎读了三种样式的三种样式的作品。
但是,标准和实施,我们可以在实际执行字符串的操作中找到许多领域操作,例如输入法律判断,沉默识别价值,字符串格式判断和正则化,交叉判决等,等等等等,从运行时进行处理。因此,启动其效率略低的原因并不困难。
接下来,让我们简单地看一下。
ECMASCRIPT(ECMA-262)parsefloat
根据标准,parsefloat与Parseint不同:
V8中的相关逻辑彼此相邻,关键实现直接在此处发布:
[→src/incelions/number.tq]
[→src/runtime/runtime-numbers.cc]
由于标准中的过程更简单,因此更容易阅读更容易。
在JavaScriptCore中,逻辑的逻辑更简洁明了:
与JavaScriptCore相比,QuickJS仅为12行:
[→QuickJs.c]
但是,经过比较后,QuickJS在这里很短,与ASCII和8bit不兼容。阅读Ecmascript(ECMA-262)parsefloat,您会发现在这里QuickJS的处理实际上没有问题。在最新标准中,没有要求解释器兼容。
eCmascript(ECMA-262)编号(值)
作为一个全局对象的数字是在[→SRC/INIT/BOOTTRAPPER.CC]中定义的,并且已在前面介绍的寄存器中引入。让我们回顾一下:
除了此代码处理外,该代码还已注册,其原型链初始化了它,并将构造函数添加到其原型链中。构造函数是由扭矩实现的内置功能,[→src/builds/constructor.tq]实施如下:
注释中的1-6一个对应于[ECMASCRIPT(ECMA-262)编号(值)]标准中的过程1-6,因此本文未描述本文。指出该数字支持BIGINT,并且每个引擎的实施也关注这一点,这也证明了我们先前的操作控制表中的结果。
JavaScriptCore中的该代码缺乏注释,但在逻辑上与V8完全相同。遵循标准:
[→Runtime/numberConstructor.cpp]
数字对象的注册代码及其原始链如下所示:
[→QuickJs.c]
同样,在注册时将构造函数与原始链绑定:
值得注意的是,QuickJS正在追求精简的紧凑性,因此它可以配置是否支持BigInt,其余逻辑仍然遵循标准。
eCmascript(ECMA-262)钻头不运算符
使用?操作字符使用标准中的第二步来键入计算的值类型转换,从而将字符串转换为一个值。在此处,我们注意发动机中的哪些步骤完成。
首先查看V8中的一个犯罪运营商的判断:
[→src/parsing/token.h]
在add and void范围内定义的OP是一个 - 美元操作员,其中包括(可见[→src/parsing/token.h])。它还将击中一个 - 羽毛符号的判断:
进入语法分析阶段后,在分析AST树的过程中,将相应地处理一个犯罪计算符号。
[→src/parsing/parser-base.h]
[→src/parsing/parser.cc]
如果单词的表面是数字的,并且一个 - 美元的操作符号不是(!),则该值将转换为数字。
同样在用于生成AST阶段的语法分析中,在处理tilde(?)之后,在创建表达式时将转换此表达式:
[→解析器/Parser.cpp]
[→解析器/astbuilder.h]
[→解析器/nodeconstructors.h]
[→解析器/resulttype.h]
在语法分析阶段中的QuickJS遇到?这个代币会称呼:
[→QuickJs.c]
将生成OP_NOT字节码操作员,并将源代码保存在fd-> byte_code中。
QuickJS解释执行的函数是它调用字节代码的解释,其核心逻辑是呼叫函数。
可以看出,在解析op_not时,如果是整数,请直接采用它,否则请致电:
将尝试出现,如果您不能转动,则转动-1,转动后转动。转换的逻辑如下:
对于字符串,字符串处理中涉及的核心逻辑如下:
它可以用于处理,否则返回NAN。
eCMAScript(ECMA-262)Unary Plus操作员
一个 - 美元计算符号是我最喜欢使用的字符串转子值的方法。在标准中,它没有任何芽。很简短,它用于进行数值类型的转换。
语法分析阶段与双重旋转(~~)操作员相同,在此不会重复。
语法分析阶段与双重旋转(~~)操作员相同,在此不会重复。
语法分析阶段与Double Tilde(~~)运算符相同,该操作员不会在此处重复。最后,我仍然到达。
[→QuickJs.c]
可以发现,当操作号码为int或float时,它不直接处理,这与标准中的标准一致。在其他情况下,如果您在呼叫中遇到异常情况,请致电:异常逻辑:
此处的内部处理逻辑与4.3中的内部处理逻辑相同,我不会详细介绍。处理值转换后,如果运算符是一个售价计算,它将直接返回;否则,它将根据操作员根据操作员进行完成,例如+1,例如自添加的符号。
在这一点上,我们已经解释了解释器中以下五种方法的具体实现:
除上述5种数值转换方法外,还有4种方法。由于长度问题,本文将不会详细介绍:
绳杆的数量具有其自身的优势和缺点。用户可以根据自己的需求进行选择。以下是我个人的一些摘要经验:
如果仅需要返回值才是塑料:
如果需要返回值才能浮动 - 点类型: