Pull to refresh

Comments 106

вот собственно вторая часть, жду материал для «работы над ошибками», я не мастер JS, но вместе думаю, у нас получится нормальный набор заметок. Еще хотел бы услышать предложения, опять же я не мастер писать статьи, хотелось бы услышать конструктивную критику
> ypeof( [] ) // 'object' — да, массив он назовет обьектом (как их различить будет дальше),
не нашёл…
«дальше планируются… поподробней разберемся с объектами»
вообще у массива конструктор — Array
[].constructor === Array
Array в каждом фрейме свой.
массив, созданный в одном фрейме не пройдёт эту проверку в другом.
я не знал, посмотрю как избавиться от этого
да, Вы правы, где переменную взяли там и массив надо смотреть
habrahabr.ru/blogs/javascript/55799/#comment_1496675
с прикладной точки зрения, с .concat'ом тоже можно не заморачивать, хоть по спеке объекты могут иметь в качестве [[Class]] любое значение, я не знаю, какая из реализаций на это пойдёт; поэтому проверки с toString'ом Object.prototype'а должно хватить
не понял о0 покаж код
function isArray(object) {
return Object.prototype.toString.call(object) === '[object Array]';
}

isArray([]) // true
сериализовывать весь массив — это как бы жестковато. лучше уж конкат.
этот способ тоже не работает при условии что переменная из другого фрейма, надо тоже проверять Array того фрейма где взяли переменную
это ветка обсуждения…
Пара замечаний:
1. В массив можно записывать значения по строковому ключу, как и в объект по индексу.
2. Массив от объекта отличается наличием свойства length, причём элементы, записаные в массив по строковому ключу не считаются, отличить массив от объекта можно следующим образом
objOrArr.length === undefined //true для объекта

3. Стандартный for each перебирает только те элементы, которые были явно записаны в массив/объект
var arr = [];
var i = 0;
arr["somekey"] = "some data";
arr[34] = "some other data";
for each (value in arr) {
i++;
}
//здесь i == 2
А что у объекта не может быть свойства length?

var objOrArr = {length: 10};

Массив это и есть объект, так же как и функция.
var object = {
  push: [].push
};

object.push(1);
object.push(2);
alert(object.length);
Внезапно хитрецы, тысячи их! :)

Я думаю можно даже книгу написать «1000 и один способ обмануть самого себя.», хотя, я уверен, есть ситуации когда ваш код будет полезен, но нужно быть готовым к множественным полтергейстам, особенно при использовании сторонних библиотек.
> arr[«somekey»] = «some data»;

только стоит помнить, что ключи-не-индексы массива (числа, приведённые к строе) не воздействуют на .length
в массив неправильно писать значения с текстовым ключем, вообще можно все, но есть какие-то правила, вообще можно и из обьекта сделать массив, и из массива обьект, но смысл?
Например заказ со списком товаров.
Даже если этим не пользоватся, лучше это знать, чтобы не воспользоваться этим случайно. Извиняюсь за каламбур.
в яваскрипте нет числовых ключей. вообще. =(
3… и унаследованные от прототипа
Вы написаил:
var obj = {}; // с помощью JSON

Если мне не изменяет память, такая конструкция называется object literal.
Update:
Вы напиали: var obj = {}; // с помощью object literal (JSON)

Это не JSON. JSON это совсем другое… уберите это слово оттуда…
> удаление переменных:
>… или удалить с помощью оператора delete ( delete someVar; )

Развод и профанация. НЕЛЬЗЯ удалить переменную с помощью delete. Автор, учи матчасть!
Неформатированный поток сумбурных мыслей.
на самом деле это не так просто писать структурированно, понятно и информативно, возможно в дальнейшем и у меня будет получаться доходчиво объяснять то что хочу сказать
Для начала можете научиться начинать предложения с заглавной буквы и заканчивать точкой.
Но это ведь не изменит поток сумбурных мыслей в доходчиво понятную и структурированную статью.
Вы знаете, у меня такое ощущение, что то, о чем вы думали, называется справочником по JS для начинающих. Мой начальник написал такой справочник, только «я не мастер JS» — эт не про него. Цель написания не очень понятна. Поставил себя на место нуба, которому надо быстро найти интересующее решение задачи — я считаю, у него ничего не получится. Вы хотите обсудить с хабрасообществом основы JS? Думаю, не лучшее занятие; )

