2009-04-01 4 views
6

Ich bin auf der Suche nach einer Präsentation in ein paar Wochen und fragte mich: Was sind die Top-Ten-Javascript-Inkompatibilitäten, die Sie bei der Entwicklung suchen? Was stolpert dich aus?Javascript Inkompatibilitäten/Inkonsistenzen

var somevar = { 
'internet': 'explorer', 
'hates': 'trailing', 
'commas': 'in', 
'json': 'code', // oh noes! 
} 

Was sind einige andere typische Hinweise, die nicht oder behoben werden, nicht durch ein Framework wie jQuery oder Base: Ich kann mit einem anfangen?

+0

Was ist der Haken im obigen Code? –

+0

Das abschließende Komma (nach 'code') kann in einigen Browsern vorhanden sein, nicht in anderen. – Thilo

+0

Das kann PHP-Entwickler stolpern, die JavaScript wie ich lernen, da ich mich daran gewöhnt habe, dass PHP immer das letzte Komma akzeptiert. – thomasrutter

Antwort

3

var = neu Boolesch (falsch); if (x) ... sonst ...;

Wird der Zweig 'if' oder 'else' genommen?

var x = "hi", y = neu String ("hi");

Was ist der Typ von (x) und typeof (y)?

Edit: ..

parseInt ("017") produziert 15 (oktal) anstelle von 17

Der 'Fehler' Objekt eine andere Signatur von IE auf Firefox ist.

Wenn Sie Objekte als Hashmaps verwenden, müssen Sie object.hasOwnProperty (key) verwenden, um sicherzustellen, dass die Eigenschaft nicht über die Prototypkette vererbt wird.

+1

Wo sind die Javascript-Inkompatibilitäten? –

+0

Diese Antwort liefert nicht nur Inkonsistenzen zwischen Browsern, sondern liefert auch die meisten Inkonsistenzen in der Sprache. – cgp

7

Mit HTML-Markup wie

<div id="foo"> 
    <a href="#">Link 1</a> 
</div> 

Wenn Sie einen Verweis auf das äußere div erhalten, wird es ein Kind-Knoten in einigen Browsern haben, und drei untergeordneten Knoten in anderen, je nachdem, wie Leerzeichen behandelt wird. Einige haben Textknoten mit dem Newline- und dem Whitespace als untergeordnete Elemente von div#foo vor und nach dem Verknüpfungselement.

+0

zum Glück, das ist etwas, auf das sich Bibliotheken wie prototype.js verlassen. – Thilo

+0

Ich bin nicht sicher, ob eine Bibliothek alle Situationen bewältigen kann, da das Parsen von Leerzeichen in das DOM in Browsern nicht konsistent ist, was meiner Meinung nach der Punkt war. (Es gibt einen Datenverlust, der nicht ersetzt werden kann) Ich werde es später in einigen Browsern versuchen, zu verifizieren. – cgp

+0

Mehr von einem DOM-Problem als ein JS, aber JS ist ziemlich konsistent beim Durchlaufen des DOM – annakata

0

Es gibt nahezu keine Inkonsistenzen in den JavaScript-Implementierungen in allen Browsern. Wenn es welche gäbe, wäre es ein Alptraum multipliziert (durch die zahlreichen Inkonsistenzen bei der DOM-Implementierung). So können "Top Ten Javascript Inkompatibilitäten/Inkonsistenzen" wahrscheinlich nur mit "Bottom One" gefüllt werden. Tatsächlich könnte es ein Paar mehr geben, aber ich würde kaum erwarten, dass sie groß oder sogar Aufmerksamkeit wert sind.

0

DOM API Ungereimtheiten beiseite (was Bibliotheken lösen), gibt es nicht viele.

Aber einige JS-Engines haben more features implementiert, wie [] .map(), [] .filter() etc, let Anweisung oder E4X. Wenn ich zwischen der Mozilla-spezifischen Entwicklung (Firefox-Erweiterungen, serverseitig mit Jaxer) und der allgemeinen Browserentwicklung (Webseiten) wechsle, muss ich mir merken, was in jedem Browser verfügbar ist und was nicht. Es geht also um was implementiert ist, nicht wie es ist getan.

6

Nun, es gibt ein Problem mit implizierten Semikola.

return { 
    a: 1, 
    b: 2 
} 

Einige Leute mögen Klammern auf seine eigene Linie, wie diese zu öffnen:

return 
{ 
    a: 1, 
    b: 2 
} 

Doch diese letzte Aussage wird undefined zurückkehren, da der Parser sieht:

x
return; 
{ 
    a: 1, 
    b: 2 
} 
+0

Das ist ein wirklich gutes. – meandmycode

+1

Aber ist es eine Inkompatibilität? – reinierpost

+0

Nein, es ist eher eine Frage. Es gibt nicht viele Inkompatibilitäten in JS mehr. Das DOM ist der Schuldige. – Magnar

2

Ein anderes (glaube nicht, das sehr oft kommt):

(typeof document.getElementById) 

in IE: "Objekt"

in Firefox: "Funktion"

0

Für das Date-Objekt:

alert((new Date()).getYear(); 

Firefox gibt 109

Internet Explorer gibt 2009 zurück

0
alert(document instanceof Document) 

in Firefox: wahr!

in Internet Explorer: Ausnahme: Dokument ist nicht definiert

0

Eine Erweiterung altCognito den Punkt .. Element nicht ein definierte Basistyp ist entweder ...

//uses jQuery 
function getSomething(input) { 
    if (typeof(input) == string) 
     input = $(input)[0] || $('#'+input)[0] || null; 

    if (input instanceof Element) 
     input = $(input); 

    if (input instanceOf jQuery) { 
     ...do something... 
    } 
} 

ich das instanceOf Element zu ersetzen hatte mit ..

if (input && input.tagName)... 

Wäre nett, wenn DOM-Elemente ordnungsgemäß in IE rundum klassifiziert wurden.

Verwandte Themen