草庐IT

SpiderMonkey

全部标签

javascript - 在 JavaScript 中应用函数

我正在学习JavaScript,目前正在尝试找出原因(在Spidermonkey中)[].concat.apply([1],[[2]])返回预期的[1,2],但是Array.concat.apply([1],[[2]])返回[2]而不是[1,2]。有人可以提供一个很好的解释吗? 最佳答案 [].concat是Array.prototype.concat。Array.concat是一种仅限Firefox的静态方法,它连接一个或多个数组并忽略其this参数。 关于javascript-在Ja

javascript - Rhino VS Spidermonkey 性能测试

我有一个正在为我的公司工作的项目,现在我需要决定我应该使用哪个JS引擎。目前我的选择是Spidermonkey或Rhino。我主要关心的是性能和可扩展性,我想知道是否进行了性能测试来比较两个引擎?我发现用谷歌搜索这个问题比我预期的要难。在此先感谢您的帮助,Ben。 最佳答案 我定期在Rhino和Spidermonkey上运行V8和Sunspider基准测试(免责声明:我是Rhino项目的提交者)。当前的Rhino版本(1.7R3)仍然比Spidermonkey慢很多,但是最近的git快照已经catch了。(请注意,我说的是没有Jae

javascript - Firefox ES6,获取类构造函数名称

在Firefox中使用ES6类时,我在获取构造函数的名称时遇到问题。在Chromium中它工作正常,但Firefox似乎有某种错误?在Firefox中,我只返回一个空字符串。有人知道解决方法吗?classMyClass{}leta=newMyClass();console.log(a.constructor.name); 最佳答案 我认为这是一个错误(根据下面的评论)。似乎指定显式构造函数在Firefox中表现出正确的行为(即使是最新版本48)。classMyClassWithConstructor{constructor(){co

javascript - 带 block 的常量声明

最近我在研究FirefoxAdd-onBuilderSDK来源,并偶然发现了这样的常量声明:const{getCodeForKey,toJSON}=require("../../keyboard/utils");我可以找到关于CommonJSModules的信息,但是这个作业的左边部分让我有点困惑,因为它必须是特定于语言的,而且我无法在谷歌上搜索任何内容。谁能给我指点一些说明这里发生了什么的规范/草案? 最佳答案 这是一个destructuringassignment,目前仅由Firefox使用的SpiderMonkeyJavaSc

javascript - 鉴于 V8/spidermonkey/chakra 的内部工作原理,在 JavaScript 中显式初始化 undefined object 成员是否是一种优化?

在JavaScript中,一个通常被吹捧的良好性能原则是避免改变对象的形状。这让我想知道,这是不是classFoo{constructor(){this.bar=undefined;}baz(x){this.bar=x;}}一个有值(value)的最佳实践,将提供比这更好的性能classFoo{constructor(){}baz(x){this.bar=x;}}这是真的还是假的?为什么?在一个JS引擎中是否比其他引擎更真实或更不真实? 最佳答案 这里是V8开发人员。是的,总的来说,第一个版本是一个有值(value)的最佳实践。这样

javascript - JavaScript `var` 关键字的混淆操作

我遇到了一个关于var关键字的(对我来说)非常奇怪的问题。我已将它简化为一个相当小的测试用例,并发现它在Node.js(因此是V8和Chrome)、Safari4的检查器(因此是Nitro)和FireBug(显然是SpiderMonkey)中都有展示。我最初是准备一份错误报告,但由于它被广泛展示,我假设我完全误解了JavaScript应该如何确定范围和查找变量。测试用例非常小,在GitHub上:http://gist.github.com/260067.第一个示例和第二个示例之间的唯一区别是包含了var关键字。这里还有一个类似的测试用例,它以不同的方式展示了相同的“问题”:https:

javascript - 创建函数是否消耗更多内存

//CaseAfunctionConstructor(){this.foo=function(){...};...}//vs//CaseBfunctionConstructor(){...};Constructor.prototype.foo=function(){...}人们建议使用原型(prototype)的主要原因之一是.foo在原型(prototype)的情况下被创建一次,而this.foo被创建多次当使用其他方法时。然而,人们希望口译员可以优化这一点。因此在案例A中只有一个函数foo的副本。当然,由于闭包,您仍然会为每个对象拥有一个唯一的范围上下文,但与每个对象的新函数相比,

生成器的 Javascript 堆栈模型

当我使用javascript生成器为小型方案解释器实现调试器时,我开始想知道堆栈模型,例如chromejavascript引擎。通常函数调用帧有一个堆栈就足够了。在生成器的情况下,我可以让函数调用执行另一条路径,然后跳回到部分执行的生成器,即将堆栈的一部分放入剩余的生命中。这是如何实现的,例如在chrome或firefoxjavascript引擎中?整个虚拟栈是由几个虚拟栈组成的还是yield时剩下的那部分栈写入生成器对象?然后它可以在再次进入生成器时放回堆栈。 最佳答案 生成器仍然在与普通函数相同的单个调用堆栈上运行。不存在评估在

javascript - 如何从我的 reportError 函数中获取 SpiderMonkey (JSAPI) 中的完整回溯?

我正在使用spidermonkey在我的应用程序中嵌入javascript,并且我有一个名为reportError的函数,它接收JSErrorReport.捕获错误的当前行似乎很简单,但是是否有可能让整个调用路径显示完整的回溯? 最佳答案 通过JSErrorReport是做不到的。相反,您必须查看调试器APIS。找到头文件jsdbgapi.h。它有一个钩子(Hook)函数列表,如果您在启用调试的情况下运行(JS_SetDebugMode(cx,true)),将调用这些函数。在这些钩子(Hook)函数中,您可以简单地调用js_Dump

javascript - 如果您在 Chrome 的控制台中尝试 9n**9n**9n,Chrome 会中断(类似于无限循环)。为什么会这样?

如果您在Chrome的控制台中尝试9n**9n**9n,Chrome就会中断(类似于无限循环)。V8引擎是否缺少针对这种情况的实现?我的意思是,如果您尝试9**9**9,它将返回Infinity,这很不错。为什么V8在前一种情况下不返回Infinity?为什么它似乎进入了无限循环?我在Firefox中也试过了,这个问题不存在,因为目前SpiderMonkey中没有BigInt实现。谢谢! 最佳答案 如前所述,9n是9的BigInt表示。**(幂)运算符从右到左工作,导致结果快速升级:2n**2n**2n===2n**4n===16n