Попробуйте агрегировать все мысли и замечания к данному топику, да собрать все это в понятную и готовую для использования статью — может, что и получится.
> Вы хотите обсудить с хабрасообществом основы JS? Думаю, не лучшее занятие; )

почему?
В этом есть что-либо нового? Того, что не написано на тысячах сайтов про введение в JS?
Да нет, «новое/одно и тоже на разных сайтах» — понятие относительное. Ну захотел человек писать, пусть пишет, кто-то из новичков может только Хабр и читает — почитают заодно (а в комментариях, помимо своего мнения, уже определит, насколько этот материал был полезен). Фишка в том, что, если кто-то достигает какого-то уровня, ему новичковые статьи начинают казаться ерундой, которую не нужно никогда писать (потому что он это уже где-то выучил и знает;)) и он, почему-то, считает долгом это всегда отметить. Только вот загвоздка в том, что это очень и очень относительно. Статьи, которые Вам покажутся не ерундой, кому-то другому могут показаться «уже известными». По-Вашему, он должен Вам это сказать? По сути, если начать придираться, 90% статей на Хабре — может подпасть по гриф «ерунда, которая уже писалась на тысячах сайтов и быстро нагугливается», и что? ;)

Пусть новички пишут; в этом процессе, они сами обучаются.
«Поставил себя на место нуба, которому надо быстро найти интересующее решение задачи»
я ведь не могу описать все задачи которые могут попасться на пути человека, но и без знания того что я написал сложно будет людям справиться с возникшими задачами, да, мануалы есть в инете, я больше пишу для того чтоб меня поправили, я ведь тоже ошибаюсь и не знаю многого, когда тебя носом тычут проще запомнить что-то
Это выпад в сторону преподнесения информации был. Сами же наверное пробовали вникнуть в решение задачи на форумах и в справочниках. Последние отличает четкая структурированность и как следствие простота поиска информации.

Вобщем, если кратко — неудобно пользоваться.
а я вот считаю что как раз отличная статья. и что приятно легким и понятным языком рассказыввается как раз об основах. О ряде вещей, которые многие т.н. «программисты» и понятия не имеют…
Позвольте поинтересоваться, что за программисты такие, что не имеют понятия об основах?
Вы много веб-студий видели, а фрилансеров? Не знаю как на росийском рынке, я наблюдаю только украинский, но где то около половины из тех кто что-то пишет для веба, имеют образование и опыт в лучшем случае программистов, неимеющих понятия об основах, но пытающихся что-то писать. Это в лучшем… Хорошо еще если они пытаются учится и разбиратся.
Возможно я не свсме корерктно назвала этих людей программистами, но тем не менее.
Так. О веб-студиях и фрилансерах не понял. Видел и тех и других, что с ними не так?

Допустим, под рукой оказался фрилансер-недоучка. Плохая работа — непринятая работа, фрилансер останется голодным. Вопрос в стороне, котрая отвечает за прием работы.

Я сам не управляющий, я обычный исполнитель. Везде, где работал были отличные ребята. То, что продукт получался кривой — это проблема с менеджерами, как показывает опыт при умелом руководстве получается качественный продукт.
> То, что продукт получался кривой — это проблема с менеджерами

:) «ну вот, вы видели, сейчас всё и решается, это не креативщикам не хватает идей, просто хорошие идеи идут на помойку...» (С) 99F

В хорошей системе, исполнитель всегда вправе предложить более удобную реализацию идеи, если менеджер — не баран, он её рассмотрит. Поэтому, исполнители тоже играют важную роль в системе.
Естетственно исполнители также важны, как и управленцы. Только вот был очевидцем, когда очень талантливого человека из нашей команды уволили якобы за непродуктивность работы. Объективно он был жертвой отсутствия правильно поставленного ТЗ и хоть сколько-нибудь умеющего управлять менеджера.

