较新的Android版本(> 2.2)包含v8 javascript引擎,而较旧的版本仅具有JSC。但是,根据http://blogs.nitobi.com/joe/2011/01/14/android-your-js-engine-is-not-always-v8/,在运行时使用哪个javascript引擎似乎取决于构建时出现的环境变量(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.

我的问题是:有什么方法可以从网页,嵌入式WebView或应用程序中确定使用哪个JavaScript引擎?

如果答案是否定的,那么有人知道Android模拟器使用哪个JS引擎吗?

我问这个的原因是因为这个问题:http://code.google.com/p/android/issues/detail?id=12987

基本上,可能是JSC中的javascript到Java的桥梁在Android 2.3.X上已损坏,这会影响我尝试编写的应用程序。我在仿真器的JNI中的某个地方看到了段错误,但在我测试过的少数物理设备上却没有看到。我正在尝试确定这是仅用于模拟器的事物,仅用于JSC的事物还是完全不同的事物。

最佳答案

我认为更好的问题是:您为什么在乎?您基本上是陷入了“浏览器检测”陷阱,许多人在90年代末/00年代初陷入了这种陷阱。从那以后,尽管如此,我们已经知道,功能检测是更有用的方法,不仅因为给定浏览器支持的功能(主要是移动目标)。现在有在IE9上运行的代码,它具有经过极大改进的DOM和JavaScript支持,没有使用这些功能,因为它正在进行浏览器检测并依靠IE6技术。

因此,不必担心V8与JSC,而只需要担心所需的功能。我对JSC一无所知,但举例来说,假设它在V8拥有的数组(ECMAScript 5th Edition标准的一部分)中没有forEach方法。与其抛出一个大的“V8 vs. JSC”杠杆,您要做的是:

if (typeof Array.prototype.forEach === "function") {
    // Code that expects `forEach`
}
else {
    // Code that falls back
}

(您的“回退代码”可能会在原型(prototype)中添加forEach,或者此测试位于您自己的迭代器函数中,并且您想知道是遵从 native 实现还是提供自己的实现。)

同样,对于您要使用的可能存在或不存在的其他功能,也是如此。

但是,如果您确实需要检测V8与JSC(从您的评论看来,您可能会发现),则this page似乎证明了这样做的一种方法,尽管它看上去非常脆弱。这是我经过稍微编辑的版本(至少是用window.devicePixelRatio的测试来替换WebkitAppearance -前者在至少其他一些浏览器(例如,使用Gecko而不是WebKit的Firefox)上给出了误报):

var v8string = 'function%20javaEnabled%28%29%20%7B%20%5Bnative%20code%5D%20%7D';

if ('WebkitAppearance' in document.documentElement.style) { //If (probably) WebKit browser
    if (escape(navigator.javaEnabled.toString()) === v8string) {
        console.log('V8 detected');
    } else {
        console.log('JSC detected');
    }
} else {
    console.log("Not a WebKit browser");
}


对我有用,可以检测Chrome(也使用V8)和Safari(也使用JSC)之间的区别。

关于javascript - 如何在Android的运行时检测使用哪个JavaScript引擎(v8或JSC)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6768474/

10-10 02:16