переменные, кстати, — тоже объекты, ибо поддерживают интерфейсы «создать», «удалить», «сохранить» и «получить», при этом хранят в себе не только «основное значение», но и всякие флаги. а также они являются неявными параметрами замкнутых на них функций.
Ну так я и повторю — умозрительно, и догадками — можно хоть как это видеть (см. пример с a.DontDelete). Реализации здесь не имеют значения (вообще), там это может быть представленно любыми структурами. Стандарт разделяет примитивы и объекты. При этом, додуманные «интерфейсы» aka «создать», «удалить» и т.д. — это тоже, лишь додумки (не важно, верные или нет в реализациях, поскольку, снова повторю, реализации — дело десятое). Чтобы это не было додумками, надо: во-первых — чтобы формальное описание это подтверждало (а это уже не так) + проанализировать исходники всех реализаций (возможно, там все сущности будут комплексными, а, может, и нет — например, хранится примитивное значение и + какая-нить таблица атрибутов примитивов, тогда при a.DontDelete уже не будет казаться, что «а» — комплексная структура).
Ещё раз:
A primitive value is a datum that is represented directly at the lowest level of the language implementation.
Всё остальное (конкретика реализации) — это мелочи, там это может быть хоть хэш-таблица, обёрнутая в хэш-таблицу, по-барабану.
Обособленных определений может быть тысячи, для себя можно понимать, представлять тоже как угодно (главное, чтоб это помогало найти путь к правильному пониманию). А формальные определения — есть формальные определения, там всё чётко и (если всё формальный язык описан корректно) — недвусмысленно.
var a = 10;
Примитив? Примитив.
Однако, если обособленно начать придумывать/додумывать, и, как следствие, называть «примитивным объектом», в виду того, что, во-первых, «а» станет свойством, у которых могут быть внутренние атрибуты (например, как здесь — {DontDelete}), т.е. можно представить «а», как объект с со свойством: a.DontDelete = true; но только так, можно ещё тысячу определений придумать (если видишь в этом смысл — пожалуйста).
ps: да и, ничего там примитив не создавал, движок создаёт объект и ставит ему в [[value]] значение примитива.
> почему в строках добавили объектную возможность еси это примитив?
На самом деле, доступ к свойствам вызывает (см. пункт 5 алгоритма) ToObject. Поэтому каждый раз, когда когда осуществляется доступ к свойству в примитиве, создаётся объект-wrapper, и, после отработки свойства/метода, удаляется.
С какой точки зрения? формального языка или реализаций? если реализаций — это дело десятое, как они имплементируют сущности. А вообще, примитивы не могут иметь пропертей.
A primitive value is a datum that is represented directly at the lowest level of the language implementation.
An object is a member of the type Object. It is an unordered collection of properties each of which contains a primitive value, object, or function
> То, что продукт получался кривой — это проблема с менеджерами
:) «ну вот, вы видели, сейчас всё и решается, это не креативщикам не хватает идей, просто хорошие идеи идут на помойку...» (С) 99F
В хорошей системе, исполнитель всегда вправе предложить более удобную реализацию идеи, если менеджер — не баран, он её рассмотрит. Поэтому, исполнители тоже играют важную роль в системе.
с прикладной точки зрения, с .concat'ом тоже можно не заморачивать, хоть по спеке объекты могут иметь в качестве [[Class]] любое значение, я не знаю, какая из реализаций на это пойдёт; поэтому проверки с toString'ом Object.prototype'а должно хватить
Да нет, «новое/одно и тоже на разных сайтах» — понятие относительное. Ну захотел человек писать, пусть пишет, кто-то из новичков может только Хабр и читает — почитают заодно (а в комментариях, помимо своего мнения, уже определит, насколько этот материал был полезен). Фишка в том, что, если кто-то достигает какого-то уровня, ему новичковые статьи начинают казаться ерундой, которую не нужно никогда писать (потому что он это уже где-то выучил и знает;)) и он, почему-то, считает долгом это всегда отметить. Только вот загвоздка в том, что это очень и очень относительно. Статьи, которые Вам покажутся не ерундой, кому-то другому могут показаться «уже известными». По-Вашему, он должен Вам это сказать? По сути, если начать придираться, 90% статей на Хабре — может подпасть по гриф «ерунда, которая уже писалась на тысячах сайтов и быстро нагугливается», и что? ;)
Пусть новички пишут; в этом процессе, они сами обучаются.
опечатка, for — с маленькой буквы, JS — регистрозависимый.
> или удалить с помощью оператора delete ( delete someVar; )
ну и о delete, уже отметили выше: всем var'ам ставится внутренне свойство {DontDelete}, означающее, что их нельзя удалить посредством delete (исключение составляет лишь контекст eval).
переменные, естественно, могут быть объектами.
Объектами: var a = new Number(1),
или примитивами: var a = 1;
Ну так я и повторю — умозрительно, и догадками — можно хоть как это видеть (см. пример с a.DontDelete). Реализации здесь не имеют значения (вообще), там это может быть представленно любыми структурами. Стандарт разделяет примитивы и объекты. При этом, додуманные «интерфейсы» aka «создать», «удалить» и т.д. — это тоже, лишь додумки (не важно, верные или нет в реализациях, поскольку, снова повторю, реализации — дело десятое). Чтобы это не было додумками, надо: во-первых — чтобы формальное описание это подтверждало (а это уже не так) + проанализировать исходники всех реализаций (возможно, там все сущности будут комплексными, а, может, и нет — например, хранится примитивное значение и + какая-нить таблица атрибутов примитивов, тогда при a.DontDelete уже не будет казаться, что «а» — комплексная структура).
Ещё раз:
Всё остальное (конкретика реализации) — это мелочи, там это может быть хоть хэш-таблица, обёрнутая в хэш-таблицу, по-барабану.
Обособленных определений может быть тысячи, для себя можно понимать, представлять тоже как угодно (главное, чтоб это помогало найти путь к правильному пониманию). А формальные определения — есть формальные определения, там всё чётко и (если всё формальный язык описан корректно) — недвусмысленно.
var a = 10;
Примитив? Примитив.
Однако, если обособленно начать придумывать/додумывать, и, как следствие, называть «примитивным объектом», в виду того, что, во-первых, «а» станет свойством, у которых могут быть внутренние атрибуты (например, как здесь — {DontDelete}), т.е. можно представить «а», как объект с со свойством: a.DontDelete = true; но только так, можно ещё тысячу определений придумать (если видишь в этом смысл — пожалуйста).
ps: да и, ничего там примитив не создавал, движок создаёт объект и ставит ему в [[value]] значение примитива.
«1»
(1).toString() // «0»
Схематично:
1 -> ToObject(1) -> new Number(1) -> .toString()
У остальных примитивов так же.
На самом деле, доступ к свойствам вызывает (см. пункт 5 алгоритма) ToObject. Поэтому каждый раз, когда когда осуществляется доступ к свойству в примитиве, создаётся объект-wrapper, и, после отработки свойства/метода, удаляется.
:) «ну вот, вы видели, сейчас всё и решается, это не креативщикам не хватает идей, просто хорошие идеи идут на помойку...» (С) 99F
В хорошей системе, исполнитель всегда вправе предложить более удобную реализацию идеи, если менеджер — не баран, он её рассмотрит. Поэтому, исполнители тоже играют важную роль в системе.
return Object.prototype.toString.call(object) === '[object Array]';
}
isArray([]) // true
не всё, есть ещё и примитивы
Пусть новички пишут; в этом процессе, они сами обучаются.
почему?
undefined и null — это значения, а не типы
строке
только стоит помнить, что ключи-не-индексы массива (числа, приведённые к строе) не воздействуют на .length
опечатка, for — с маленькой буквы, JS — регистрозависимый.
> или удалить с помощью оператора delete ( delete someVar; )
ну и о delete, уже отметили выше: всем var'ам ставится внутренне свойство {DontDelete}, означающее, что их нельзя удалить посредством delete (исключение составляет лишь контекст eval).
var object = { push: [].push }; object.push(1); object.push(2); alert(object.length);