Иметь хороший инструмент мало. Нужно уметь им управлять.
А что делать если:
1. Принимающая сторона не в состоянии оценить продукт.
2. В компании вообще нет грамотных специалистов. А те кто есть считают себя самыми крутыми и т.д.?

я не говорю что _все_студии и _все_ фрилансеры идиоты. Я говорю что очень много некачественного продукта написанного кривыми руками хорошие продавцы парят за большие деньги покупателям. А потом этот продукт попатает к другим программистам, те смотрят и говорят — ребят, извините, но это же кашмар какойто, что бы с этим что-то сделать, нужно попросту все переделывать.

Это если утрируя.
А что делать если:
1. Принимающая сторона не в состоянии оценить продукт.
2. В компании вообще нет грамотных специалистов. А те кто есть считают себя самыми крутыми и т.д.?


В таком случае стоит обратиться в консалтинговую компанию. Не зря же их придумали. Ну или если по-простому — то нанять надежного человека на должность консультанта, за разовую работу допустим платить хорошие деньги, чтобы не получалось себе дороже в итоге.

Рынок будет наводнен настолько некачественными предложениями, насколько их смогут протолкнуть продавцы.
мне просто очень часто приходилось сталкиватся с клиентами, которых уже успели хорошо кинуть на некачественном продукте… и помогать решать подобные проблемы.
те кто начинают изучать, я например долго думал что сравнив NaN с NaN я все же могу получить true, или не знал что в разных фреймах разные конструкторы… такие мелочи можно встретить только в каментариях, а при незнании на них напороться очень неприятно
Эффективней прочитать хорошо зарекомендовавшие себя книги, нежели пытаться вылавливать отрывки из тех же книг в комментариях и создавать свой собственный опус. Мое мнение.
посоветуйте пожалуйста хорошо зарекомендовавшей себя литературы в которой описываются мелочи типа тех что я выше привел, буду очень благодарен, в основном на прилавках одни справочники и пособия для начинающих не лучших качеств
Javascript: (Definitive Guide) — все основы есть, определенно рекомендуется к прочтению;
Learning Javascript — хорошая, стоит прочитать;
Professional Javascript for Web Developers — не читал, но собираюсь, по отзывам достойная,
Pro Javascript Techniques — первая половина обязательна к прочтению, учит стилю языка, во второй половине много по практическому применению;
Pro Javascript Design Patterns — лишним не будет;
ну и естетсвенно стандарт языка.

Лично я на дух не воспринимаю русские переводы книг, поэтому от себя рекомендую читать на английском в оригинальной терминологии.

Надеюсь, найдете для себя что-то интересное в этих книгах: )
Вообще, чего это я, вот мнение большинства.
Почему в типах данных нет undefined и null? function — тоже object, хотя typeof и возвращает другое.
И вообще тему поведения typeof можно было раскрыть получше.

typeof undefined — undefined
typeof null — object
typeof function — function
потому что undefined и null скорее значения чем типы данных
Что за бред? Извините, но Вы говорите полную чушь. undefined и null такие же типы данных как и остальные, ecma хоть бы чтоли почитали перед тем как статьи бежать писать.
> undefined и null такие же типы данных как и остальные

undefined и null — это значения, а не типы
Процитирую специально для Вас, раз вы не в курсе:

8.1 The Undefined Type
The Undefined type has exactly one value, called undefined. Any variable that has not been assigned a value has the value undefined.
8.2 The Null Type
The Null type has exactly one value, called null.

Т.е. эти типы данных имеют только одно значение, которое и называется также. А вот что Вы скрываете под каким-то мифическим словом «значения» понятно наверное только Вам.
В Javascript ведь нет типов как таковых, все вычисляется по значению
Лучше сказать, Javascript — слаботипизированный язык, поскольку типы, всё же, есть ;)
Ну сходу — parseInt(), parseFloat(), toString() — не, не метод преобразования типов?
ну да, эти функции меняют значение переменной на нужное, я не говори что типов совершенно нет, их «как таковых» нет, какое значение у переменной такого она «считается» типа… опять же при значении у переменной значения null она отнюдь не типа null, это обьект, да и массив типом то сложно назвать, это тоже обьект, да и функция — хеш, тот же обьект, поэтому я разделяю типы условно
Вы правы — как нам с малых лет изветсно, все в JS является объектами: ) Типы есть вне зависимости от нашего восприятия их, другое дело, что на них далеко не все внимание обращают.
> все в JS является объектами

не всё, есть ещё и примитивы
чем примитивы — не объекты?
С какой точки зрения? формального языка или реализаций? если реализаций — это дело десятое, как они имплементируют сущности. А вообще, примитивы не могут иметь пропертей.
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
как примитив в JS имеет свойства?:) типа «qwe».length а вот у чисел их нет… я интуитивно догадываюсь что в числах "." играет роль разделителя целых и дробных частей, но все же, почему в строках добавили объектную возможность еси это примитив?
> почему в строках добавили объектную возможность еси это примитив?

На самом деле, доступ к свойствам вызывает (см. пункт 5 алгоритма) ToObject. Поэтому каждый раз, когда когда осуществляется доступ к свойству в примитиве, создаётся объект-wrapper, и, после отработки свойства/метода, удаляется.
> а вот у чисел их нет

(1).toString() // «0»

Схематично:

1 -> ToObject(1) -> new Number(1) -> .toString()

У остальных примитивов так же.
Ничем не объекты :)
Простой пример:

var a = 5; // a примитив
a.t = 3;
alert(a.t);

Что выдаст alert?

Undefined. Почему? Потому что а — примитив. Во второй строке он был сковертирован в объект, которому назначили свойство. В третьей строке этот примитив был опять сконвертирован в объект, у которого спросили несуществующее свойство.

Если бы а был объект alert бы выдал 3.

«Знание некоторых принципов освобождает от знания некоторых фактов»©
для тебя наверно является дикостью возможность осознать, что объект вовсе не обязательно должен являться хэш-таблицей?

во второй строке примитивный объект создал комплексный объект. он всегда так делает, когда к нему обращаются как к хэш-таблице, коей он не является.
> примитивный объект создал комплексный объект

Обособленных определений может быть тысячи, для себя можно понимать, представлять тоже как угодно (главное, чтоб это помогало найти путь к правильному пониманию). А формальные определения — есть формальные определения, там всё чётко и (если всё формальный язык описан корректно) — недвусмысленно.

var a = 10;

Примитив? Примитив.

Однако, если обособленно начать придумывать/додумывать, и, как следствие, называть «примитивным объектом», в виду того, что, во-первых, «а» станет свойством, у которых могут быть внутренние атрибуты (например, как здесь — {DontDelete}), т.е. можно представить «а», как объект с со свойством: a.DontDelete = true; но только так, можно ещё тысячу определений придумать (если видишь в этом смысл — пожалуйста).

ps: да и, ничего там примитив не создавал, движок создаёт объект и ставит ему в [[value]] значение примитива.
функции тоже ничего не делают — просто движок интерпретирует их байткод.

переменные, кстати, — тоже объекты, ибо поддерживают интерфейсы «создать», «удалить», «сохранить» и «получить», при этом хранят в себе не только «основное значение», но и всякие флаги. а также они являются неявными параметрами замкнутых на них функций.
важно понимать разницу между «объекты из ооп» и «экземпляры одноимённого встроенного класса».

а то потом рождаются определения в духе «объект — это экземпляр класса» о_0
переменные, кстати, — тоже объекты, ибо поддерживают интерфейсы «создать», «удалить», «сохранить» и «получить», при этом хранят в себе не только «основное значение», но и всякие флаги. а также они являются неявными параметрами замкнутых на них функций.


Ну так я и повторю — умозрительно, и догадками — можно хоть как это видеть (см. пример с 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 = new Number(1),

или примитивами: var a = 1;
dsCode всё правильно написал. Если хотите называть примитивы примитивными объектами, флаг вам в руки — только запутаете себя и других.
а вас не путает, что typeof null === 'object'?
а typeof вообще вычисляется согласно захардкоженной таблице ;)
знание внутренней реализации мешает тебе сопоставлять факты…

null — это объектная ссылка указывающая на априори недоступную область памяти.

