2015-08-10 20 views
7

Oggi ho ricevuto errore utilizzando Object.keys perché accidentalmente ho superato il valore dell'oggetto non in questo modo:comportamento Object.keys in cromo e IE 11

var filter = true; 
var filterKeys = Object.keys(filter); 

In Chrome questo funziona bene, ma in IE 11 ho ottenuto un'eccezione e dopo il debug ha rilevato che in IE 11 Object.keys lanciava un'eccezione Object.keys: l'argomento non è un oggetto.

In questa situazione, IE11 si è comportato meglio perché value true non è realmente valido, ma chrome ha restituito array vuoto. Object.keys è ECMAScript standart e se si guarda a http://www.ecma-international.org/ecma-262/5.1/#sec-15.2.3.14 si dice:

  1. Se il tipo (O) non è oggetto, un'eccezione TypeError.

Così Qualcuno sa perché implementazione di Google Chrome non si comporta come nella specifica standard ECMAScript, perché ho sempre pensato che tutti i browser moderni dovrebbero attuare ECMAScript a comportarsi nello stesso modo.

+1

Vedere https://code.google.com/p/v8/issues/detail?id=3443#c1, anche https://bugzilla-dev.allizom.org/show_bug.cgi?id=1038545j. –

risposta

4

Così fa chiunque sapere perché l'implementazione di Google Chrome si comporta come in ECMAScript

Dipende dalla versione di ECMAScript implementata dal browser.

In ECMA-262 ed 6 (lo standard corrente) il primo passo è:

  1. Let obj tramite ToObject (O)

In ES5, il primo passo è:

  1. Se il T ype (O) non è Object, genera un'eccezione TypeError.

Così si può dire che Chrome è coerente con Ed 6 (converte il primtive vera a un oggetto Boolean) e IE con ES5 (esso genera un'eccezione TypeError), e quindi entrambi sono compatibili con diverse versioni dello standard.

2

n questa situazione IE11 si è comportata meglio perché value true non è realmente valido, ma chrome ha restituito array vuoto. Object.keys è standart ECMAScript e se si guarda http://www.ecma-international.org/ecma-262/5.1/#sec-15.2.3.14 si dice:

Se il Tipo (O) non è Oggetto, genera un'eccezione TypeError.

ES5 è vecchio

leggere le specifiche ES6 e vedrete Internet Exploder è il browser che sta facendo il vecchio modo (Chrome e Firefox farlo bene)

http://www.ecma-international.org/ecma-262/6.0/#sec-object.keys

nota: IE12 (o qualunque sia l'abominio chiamato in Windows 10) fa il modo ES2015

+2

"Wrong" è relativo a quale versione di ES viene rivendicata. AFAIK, Chrome non pretende di implementare ES6, a parte alcune funzionalità, parzialmente. Nella misura in cui Chrome afferma di implementare ES5, il suo comportamento potrebbe infatti essere interpretato come errato. –

+0

scusa, modificato per rimuovere l'insaccamento percepito da microSnot –

Problemi correlati