Ich denke, ich auch metaphorisch und kryptisch mit vorheriger Antwort. Erläuterung folgt.
Eine Instanz von Array, Boolean, Datum, Funktion, Zahl, RegExp, String ist ein Objekt, aber mit spezifischen Methoden und Eigenschaften für jeden Typ erweitert. Zum Beispiel hat ein Array eine vordefinierte length
Eigenschaft, während generische Objekte dies nicht tun.
javascript:alert([].length+'\n'+{}.length)
Displays
0
undefined
Eigen unterscheidet die FF Gecko-Interpreter auch zwischen Arrays und generischen Objekten mit deutlichen Unterschieden Sprachkonstrukte zu bewerten.
javascript:
ra=[ "one", "two", "three"]; ra.a=4;
ob={0:"one", 1:"two", 2:"three"}; ob.a=4;
alert(
ra +"\n\n"+
ob +"\n\n"+
ra.toSource() +"\n\n"+
ra.a +"\t .toSource() forgot me! \n\n"+
ra.length +"\t and my length! \n\n"+
ob.toSource());
ps=""; for(i in ra)ps+=i+" "; alert(ps); /* NB .length is missing! */
ps=""; for(i in ob)ps+=i+" "; alert(ps);
Anzeigen
one,two,three
[object Object]
["one", "two", "three"]
4 .toSource() forgot me!
3 and my length!
({0:"one", 1:"two", 2:"three", a:4})
und 0 1 2 a
und 0 1 2 a
.
Die Aussage betreffend, dass alle Objekte sind Funktionen:
Es ist weder syntaktisch noch semantisch korrekt andere eine beliebige Objektinstanz als eine Funktion wie 123()
oder "abc"()
oder []()
oder {}()
oder obj()
wo obj
ist jede Art zu verwenden, als Function
, so ein beliebiges Objekt INSTANCE ist kein Function
. Jedoch, wenn ein Objekt obj
und sein Typ wie Array, Boolean, Date, ...
gegeben wird, wie ist obj
zu einem Array, Boolean, Date, ...
geworden? Was ist ein Array, Boolean, Date, ...
?
javascript:
alert([Array, Boolean, Date, Function,
Number, Object, RegExp, String] . join('\n\n'));
Displays
function Array() {
[native code]
}
function Boolean() {
[native code]
}
function Date() {
[native code]
}
function Function() {
[native code]
}
function Number() {
[native code]
}
function Object() {
[native code]
}
function RegExp() {
[native code]
}
function String() {
[native code]
}
In jedem Fall ohne Zweideutigkeit, manifestiert sich der Objekttyp als function
Definition, damit die Aussage, dass alle Objekte Funktionen sind! (Die augenzwinkernde ist, dass ich absichtlich die Unterscheidung einer Objektinstanz mit der ihres Typs verdunkelt und verschwommen habe! Dennoch zeigt dies, "Sie können keine ohne die andere haben", Objekt und Funktion! Großschreibung betont Typ als im Gegensatz zu ein.)
Sowohl ein funktionales Objekt und Paradigma der Programmierung zu sein scheinen grundlegende und Umsetzung der Interpreter JS niedrigen Pegel Einbau-Primitiven wie Math
und JSON
und true
.
javascript:alert([Math, JSON, true.toSource()].join("\n\n"));
Displays
[object Math]
[object JSON]
(new Boolean(true))
Zum Zeitpunkt der Entwicklung von Javascript, ein Objekt-zentrierte Programmierstil (OOP ist - Programmierung Stil Oriented Object - das "s" mein eigenes Wortspiel ist !) war in Mode und der Interpreter wurde in ähnlicher Weise mit Java getauft, um es glaubwürdiger zu machen. Funktionale Programmiertechniken wurden auf abstraktere und esoterische Untersuchungen beschränkt, die die Theorien von Automaten, rekursiven Funktionen, formalen Sprachen usw. untersuchten und daher nicht so schmackhaft waren. Die Stärken dieser formalen Überlegungen zeigen sich jedoch deutlich in Javascript, insbesondere in FFs Gecko-Engine (z. B. .toSource()
).
Die Objektdefinition für Funktion ist besonders befriedigend, da sie als Rekursionsbeziehung definiert ist! definiert mit eigener Definition!
function Function() { [native code] }
und da eine Funktion ist ein Objekt das gleiche Gefühl für
function Object() { [native code] }
hält.
Die meisten anderen Definitionen werden auf einen statischen Endwert gesetzt. Allerdings ist eval()
ein besonders leistungsfähiges Primitiv und so kann ein String auch beliebige Funktionalität einbetten.
Beachten Sie erneut, dass die oben verwendete Umgangssprache den Objekttyp und die Instanzunterscheidung verdeckt.
myArray.length gibt einen numerischen Index/Schlüssel des letzten Elements im Array zurück, aber nicht die tatsächliche Anzahl der Elemente. Sind Eigenschaften des Array-Objekts nicht dieselben wie Array-Werte? –
Ich habe gerade versucht zu veranschaulichen, die beabsichtigte Semantik des Array-Objekts missbraucht werden, wenn Sie es einfach wie ein normales Objekt behandeln. Der verlinkte Artikel macht aber einen besseren Job :) –
Das nächste Mal, wenn jemand sagt, dass JavaScript eine gute Sprache ist, mit der ich mich weiterentwickle, zeige ich ihm dieses Beispiel. Vielen Dank. –