это примитив, так как не может динамически менять своего состояния, но в то же время и специальный объект, ничего не умеющий и ничего не занимающий в памяти.

вот и получается, что в яваскрипте объекты — это ссылки. обычно эти ссылки указывают на хэш-таблицы, но есть и ссылки указывающие в никуда.

тебе нравится такое определение объекта на основе реализации закреплённой в спецификации? мне — не очень.
» null — это объектная ссылка указывающая на априори недоступную область памяти.

null — это примитивное значение типа null. Такое же как «1» или «false».

» но в то же время и специальный объект, ничего не умеющий и ничего не занимающий в памяти.

Откуда такая уверенность, что null ничего не занимает в памяти?

Null Value
The null value is a primitive value that represents the null, empty, or non-existent reference.

Согласно спецификации null не объект, а примитив. Typeof врёт.
ну что значит «врёт»? о0
она делает в точном соответствии со спецификацией. уж не хочешь ли ты сказать, что это спецификация врёт? 0_0''
В спецификации написано для typeof для значения типа А писать «Б» и для значения типа Б писать «Б». Это я называю врать. Чтобы ни говорил typeof, null — это никаким боком не объект. Смотри цитату выше.
Точно так же как и то что typeof function(){} == «function». Я просто знаю, что typeof нагло врёт в этих двух случаях.
ссылка на функцию и объектная ссылка — это две разные сущности. какой бы бред про [[Call]] ни был написан в спецификации…
Ну вот мы пришли к тому, что в спецификации написан бред.
Я, к сожалению, не могу обсуждать вашу модель языка, я не телепат. Я могу только говорить про то, что написано в спецификации.
Null — примитив
Функция — объект

В чём по-вашему разница между функцией и обёктом?
вот именно, что бред. а вы его в упор не видите.
в одном месте написано, что это объект, в другом — что нет.
Ничего подобного. Приведите мне цитату, где написано, что null это объект.
> typeof value === 'object'
типом значения является «объект»
Это ваш вольный перевод метода typeof.

typeof function(){} === «function»
В Javascript нет такого типа как function.
Вот что делает typeof:
Return a string determined by Type(Result(4)) according to the following table:
Undefined — «undefined»
Null — «object» (!!!)
Boolean — «boolean»
Number — «number»
String — «string»
Object (native and doesn’t implement [[Call]]) — «object»
Object (native and implements [[Call]]) — «function» (!!!)

Почему typeof такая ненадёжная я не знаю, но она такая.

Вот и всё. Тема закрыта.
> Это ваш вольный перевод метода typeof.

это семантика этого _унарного оператора_
она едина для всех языков.

> В Javascript нет такого типа как function.

ru.wikipedia.org/wiki/%D0%A2%D0%B8%D0%BF_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85
развивайте способность к аналитическому мышлению.
Если существует свойство со значением типа 'Undefined', то typeof скажет 'undefined'. Если свойство не существует вообще в природе, то typeof тоже скажет 'undefined'.

Аналитический мыслитель может выбрать одно из двух — или верить typeof, а значит несуществующее свойство существует и у него есть значение, а у того тип… или 'typeof' просто не надо переводить буквально, он показывает не тип, а плюс-минус-тип-а-то-и-не-тип-вовсе…
typeof ничего не знает о свойствах. всё, что справа от него вычисляется как выражение. когда мы делаем запрос к объекту «дай мне значение по такому-то ключу» — он возвращает undefined независимо от того есть у него такой ключ (но значение «неопределено») или нет. в typeof приходит уже само значение undefined.
нет типов переменных, но есть типа значений…
> For( key in obj )

опечатка, for — с маленькой буквы, JS — регистрозависимый.

> или удалить с помощью оператора delete ( delete someVar; )

ну и о delete, уже отметили выше: всем var'ам ставится внутренне свойство {DontDelete}, означающее, что их нельзя удалить посредством delete (исключение составляет лишь контекст eval).
«не виноватая я, он сам пришел»(с) умный ворд, сказал что я не прав, ставя в начале предложения слово с маленькой буквы :(
Sign up to leave a comment.

Articles