RSS

Прокоментируй статью, хотя бы пару слов!

Комментарии:

  • #1avatar

    Алексей

    30.12.2011 13:50:37

    Небольшая опечаточка получилась  alert(a['вася')); правильно будет alert(a['вася']);

  • #2avatar

    Елена Лунная

    30.12.2011 14:33:50

    Спасибо, поправила. Сама статья-то как?

  • #3avatar

    Алексей

    07.01.2012 11:17:31

    Статья то полезная, жаль только времени нет детально прочитать и вникнуть. 

  • #4avatar

    Елена Лунная

    07.01.2012 11:25:57

    Сейчас составляю список рекомендованных статей других авторов, вот что действительно займёт ваше время! =)

  • #5avatar

    SelenIT

    27.01.2012 03:43:57

    Раз уж сами попросили, немного покритикую:

    Объект — это массив, который может...
    Попытка адаптировать JS для PHPшников? ;) Если держаться фактов, то в JS наоборот: массив — это объект, обвешенный свойством length и пачкой методов типа join, sort и map. А объект, по спецификации — просто неупорядоченный набор свойств, контейнер для свойств. А свойства могут быть числами, строками, другими объектами, массивами, функциями — чем угодно (в этом одна из составляющих мощи и гибкости JS).
    Число — или строковая переменная — не называются сами по себе объектами! Но по факту — являются ими.
    Строго говоря, не являются — но позволяют обращаться к себе как к объекту (соотв. типа), для чего на время надевают его "личину" (по факту интерпретатор обращается не к самому числу или строке, а к результату неявного вызова new Number/String() с ними в качестве параметров). Вот наскоро накинутый пример, что чем является (обратите внимание на забавность с null-ом:).
    a= [1:'something', 2:'something']; — верна
    Триста пардонов, но в каком чудо-браузере работает такой синтаксис? ;)  FF9 и IE7-9 в один голос ругаются на отсутствие "]" после единицы (и поделом — выражение инициализатора массива, в отличие от инициализатора объекта, двоеточия не распознает).

    Другое дело, что, поскольку массив является также и объектом (а не наоборот!), ничто не мешает навесить ему любое свойство после создания. Однако "внутрь" массива они не попадают, на свойстве length не сказываются — они прячутся у него под внешней оберткой, дающей ему "массивную" специфику, в самой его "объектной" сердцевине. Так же можно делать со всеми наследниками Object-а — и с функцией, и с HTML-, точнее, DOM-элементами, и со встроенными объектами типа Math и Date — в этом они равноправны.

    Есть мнение, что, раз уж мы ратуем за чтение спецификаций, есть смысл отталкиваться прежде всего от них, а не на сомнительные аналогии из других языков/парадигм;). И так бедняга JS столько долгих лет был СНЯПМом... Тем более что сейчас спецификация наконец стала относительно годной (и доступна и на русском, пусть и не последняя редакция, зато в хорошем переводе:).

  • #6avatar

    SelenIT

    27.01.2012 03:53:06

    Да, и вдогонку, к названию и эпиграфам — еще одна подобная фразочка в коллекцию :) И там по ссылкам внизу еще кое-что такое.

  • #7avatar

    Елена Лунная

    27.01.2012 05:45:32

    Нет... наоборот, это попытка объяснения сущностей как они есть, с нуля. Аудитория статьи - начальные пользователи.  Т.е. конечно аудитория это знатоки и эксперты, но описывается именно методология преподавания людям слабо знакомым с предметом. (тоже самое в статье биты, байты, кодировки).
    Большинство php-шников уверены что "объект - это экземпляр класса", да и многие программисты класс-ориентированных языков думают так же, но слыша такое определение становится совсем скучно. Сможете догадаться почему в php объект можно создать только как экземпляр класса, а не напрямую? =)
    В определении через массив как раз и есть провокационность статьи =). Т.е. я могу сказать, что массив - это упорядоченный набор типизированных переменных (str, int, boolean  и т.п.). Могу так же сказать что объект - это упорядоченный (заметьте!) набор переменных (свойств), в числе которых могут быть функции (методы) и другие объекты. Именно из этого определения я легко смогла объяснить стажеру что такое наследование, делегирование, каскадирование, замыкания даже легко! Объяснила про объекты первого класса и почему в яваскриптах почти все функции и объекты являются объектами первого класса.
    Да, все объекты работают через определённую прослойку, т.е. нет разницы между temp['first'] и temp.first. Однако некорректно сравнивать присваивание тимизированного значения напрямую и через new.  Ваш пример как раз это показывает http://jsfiddle.net/EL4FU/ . Т.е. str='test' - будет объект строка, а str=new String('test') будет объект Объект.

    Касательно примера

    a= [1:'something', 2:'something'];
    Действительно у меня ошибка, поэтому и прошу всех читать и комментировать, а то бы не заметила. Я хотела сказать в примере что объекту Объекта всё можно, а вот массиву далеко не всё, так что я думаю общий смысл остался верным. Статью соответственно поправила.
    Ещё хочется кроме критики получить оценку (можно критическую) методологии указанной в статье. Насколько применимы данные определения для преподавания и как вы преподаёте или преподавали бы данный предмет ученикам /студентам/стажёрам?
    Я очень старалась чтобы определения были более понятны новичкам, чем например цикл статей Дмитрия Сошникова
    http://dmitrysoshnikov.com/ecmascript/ru-javascript-the-core/ (Для экспертов я конечно его рекомендую, цикл отличный).
    P.S. из определений массива и т.п. можно в общем-то убрать слово "упорядоченный" (или как вы говорите неупорядоченный) если мы имеем ввиду разные вещи.

  • #8avatar

    SelenIT

    27.01.2012 13:39:53

    Я рассуждал так: объект в JS - по сути хеш, и "массив" в PHP - на самом деле хеш, т.е. при слове "массив" представляют себе хеш именно PHPшники :). Вроде того, как очень давно Дмитрий Котеров пытался объяснить "магию" JS через Perl (две статьи получились ничего, а в третьей он сам наделал ошибок, но его мастерски поправили на форуме, вот это объяснение прототипного наследования я считаю эталонным для новичков:).

    А чем плохо нейтральное "набор", как в официальном переводе ECMA-262-3 на сайте Ильи Кантора? Недостаточно провокационно? ;) Просто у термина "массив" в JS - вполне определенный смысл, как-то неизящно использовать его в совсем другом значении. Особенно для новичков, они же, как лоренцевы утята, запоминают первое, что увидели/услышали..:)

    А неупорядоченность объекта (как набора свойств) - в том, что свойства (напр. при переборе через for ... in) могут выбираться в том порядке, как удобнее интерпретатору, а не в том, в каком они назначались. Это принципиальный момент (хотя многие новички, сталкиваясь с таким поведением, считают его ошибкой).

    Ну а насчет "экземпляра класса" - тут уж ничего не попишешь, парадигма языка в корне другая. Тут не вижу другого выхода, как сразу рассказать о "бесклассовой" природе JS и провести очень краткий экскурс в прототипное наследование...

    некорректно сравнивать присваивание типизированного значения напрямую и через new
    Этим примером я пытался возразить на
    Число — или строковая переменная (или сущность) — не называются сами по себе объектами! Но по факту — являются ими.
    Я бы сказал как-нибудь так: "Не всё в JS - объект, но практически всё может при необходимости стать или хотя бы прикинуться объектом". Т.е. неявные объекты - такие добрые феи языка, которые появляются ниоткуда и приходят на помощь, как только в них появляется необходимость:).
    объекту Объекта всё можно, а вот массиву далеко не всё
    Имхо, немного не так: "объекту" (в смысле, инстансу) Массива можно всё то же, что "объекту" Объекта - в своей объектной "ипостаси" они как раз почти равны :). Но вот инициализатору массива (через литерал с квадратными скобками, который уже - в отличие от инициализации примитивных типов - полностью эквивалентен вызову new Array) приходится соблюдать опред. синтаксические ограничения - ради того, чтобы созданный "объект" (инстанс Array) мог "наслаждаться" всеми преимуществами упорядоченности, сортировки, итерации и т.п. На мой взгляд, справедливо :)

    В общем, и к методологии пока моя основная претензия - слишком вольное использование устоявшихся в JS терминов, "рвущее шаблон" вместо того, чтобы помочь его правильному формированию :)

  • #9avatar

    Елена Лунная

    27.01.2012 20:54:07

    Я не далее как два месяца назад прочитала цикл статей Дмитрия Котерова. 38 и 39 "наблу" я рекомендую после своего объяснения как дополнительное чтение, но 40 набла и форум по 40-й набле (все 6 страниц), который как раз вы указали, даже у меня сносят крышу, вы точно уверены что они подходят для новичков? Я их принципиально не рекомендую, иначе вместо решения задач простыми и изящными способами, в голове будет каша ооп!
    Определение объекта через массив несёт в себе чёткое указание на связь объекта и массива и их различие. Именно его я и заставляю запомнить. Если человек говоря объект представляет себе некий особый массив - это замечательно. Представляет что в нём функция - это не более чем одно из значений переменной - шикарно. А если представляет что-то другое - беда, значит в чём отличие сказать не сможет и в чём связь тоже не сможет.
    P.S. говоря о возможностях, я имела ввиду инициализаторы, конечно, вы правы.

  • #10avatar

    SelenIT

    27.01.2012 21:45:17

    Меня в этом определении смущает именно слово "массив". Хотя бы тем, что, говоря о массиве как таковом (который "instanceof Array"), легко впасть в рекурсию, получится, что массив — это такая особая модификация такого особого массива (поскольку массив является также и "instanceof Object"), у которого... и т.д. Я так и не понял, в чем ваше принципиальное возражение против нейтрального "набор свойств (произвольного типа)"?

    И приписывание точечной нотации "свойствам объекта", а квадратно-скобочной — "элементам массива", по-моему, тоже сбивает с толку и усугубляет эту путаницу. Это же два равноправных (не считая некоторых нюансов грамматики, из-за которых точечная нотация не работает для числовых имен свойств) способа обращения к свойствам именно объекта. Да и индексы массива — по сути те же имена свойств, удовлетворяющие опред. ограничениям (и при условии наличия у данного объекта опред. набора внутренних методов... который-то и делает его не просто объектом, а именно массивом:).

    Объяснение "странностей" объектной модели JS Zeroglif-ом в комментах к 40-й набле как раз нравится мне отсутствием "слов-паразитов типа класс, суперкласс и т.п.", т.е. самоограниченностью в рамках JS-парадигмы и терминологии, без привлечения сбивающих с толку сторонних ассоциаций (помимо безграничной эрудированности автора, который, порой кажется, помнит дословно всё, что сказал Ричард Корнфорд о каждом из фреймворков;). Уметь быстро и изящно решать простые задачи — это хорошо, но, чтобы не пасовать перед чем-то более сложным (типа "внутренностей" тех же фреймворков), нужно научиться понимать (а в идеале — почувствовать и полюбить:) этот странный язык, так похожий и непохожий на другие одновременно. Чтобы быстрее стать экспертом, для которого вот такие задачи будут не запутанными головоломками, а очевидными примерами..:)

  • #11avatar

    SelenIT

    30.01.2012 18:10:35

    Кстати, дизайн JS-массивов на базе хешей Крокфорд относит к "bad parts of JS".


Чтобы оставить комментарий нужно войти или зарегистрироваться (Регистрируйтесь за 5 секунд, без подтверждения email и т.п.).
Либо волшебно используйте ваш логин в Google, Яндекс, рамблер или ЖЖ чтобы войти через Open_ID
Подпишитесь на статьи через RSS

15 самых популярных статей: