Acest articol este un ciot!
Deosebiri importante intre JavaScript (implementare W3C) si JScript (implementare Microsoft)
Cred că toți programatorii web știu că există două tipuri de browsere: care se conformează cu standardele W3C (printre care Chrome, FireFox, Opera, Safari) și care nu se conformează (în primul rând Internet Explorer sau IE).
Specificațiile nu acoperă toate problemele apărute la implementarea limbajului ECMA-262 (altfel spus - JavaScript) în diferite medii. Pe lângă faptul că nu toate browserele se conformează cu acest standard, divergențe apar și în problemele asupra cărora specificațiile nu se pronunță în vreun fel.
Iată câteva dintre aceste divergențe:
În mediul JavaScript din browser există două clase mari de obiecte: DOM și non-DOM. Obiectele DOM se mai numesc Elemente și fac parte din structura documentului HTML. Obiectele non-DOM sunt toate celelalte obiecte, toate instanțe indirecte sau directe ale Object.
Apare o întrebare firească: Elementele (obiectele DOM) sunt instante ale Object sau nu?
Raspunsul la această întrebare depinde de mediul ales: IE sau non-IE. Elementele se comporta in toate privintele ca niste obiecte obișnuite (non-DOM), având și ceva proprietăți specifice. Deci logic ar fi să fie instanțe ale clasei Object.
Deci, în IE elementele nu sunt instanțe ale Object, și în general nu sunt instanțe ale căreiva clase în sensul că elem instanceof X === false pentru orice element si orice clasa
-
function x() {}; alert(x.name);
Atributul "name" al obiectelor de tip Function nu este un standart ECMA-262, însă a fost introdus de către Mozilla și acceptat de către toate browserele majore, desigur cu excepția IE.
-
var y = function z(){}; alert(typeof z);
În toate browserele typeof z == undefined, iar in IE typeof z == 'function', ceea ce e greșit
-
var s = 'abcd'; alert(s[1]);
s[1] == 'b', în mod normal în toate browserele, cu exceptia IE până la versiunea 8, unde s[1] === undefined.
-
var a = Array.prototype.slice('abcd'); alert(a);
Aceasta este o metodă eficientă de obținere a obiectelor de tip Array din orice obiect ce conține proprietatea 'length' (de ex. String). Cu părere de rău nici în IE8 aceasta nu e o metodă în cazul String. În aces caz recomand 'abcd'.split('');
-
var a = [1, 2, 3, 4, 5]; try{ alert(a.indexOf()); } catch(e) { alert(e.description); }
Obiectele de tip String au metoda indexOf. Însă cele de tip Array în IE nu au, deoarece IE folosește o versiune mai veche de JScript (1.3, ECMA-262 3rd edition).
-
var x = 10; function a(){ return x; try{}catch(x){} }; alert(a());
În browserele W3C a() === 10, însă nu și în IE... Pentru simplul fapt că există catch(x), variabila x este redeclarata in scopul functiei a(), ca și cum am avea declarația: function a(){ var x; return x; };
-
window.b = 1; var b = b || 2;
Nu am cercetat până la urma această situație, dar în unele imprejurări b == 2, deși ar trebui sa fie 1. Am avut o situație în care prima instrucțiune se efectua într-un fișier JS, iar a doua în alt fisier JS și am obținut efectul nedorit (în IE).