Мне кажется, я слишком метафоричен и загадочен с предыдущим ответом. Уточнение следует.
Экземпляр Array, Boolean, Date, Function, Number, RegExp, String является объектом, но с добавлением методов и свойств, специфичных для каждого типа. Например, массив имеет предопределенное length
свойство, а универсальные объекты - нет.
javascript:alert([].length+'\n'+{}.length)
отображает
0
неопределенный
По сути, интерпретатор FF Gecko также различает массивы и общие объекты с четкими различиями при оценке языковых конструкций.
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);
отображение
раз два три
[Объект Object]
["раз два три"]
4 .toSource () забыл меня!
3 и моя длина!
({0: "один", 1: "два", 2: "три", a: 4})
и 0 1 2 a
и 0 1 2 a
.
Что касается утверждения, что все объекты являются функциями:
Ни синтаксически, ни семантически не корректно использовать произвольный экземпляр объекта в качестве функции, такой как 123()
or "abc"()
or []()
or {}()
or obj()
where obj
является любым типом, кроме Function
, поэтому произвольный объект INSTANCE не является a Function
. Однако, учитывая объект obj
и его тип Array, Boolean, Date, ...
, как оно obj
появилось Array, Boolean, Date, ...
? Что такое Array, Boolean, Date, ...
?
javascript:
alert([Array, Boolean, Date, Function,
Number, Object, RegExp, String] . join('\n\n') );
отображает
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]
}
В каждом случае, без двусмысленности, тип объекта проявляется как function
определение, отсюда и утверждение, что все объекты являются функциями! (Ирония в том, что я намеренно скрыл и размыл различие между экземпляром объекта и его типом! Тем не менее, это показывает, что «у вас не может быть одного без другого», объекта и функции! Заглавные буквы подчеркивают тип как в отличие от экземпляра.)
И функциональная, и объектная парадигмы кажутся фундаментальными для программирования и реализации встроенных примитивов низкого уровня интерпретатора JS, таких как Math
и JSON
и true
.
javascript:alert([Math, JSON, true.toSource()].join("\n\n"));
отображает
[object Math]
[object JSON]
(new Boolean(true))
Во время разработки Javascript в моде был объектно-ориентированный стиль программирования (ООП - стиль объектно-ориентированного программирования - «s» - это мой собственный каламбур!), И интерпретатор был также назван Java, чтобы придать ему большее доверие. . Методы функционального программирования были отнесены к более абстрактным и эзотерическим экзаменам, изучающим теории автоматов, рекурсивных функций, формальных языков и т. Д., И как таковые не были приемлемыми. Однако сильные стороны этих формальных соображений явно проявляются в Javascript, особенно в том виде, в котором они реализованы в движке FF Gecko (т.е. .toSource()
).
Определение объекта для функции особенно приятно, так как оно определено как рекуррентное отношение! определяется с использованием собственного определения!
function Function() { [native code] }
и поскольку функция является объектом, то же самое относится и к
function Object() { [native code] }
.
Большинство других определений стабилизируются до статического конечного значения. Однако eval()
это особенно мощный примитив, поэтому String также может включать произвольные функции.
Еще раз обратите внимание, что используемый выше жаргон скрывает различие между типом объекта и экземпляром.