浏览器(IE和Firefox)每次页面刷新时都会解析链接的javascript文件吗?
他们可以缓存文件,因此我猜他们不会每次都尝试下载它们,但由于每个页面基本上是分开的,我希望它们可以拆除任何旧代码并重新解析它.
这是低效的,虽然完全可以理解,但我想知道现代浏览器是否足够聪明以避免站点内的解析步骤.我在想一个网站使用javascript库的情况,比如ExtJS或jQuery等.
我现在对JavaScript引擎感到困惑.我知道V8是一个大问题,因为它将JavaScript编译为本机代码.
然后我开始阅读Mozilla SpiderMonkey,据我所知,它是用C语言编写的,可以编译JavaScript.那么这与V8有什么不同呢?如果这是真的,为什么Firefox不这样做呢?
最后,Rhino是否真的将JavaScript编译为Java字节代码,以便您获得Java的所有速度优势?如果没有,为什么人们在桌面上编写脚本时不能运行V8?
基准:
不变量:
var f = function() { };
var g = function() { return this; }
Run Code Online (Sandbox Code Playgroud)
测试:
下面按预期速度顺序排列
new f;g.call(Object.create(Object.prototype));new (function() { })(function() { return this; }).call(Object.create(Object.prototype));实际速度:
new f;g.call(Object.create(Object.prototype));(function() { return this; }).call(Object.create(Object.prototype));new (function() { })问题:
f和g内联匿名函数时.为什么new(测试4.)测试更慢?更新:
具体是什么导致new要慢时f和g内联.
我对ES5规范的引用或对JagerMonkey或V8源代码的引用感兴趣.(请随意链接JSC和Carakan源代码.哦,如果他们愿意,IE团队可以泄漏Chakra源代码).
如果您链接任何JS引擎源,请解释它.
我正在寻找一个.NET的开源JavaScript引擎.谢谢.
所述Object.observe()的JavaScript API允许任何一段代码以接收改变通知任何JavaScript对象的所有属性的变化.
这是否会严重影响JavaScript引擎(即V8)可以执行的代码生成和性能优化?如果必须生成更改通知,现在生成的本机代码似乎必须检查对象的每次写入.无法静态确定给定对象是否设置了通知.因此检查无法优化.
似乎任何符合要求的JavaScript引擎现在都因此API而导致性能永久严重损失.
例如alert(),Object(),String()等.
我怎么看这些函数背后的代码?我是否需要理解V8等引擎的语言并通读它,或者是否有更简单的解决方案.
较新版本的Android(> 2.2)包括v8 javascript引擎,而旧版本只有JSC.但是,根据http://blogs.nitobi.com/joe/2011/01/14/android-your-js-engine-is-not-always-v8/,运行时使用的javascript引擎似乎依赖于build-time(JS_ENGINE)中出现的环境变量,以及设备的硬件规格:
# The default / alternative engine depends on the device class.
# On devices with a lot of memory (e.g. Passion/Sholes), the
# default is V8. On everything else, the only choice is JSC.
Run Code Online (Sandbox Code Playgroud)
我的问题是:有什么方法可以确定在网页,嵌入式WebView或应用程序中使用哪个javascript引擎?
如果答案是否定的,那么有人知道Android模拟器使用了哪个JS引擎吗?
我问这个的原因是因为这个问题:http://code.google.com/p/android/issues/detail?id = 12987
基本上,可能是JSC中的javascript-to-java桥在Android 2.3.X上被破坏了,这会影响我正在尝试编写的应用程序.我在我的模拟器上看到了JNI深处的某个段错误,但是我测试过的少数几个物理设备上没有.我试图确定这是否只是一个模拟器,只有JSC的东西,或者完全不同的东西.
我试图将JS对象转换为JSON.
JSON.stringify({a:1, toJSON: function(){}})
Run Code Online (Sandbox Code Playgroud)
原生JSON stringify未按预期工作.JSON stringify在JS对象内部执行toJSON函数.我已经覆盖了如下的本机代码,
// Adding try catch for non JSON support browsers.
try{
_jsonStringify = JSON.stringify;
JSON.stringify = function(object){
var fnCopy = object.toJSON;
object.toJSON = undefined;
var result = _jsonStringify(object);
object.toJSON = fnCopy;
return result;
};
}catch(e){}
Run Code Online (Sandbox Code Playgroud)
它工作正常.有没有其他更好的方法来做到这一点?在本机代码中是否有任何特定原因在输入对象中执行toJSON函数?
请使用以下代码示例:
var myObject = {};
var i = 100;
while (i--) {
myObject["foo"+i] = new Foo(i);
}
console.log(myObject["foo42"].bar());
Run Code Online (Sandbox Code Playgroud)
我有几个问题.
主要引擎(IE,Mozilla,Chrome,Safari)使用什么样的数据结构来存储键值对?我希望它是一种二进制搜索树,但我认为它们可能会使用链表(因为迭代是按插入顺序完成的).
如果他们确实使用搜索树,它是自我平衡的吗?因为具有传统搜索树的上述代码将创建不平衡树,导致用于搜索的O(n)的最坏情况场景,而不是用于平衡树的O(log n).
我只是问这个,因为我将编写一个库,需要从数据结构中有效地检索密钥,虽然我可以实现自己的或现有的红黑树,但我宁愿使用本机对象属性,如果它们是足够有效.
javascript time-complexity javascript-engine javascript-objects data-structures
javascript ×9
v8 ×3
browser ×2
android ×1
built-in ×1
c# ×1
ecmascript-5 ×1
json ×1
performance ×1
php ×1
rhino ×1
spidermonkey ×1