Я думаю, что лучший вопрос: почему тебя это волнует?Вы попадаете в ловушку «обнаружения браузеров», в которую многие попали в конце 90-х - начале 00-х годов.Однако с тех пор мы узнали, что обнаружение функций - это более полезный подход, не в последнюю очередь потому, что функции, поддерживаемые в данном браузере, были (в основном) движущейся целью.Теперь есть код, работающий на IE9 с его значительно улучшенной поддержкой DOM и JavaScript, который не использует эти функции, потому что он выполняет обнаружение браузера и использует методы IE6.
Так что вместо того, чтобы беспокоиться о V8 против JSC,просто беспокойтесь о функциях, которые вы хотите.Я ничего не знаю о JSC, но, например, давайте предположим, что у него нет метода forEach
для массивов, который есть у V8 (часть стандарта ECMAScript 5-е издание).Вместо того, чтобы бросать большой рычаг «V8 vs. JSC», вы должны сделать:
if (typeof Array.prototype.forEach === "function") {
// Code that expects `forEach`
}
else {
// Code that falls back
}
(Ваш «код, который отступает» может добавить forEach
к прототипу,или, может быть, этот тест находится в вашей собственной функции итератора, и вы хотите знать, следует ли отложить его до собственной реализации или предоставить свою собственную.)
И аналогично для других функций, которые вы хотите использовать, которые могут присутствовать или не присутствовать.
Но если вам действительно нужно обнаружить V8 против JSC (и из вашего комментария кажется, что вы можете), эта страница , кажется, демонстрирует способ сделать это, хотяэто кажется ужасно хрупким.Вот моя слегка отредактированная версия (не в последнюю очередь заменить window.devicePixelRatio
тестом на WebkitAppearance
- первый дает ложные срабатывания по крайней мере в некоторых других браузерах [например, Firefox, который использует Gecko, а не WebKit]):
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).