Oggi mi è capitato di avere troppo tempo per uccidere e ho giocato un po 'con la linea di comando Node (v0.10.13):Perché le primitive JavaScript non sono instanceof Object?
> 1 instanceof Object
false
> (1).__proto__
{}
> (1).__proto__ instanceof Object
true
> (1).__proto__.__proto__ === Object.prototype
true
Ora, secondo MDN, ciò che fa è instanceof
:
L'operatore instanceof verifica se un oggetto ha nel suo prototipo la proprietà prototipo di un costruttore.
Ma chiaramente Object.prototype
IS nel prototipo di catena 1
. Allora, perché 1 instanceof Object
è falso? Forse perché lo 1
non è un oggetto primitivo per cominciare?
Va bene, accetto che, e l'ho fatto più test:
> (1).__proto__ === (2).__proto__
true
> 'a'.__proto__ === 'b'.__proto__
true
> (1).__proto__ === 'a'.__proto__
false
> (1).__proto__.__proto__ === 'a'.__proto__.__proto__
true
> (1).__proto__.type = 'number'
'number'
> 'a'.__proto__.type = 'string'
'string'
> (2).type
'number'
> (1.5).type
'number'
> 'b'.type
'string'
Quindi, apparentemente tutte le primitive numero ereditano da un oggetto, e tutte le primitive stringa ereditare da un altro oggetto. Entrambi questi 2 oggetti ereditano da Object.prototype
.
Ora la domanda è: se numeri e stringhe sono considerati primitivi, perché ereditarli da altri oggetti? Oppure inversamente, poiché ereditano da altri oggetti, perché non considerarli anche loro oggetti? Sembra assurdo che il figlio di un oggetto non sia un oggetto ..
A proposito, ho anche provato questi in Firefox 22 e ho ottenuto lo stesso risultato.
Grande risposta, grazie. –
Tutti i miei +1 vanno da te! – Greg
Myne 2 .... :-). –