2015-05-03 5 views
9

Ho passato con alcuni materiali e non hanno completamente afferrato il concetto, quando si tratta di sintassi come il seguente:Differenza tra Object.prototype.toString.call (arrayObj) e arrayObj.toString()

var arrObj = [1,2,3]; 
Object.prototype.toString.call(arrObj); //Gives "[object Array]" 
arrObj.toString(); // Gives "1,2,3" 

Come sono diverse le linee 2 e 3? Per quanto ho capito, entrambi chiamano il metodo toString con l'oggetto corrente impostato su 'arrObj'.

+1

Questo perché si sta utilizzando il prototipo 'Object'. Sta usando l'array come un oggetto. È necessario utilizzare 'Array.prototype.toString()' – Downgoat

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain – undefined

+1

Si noti che [Object.prototype.toString()] (https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString) restituisce sempre '" [tipo oggetto] "', dove * tipo * è una sorta di tipo nativo dell'oggetto – gengkev

risposta

10

Dal toString è definito in Object.prototype, chi eredita Object, sarà di default ottenere il metodo toString.

Tuttavia, gli oggetti Array sostituiscono il metodo predefinito toString per stampare gli elementi dell'array come stringa separata da virgole.

Object.prototype.toString non sa quale tipo di oggetto effettivamente gestisce. Quindi, è intenzionalmente mantenuto generico e stampa sempre il tipo effettivo dell'oggetto. Questo è il motivo

console.log(Object.prototype.toString.call(arrObj)); 

stampe

[object Array] 

che è il tipo di oggetto passato. Tuttavia, quando si esegue arrObj.toString, si sta tentando di rappresentare l'array nella sua forma String, quindi toString è sovrascritto negli oggetti Array per stampare gli elementi dell'array come stringa separata da virgole.

Ecco perché entrambe le chiamate sono diverse.


Ma in caso di altri oggetti, il toString non è sovrascritto, in modo che useranno il toString dal Object.prototype.toString.Ad esempio,

var obj = { 
    1: 2 
}; 

console.log(obj.toString()); 
// [object Object] 

Leggi l'esempio del MDN di Overriding the default toString method

6

toString è overridden for Arrays; e Object.prototype.toString è diverso da Array.prototype.toString.

per ottenere lo stesso risultato con il call, usarlo sul metodo 'corretto':

Array.prototype.toString.call(arrObj); // Gives "1,2,3" 
0

Questi .call() metodi sono modi hacky per il trattamento di un tipo come un altro. Ad esempio, NodeLists, come matrici con Array.prototype.forEach. Quando lo chiami come oggetto lo "convertirà" in una stringa dell'oggetto

Array.prototype.toString.call(arrObj); 

Funziona perfettamente. Object.toString() sta trattando un po 'stranamente. Immaginate il compilatore fare qualcosa di simile:

[1, 2, 3] -> { 0: 1, 1: 2, 2: 3 }

che restituirà [Object object]. JavaScript, a differenza di altre lingue, troverà sempre una via d'uscita quando si tratta di problemi di tipo.


Se si sta scrivendo una funzione, si potrebbe fare qualcosa di simile:

function myFunction (input) { 
    window[input.constructor.name].prototype.toString.call(input); 
}