2012-01-01 19 views
10

Aquí hay una pregunta en JavaScript a continuación:¿Por qué "foo" .toString() no es lo mismo que toString.call ("foo")?

// Tested via Google Chrome console. 
var toString = Object.prototype.toString; 

"foo".toString(); // "foo" 
toString.call("foo"); // [object String] 

[].toString(); // "" 
toString.call([]); // [object Array] 

{}.toString(); // syntax error 
toString.call({}); // [object Object] 

Por qué el resultado de toString es diferente con toString.call()?

ACTUALIZADO

String.prototype.toString.call("foo"); // "foo" 
Object.prototype.toString.call("foo"); // [object String] 

Está String.prototype.toString no de la cadena de prototipo como el de abajo?

toString en String [no encontrado] -> toString en String.prototype [not found]

      --> toString in Object.prototype[found] 
+0

un experto en javascript, pero yo sospecho que tiene que ver con llamar a una función predefinida y haciéndola pasar un parámetro nulo en lugar de llamando a una función en un objeto inexistente. – bdares

+0

¿Cómo se inspeccionan esos resultados? Consola del navegador, o algo más? –

+0

@ShadowWizard Consola de navegador Chrome. –

Respuesta

16

String.prototype.toString reemplaza Object.prototype.toString. No son la misma función.

Desde el specification of String.prototype.toString:

devuelve este valor de cadena. (Tenga en cuenta que, para un objeto String, el toString método pasa a devolver el mismo que el método valueOf.)

Y Object.prototype.toString:

Cuando el toString método es llamada, se siguen los siguientes pasos:

  1. Vamos O ser el resultado de llamar a ToObject pasando el este valor como argumento.
  2. Vamos clase sea el valor de la [[] Clase] propiedad interna de O.
  3. Return el valor de cadena que es el resultado de la concatenación de las tres cuerdas "[Objeto", clase, y "]".

matrices se comportan similares, también anulan toString():

> [1,2].toString() 
    "1,2" 
No
4
>>> String.prototype.toString.call("foo") 
"foo" 

objeto no es lo mismo que una cadena.

+0

¿Es correcto que el método ** toString ** de String sea de 'String .__ proto__'? Y 'String .__ proto__' debe ser' Object', entonces ¿por qué ** toString ** en String no es igual a ** toString ** en Object? –

+1

Sí, pero String anula Objetos toString para mostrar una impresión más amigable que solo [Objeto X]. Si no anuló el valor predeterminado de String, su pensamiento sería correcto. –

-1

La función global toString es diferente a la función object.toString(). Según this source, la función global toString no está muy bien definida y, por lo tanto, está mal implementada en diferentes navegadores. Básicamente, proporciona una funcionalidad similar al operador typeof.

+0

al que se refiere el TOString OP no es el "toString global" no bien definido, pero está muy bien definido como "var toString = Object.prototype.toString" por el OP –

+0

Mis ojos deben haber pasado por esa primera línea de código . Disculpas – Jivings

Cuestiones relacionadas