Durante el proceso de escritura del programa JavaScript, JS convertirá automáticamente el objeto en número o cadena y luego lo procesará de acuerdo con diferentes contextos. Las reglas para esta conversión automática son las siguientes:
La regla para convertir automáticamente el objeto a cadena:
1. Si el objeto pertenece a la clase anula el método toString (), se llama al método. Si el resultado de retorno de la llamada toString () es primitiva (cadena, número, booleana, indefinida, nula), el valor primitivo se convierte en cadena y se devuelve.
2. Si el método toString () no está anulado por la clase toString (), el resultado de retorno de la llamada toString () es "[objeto de objeto]"; o el método toString () se anula, pero el método devuelve el resultado como un objeto. Entonces JS llamará al método valueOf () del objeto. Si el resultado de retorno de la llamada valuef () es primitiva (cadena, número, booleana, indefinida, nula), luego convierta el valor primitivo en cadena y return.
3. Si ninguno de los puntos anteriores se cumple y el valor primitivo no se puede obtener llamando al método toString () o valueOf () del objeto, entonces JS lanzará un error TipoError.
La regla para convertir automáticamente el objeto al número:
1. Llame al método valuef () de objeto. Si se obtiene el valor primitivo, convierta el valor primitivo en número y devuélvalo.
2. Si el valor primitivo no se puede obtener del método valueOf (), entonces llame al método toString () del objeto; Si toString () devuelve un valor primitivo, luego convierta el valor primitivo en el número y return.
3. Si ninguno de los dos puntos anteriores no se puede cumplir, JS lanzará un error TipoError.
Se puede ver que las reglas para convertir automáticamente el objeto en cadena y objeto a número son en realidad las mismas. La diferencia es el método de orden de llamada toString () y valueOf ().
De acuerdo con las reglas anteriores, algunos resultados de conversión pueden entenderse bien:
1. Para las matrices vacías, al convertirlas en número, el resultado es 0. Esto se debe a que el método de matriz valueOf () se llamará primero. Dado que valueOf () devuelve el objeto de matriz en sí, JS llamará a continuación el método toString () de la matriz vacía; Debido a que el resultado de la matriz vacía toString () vuelve a una cadena vacía, la cadena vacía eventualmente se convertirá a un número 0 y se devolverá.
2. Para una matriz con solo un miembro de un número, aplique la misma regla para convertirla en un número, y el resultado final es el número.
3. Para matrices con múltiples miembros numéricos, dado que la cadena no se puede convertir en número, el resultado final es NAN.
¿Cuándo convertir a cadena? ¿Cuándo convertir a número?
Al realizar una conversión de tipo automático en un objeto, JS elegirá convertirlo en cadena o número según el tipo de objeto y el operador. Las reglas específicas son las siguientes:
1. Si aparece un objeto en ambos lados del operador +, convierta el objeto en una cadena.
2. Todos los objetos (excepto los objetos de fecha) se convertirán en número primero.
3. Para objetos de fecha, la prioridad se convierte en cadena.
Vale la pena señalar que para el operador +, excepto el caso donde los objetos o cadenas aparecen en ambos lados del operador, el funcionamiento de "Convertir al número" se realiza en otros casos. Al mismo tiempo, esta operación también está relacionada con el orden entre valores.
experimento
La copia del código es la siguiente:
console.log (3 * []); // 0
console.log (3 * [2]); // 6
console.log (3 * [1,2]); // nan
console.log (3 + [2]); // 32
var ahora = nueva fecha ();
console.log (ahora + 1); // miércoles 26 de marzo de 2014 10:51:39 GMT + 0800 (CST) 1
console.log (ahora - 1); // 1395802299223
console.log (ahora * 2); // 2791604598448
console.log (true + true); // 2
console.log (2 + nulo); // 2, nulo se convierte en 0
console.log (2 + indefinido); // nan, indefinido se convierte en nan
console.log (1 + 2 + "gatos"); // 3 gatos
console.log (1 + (2 + "gatos")); // 12 gatos