Nieoczekiwane wywołanie metody JavaScript

W ostatnim czasie kilkakrotnie otrzymałem od użytkowników programu JSFamilia raporty o błędach JavaScript w przeglądarce Microsoft Windows Internet Explorer. Zawsze przyczyną błędu jest „nieoczekiwane wywołanie metody lub dostępu do właściwości” (ang. “unexpected call to method or property access”). Błąd powstaje, gdy niektóre tablice wielopoziomowe (złożone) próbuje się zamienić na ciąg znaków (w JSFamilii dotyczyło to tablic JSF.navigation oraz record.nearbyCoordinates):

var a;

a = new Array(); // tablica

/* lub */

a = [];

a.push( new Object() ); // obiekt w tablicy

/* lub */

a.push( { wlasciwoscObiektu:”wartosc” } );

try {

a.toString(); // ręczna konwersja

/* lub */

a == „tekst”; // autokonwersja przy porównaniu

a != „tekst”;

} catch(e) {

/* czasami powstaje błąd */

}

/* niezależnie od konwersji, dostęp do tablicy nadal jest możliwy */

a.length;

a[0];

a[1].wlasciwoscObiektu;

typeof a.push == „function”;

//itd. (wszystko zadziała, poza toString)

Niestety nadal nie wiem jaka szczególna cecha wielopoziomowych tablic decyduje, że nie dadzą się zamienić na ciąg znaków. Aby umożliwić porównywanie zmiennych, z których jedna mogłaby być taką tablicą, a druga tekstem, wystarczy jedynie operator porównania zwykłego (comparison) zastąpić porównaniem ścisłym (exact), złożonym z dodatkowego (trzeciego) znaku równości:

a === "porównaj z tekstem";
a !== "tekst";

Błąd dotyczy tylko IE, natomiast identyczne instrukcje w Firefoksie nie wywołują żadnych błędów.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *