Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Аномальное поведение массива в Firefox


Автор: Megas 20.9.2013, 20:43
Пытаюсь отладить код, который почемуто не работает в Firefox, но отлично работает в Chrome.

Суть такова, в некую функцию передаются параметры, один из которых массив. Внутри функции есть проверка этого массива (Переменная C):
user posted image

Какимто образом данное условие не срабатывает, не смотря на то, что данная переменная 100% массив. Это видно все в том же Firebug'e.
user posted image

Как можно видеть C является массивом, но при этом C instance Array почемуто false.

В функцию данный массив передаётся примерно так: someFunction([1, 2, 3])
При этом как можно видеть выше [] instanceof Array = true

Что я уже перепробовал:

1.
Код

var data = [1, 2, 3];
console.log(data instance Array);
someFunction(data);

Перед вызовом функции data instance Array возвращает true, а вот в функции уже false

2.
Пробовал и так:
Код

someFunction(new Array(1, 2, 3));

Всеравно не работает.

Для заметки:
1. Данное условие находится в самом начале функции, никаких действий с переменной C до этого не производится.
2. Проверяю на Firefox 23
3. Дебажу все через Firebug

Я уже и не знаю что делать, как такое вообще возможно? Что я упустил? Как я уже сказал, в хроме все работает отлично.

Автор: skyboy 21.9.2013, 00:50
Цитата(Megas @  20.9.2013,  19:43 Найти цитируемый пост)
 someFunction([1, 2, 3])

нет уж. давай полностью сигнатуру метода и как он вызывается.
мало ль.
arguments тоже выглядит как массив. но это не массив.
на крайняк, проверяй, что объект. и что есть length.

Автор: Megas 21.9.2013, 16:59
Ну если вдаваться в подробности, то я пишу юзерскрипт для игры ikariam.
У них джаваскрипт обфусцирован, поэтому и названия у переменных такие.
Функцию которую я вызываю отвечает за создание всплывающего окна с произвольной информацией.

Метод вызывается так:
Код

ikariam.getPopupController().createPopup(
    'popup_id', 
    'Popup title', 
    ['Content text', 0, 'Close button text'], 
    0
);


А вот и сам метод в сокращенном виде, все строчки до нужного условия сохранены, остальное вырезанно так как нет в нем нужды:
Код

ikariam.PopupController = {
    createPopup: function(E, B, C, L, D) {
        var I = ikariam.getPopupController();
        I.boxMainContent = createEl("div");
        if (C instanceof Array && C.length > 0) {
            // вырезанно 
        } else {
            // вырезанно 
        }
    }, 
    
    // вырезанно 
};

Автор: akizelokro 21.9.2013, 17:14
попробуй передать ['1', '2', '3']

Автор: Megas 22.9.2013, 14:13
akizelokro, как не удивительно, это никак не помогло. Да и с чего бы чтото изменило.

Ещё большей загадкой является то, что:
Код

Object.prototype.toString.call(C); //возвращает "[object Array]"

// а вот

C instanceof Array; //Уже равно false

Автор: Megas 23.9.2013, 00:07
Все, разобрался. Оказывается Array был переопределен.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)