Stavo guardando la prima tabella su http://zero.milosz.ca/ e volevo capire perché, ad esempio, 0 == []
e 0 != {}
. Suppongo che sia perché Number([]) == 0
e Number({}) == NaN
. Tuttavia, quella parte sembra arbitraria. Perché una lista vuota è 0
e l'oggetto vuoto è NaN
?Perché Number ([]) === 0 e Number ({}) === NaN in Javascript?
risposta
L'utilizzo di Number(some_object)
utilizzerà la rappresentazione di stringa dell'oggetto specificato. Per i vostri esempi le rappresentazioni di stringa sono:
js> ({}).toString();
[object Object]
js> [].toString();
js>
La stringa '[object Object]'
non può essere convertito in un numero, ma la stringa vuota ''
può.
Ma perché la stringa vuota '''' è stata convertita in 0? – tskuzzy
È piuttosto comune che i valori di falsy vengano convertiti in 0 se utilizzati in un contesto numerico. Gli oggetti vuoti non sono * falsi a proposito. – ThiefMaster
@tskuzzy: Perché è definito in questo modo: * "MV di StringNumericLiteral ::: [vuoto] è 0." *. Vedi http://es5.github.com/#x9.3.1 –
Elaborare un po 'la risposta di ThiefMaster, ho preso uno sguardo in ECMAScript di specifications:
Quando si converte una stringa in un numero, una grammatica viene utilizzato per la conversione. In particolare, il valore matematico di StringNumericLiteral ::: [empty]
è definito come 0. Infatti, è 0 per qualsiasi spazio bianco.
Per coloro che sono troppo pigri per cercare questo nel PDF, http://es5.github.com/#x9.3.1 è la sezione pertinente del spec. – ThiefMaster
Grazie, ho aggiornato il collegamento con la versione HTML ufficiale. – tskuzzy
Quando un valore è un oggetto ([], {}) e l'altro è un numero o una stringa, operator == converte l'oggetto in un valore primitivo (un numero in questo caso) utilizzando i metodi di conversione incorporati che tutti gli oggetti in Javascript ereditano: toString() e valueOf().
Per gli oggetti generici come {}, valueOf viene utilizzato, e per impostazione predefinita restituisce l'oggetto in sé, che è! = 0.
Per gli array built-in, toString viene utilizzato. Questo metodo applicato a un array restituisce una stringa contenente tutti gli elementi uniti da virgole. Per l'array vuoto, restituisce una stringa vuota, ''.
Quindi l'interprete applica valueOf a tale stringa; il valore di ritorno di questo metodo per una stringa vuota è 0, quindi [] == 0.
- 1. Perché Number ('') restituisce 0, mentre parseInt ('') restituisce NaN
- 2. Confronto tra null e number in groove
- 3. Qual è la relazione tra Number e Function.prototype in javascript?
- 4. Prime Number Algorithm
- 5. Oracle Floats vs Number
- 6. Apache POI rows number
- 7. Crappy Random Number Generator
- 8. Parse number with cortana
- 9. ROW NUMBER() OLTRE
- 10. NSThread number su iOS?
- 11. to_char (number) function in postgres
- 12. Divide Long Long Number in percentuale
- 13. RecyclerView number of visible items
- 14. Generics Java e la classe Number
- 15. WMIC Returning Odd Serial Number
- 16. Dimensione memoria Oracle NUMBER (p)?
- 17. Confronto dell'uguaglianza di due numeri utilizzando la funzione JavaScript Number()
- 18. SQL: Differenza tra "BETWEEN" vs "current_date - number"
- 19. Perché ottengo #### nella colonna NUMBER dopo il formato ... Oracle?
- 20. Regex per ottenere NUMBER solo da String
- 21. .NET SqlClient Error Number Enum Type
- 22. Posso eseguire operazioni aritmetiche sulla baseclass Number?
- 23. <input type = "number"> non funziona in IE10
- 24. Consenti 2 cifre decimali in <input type = "number">
- 25. Number(). ToLocaleString() ha un formato diverso in diversi browser
- 26. CALayerInvalidGeometry ', motivo: "I limiti del CALayer contengono NaN: [0 0; nan nan] crash in vista
- 27. perché <input type = "number" maxlength = "3"> non funziona in Safari?
- 28. Come utilizzare M- <Number> per digitare una cifra?
- 29. espressioni regolari per convalidare UK National Insurance Number
- 30. Perché IntegerProperty implementa la proprietà <Number> e non la proprietà <Integer>?
Gli array sono strani come quello. Mi piace '[[[[[[[123]]]]]]]] == 123'. –
@Kolink ... ma cosa fa funzionare? (Quale regola di '==', non trovata in '===', viene applicata?) –
@Kolink: chiami * che * strano? [ '(! [] + []) [+ []] + (! [] + []) [+! + []] + ([! []] + [] [[]]) [+! + [] + [+ []]] + (! [] + []) [! + [] +! + []] === 'fail''] (http://wtfjs.com/2010/07/ 12/fail) – ThiefMaster