En mi opinión, el constructor de números llamará a String([]) por lo que Number([]) es igual a Number("") . Entonces devuelve 0. Además, el constructor de números llamará a String({}) por lo que Number({}) es igual a Number("[object Object]") . Entonces devuelve NaN. Pero no estoy seguro.
Sí tienes razón.
El constructor Number llamará a ToNumeric en su argumento, que luego llama a ToNumber en él, que llama a ToPrimitive en el objeto con una pista de número, lo que da como resultado que se llame a OrdinaryToPrimitive , lo que no
1. If hint is string, then a. Let methodNames be « "toString", "valueOf" ». 2. Else, a. Let methodNames be « "valueOf", "toString" ». 3. For each element name of methodNames, do a. Let method be ? Get(O, name). b. If IsCallable(method) is true, then i. Let result be ? Call(method, O). ii. If Type(result) is not Object, return result. La sugerencia es number , por lo que los nombres de los métodos llamados son primero valueOf y luego (si no existe) toString .
valueOf devuelve el objeto en sí mismo en el caso de un objeto simple, y la matriz en sí misma en el caso de una matriz, por lo que no es de ayuda: pasa a toString .
Array.prototype.toString devuelve los valores de matriz unidos: arr.toString() es equivalente a arr.join(',') . La matriz vacía se une a la cadena vacía. Asi que
Number([])se convierte en
Number('')y así la cadena vacía se convierte en 0.
Pero los objetos, cuando se les llama toString , dan [object Object]
console.log({}.toString());que no se puede convertir en un número, por lo tanto, NaN.