Создание объекта дважды приводит к разным результатам

У меня есть код javascript ниже. В Chrome, Firefox, эмуляторе Android, Firefox на Samsung Galaxy S (Gingerbread 2.3.3) и Safari на iPod все работает нормально. В родном браузере на Samsung Galaxy S его нет.

Код создает объект и проверяет значения объекта. В первый раз он создает объекты правильно. Во второй раз, когда он создает объект, значения неверны.

Это ошибка в Javascript или V8 или устройстве? Как бы вы подошли к ее решению?

var Padding = function(pleft, ptop, pright, pbottom) {
    this.top = 20;
    this.left = 1;
    this.right = 0;
    this.bottom = 0;
    this.left = pleft;
    this.top = ptop;
    this.right = pright;
    this.bottom = pbottom;
};

function testPadding() {
    var p;
    p = new Padding(91, 92, 93, 94);
    alert(p.left.toString() + "," + p.top.toString() + "," + p.right.toString() + "," + p.bottom.toString());
}

testPadding();  // 91,92,93,94 - correct
testPadding(); // 1,20,93,0 - should be 91,92,93,94
testPadding(); // 1,20,93,0 - should be 91,92,93,94

РЕДАКТИРОВАТЬ: я нашел, почему это работает в эмуляторе. Эмулятор использует другой движок JavaScript. Он использует АО вместо V8. На http://code.google.com/p/android/issues/detail?id=12987, который поможет вам понять, какой движок он использует. Эмулятор использует АО, Samsung Galaxy S использует V8.


person dan gibson    schedule 18.10.2011    source источник
comment
Это ошибка в реализации ECMAScript, как бы она ни называлась. :-)   -  person RobG    schedule 18.10.2011
comment
Это точно баг, но чей? Samsung? V8? Я пишу электронное письмо Samsung, но кто знает, перешлют ли они его нужному человеку или просто проигнорируют.   -  person dan gibson    schedule 18.10.2011
comment
Я бы зарегистрировал его в Samsung. Найдите другие браузеры, использующие тот же скриптовый движок, и посмотрите, есть ли в них такая же ошибка. Если вы ее найдете, сообщите об ошибке тому, кто разрабатывает V8 (Google?). Если они исправили это в более поздней версии, Samsung должна обновить свой браузер до более поздней версии.   -  person RobG    schedule 18.10.2011
comment
Создана проблема в системе отслеживания ошибок Android: code.google.com/p. /android/issues/detail?id=20889   -  person dan gibson    schedule 18.10.2011


Ответы (1)


Из-за того, как V8 Engine выполняет сборку мусора и кэширование, я полагаю, что это не делается с объектом до того, как он начнет возвращать результат. Вы пытались изменить свой код на следующий? Возвращает ли он ожидаемый результат каждый раз с этим кодом?

var Padding = function(pleft, ptop, pright, pbottom) {
    this.top = (ptop != null) ? ptop : 20;
    this.left = (pleft!= null) ? pleft: 1;
    this.right = (pright!= null) ? pright: 0;
    this.bottom = (pbottom!= null) ? pbottom: 0;
};

function testPadding() {
    var p;
    p = new Padding(91, 92, 93, 94);
    alert(p.left.toString() + "," + p.top.toString() + "," + p.right.toString() + "," + p.bottom.toString());
}

testPadding(); // ?
testPadding(); // ?
testPadding(); // ?
person Nikkoli    schedule 19.10.2011