Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Статья о JavaScript (https://javascript.ru/forum/offtopic/6027-statya-o-javascript.html)

Plest 06.11.2009 17:09

Статья о JavaScript
 
Помогите с вычиткой статьи Википедии о JavaScript (http://ru.wikipedia.org/wiki/JavaScript)?
О чём ещё написать? Что переработать?

Dmitry A. Soshnikov 06.11.2009 18:21

Цитата:

объекты, с возможностью интроспекции и динамического изменения типа через механизм прототипов;
Интроспекция есть, но тип объекта не меняется динамически за счёт изменения прототипа. Более того, прототип объекта не может быть изменён (полностью на новый объект) после создания объекта. Исключение составляют некоторые реализации - типа __proto__ в Gecko.

Цитата:

Нулевой и неопределённый типы данных Дэвидом Флэнаганом неформально причисляются к тривиальным типам, поскольку каждый из них определяет только одно значение.
Это, действительно, отсебятина Флэнагана, и к ES не имеет отношения. В ES null и undefined - это значения примитивных типов.

Объявление переменных

Цитата:

Синтаксис языка допускает явное и неявное объявление переменных. Явным образом переменную можно объявить с помощью ключевого слова var. В таком случае, переменная будет помещена в область видимости, соответствующую функции, в которой она объявляется. Ещё переменные, объявленные с помощью ключевого слова var называют долговременными, поскольку их нельзя удалить с помощью оператора delete[19]. В том случае если переменная объявляется вне функций, она становится глобальной[19]. Синтаксис языка допускает использование переменной без её предварительного объявления. В таком случае речь идёт о неявном объявлении переменной. Кроме того, формальные аргументы функций также могут быть использованы в качестве локальных переменных
Переменные объявляются исключительно с ключевым словом var. Без var - создаётся лишь свойство глобального объекта, но не переменная. Как было правильно замечено, переменные нельзя удалить. Но опять же, терминология "долговременные" - это отсебятина Флэнагана. Правильная терминология: переменные получают внутреннее свойство {DontDelete} и, соответвественно, не могут быть удалены посредством оператора delete.

Более того, в контексте eval-а, var-ы, всё-таки, могут быть удалены, поскольку, в этом контексте им не выставляется {DontDelete}.

Цитата:

. (обращение к свойству),[] (индексация массива)
И точка, и скобки - это выражение доступа к свойству.

Цитата:

заданием функции с помощью инструкции
На протяжении всего оприсания функций, вы говорите о функции-выражении (Function Expression). Функции-инструкции (Function Statement) - это расширение Gecko для описания функций внутри блоков.

Цитата:

Если она при этом вызывается в функции, в которую передаётся, то её называют функцией обратного вызова (или callback-функцией)
С точки зрения функционального программирования, более общее название - это функциональный аргумент ("Фунарг", "Funarg"). Callback тогда может рассматриваться, как частный случай.

Цитата:

При этом определённые в участке программы функции становятся вложенными по отношению к добавленной анонимной функции и в них возможно осуществление доступа к локальным переменным анонимной функции (которые до её введения были глобальными). Однако извне анонимной функции доступ к ним осуществить нельзя.
Только, если она не сохранена (возвращена) и, соответственно, её [[Scope]] вместе с ней.

Цитата:

Каждый объект в языке имеет следующие свойства:

constructor Функция, использованная для создания объекта (в примерах выше это Object())
Автоматом, только функции получают свойство constructor, и то, оно потом может быть удалено.

Цитата:

конструктор
функция, использующая ключевое слово this для формирования полей и методов объекта, создаваемого ей с помощью оператора new,
Не совсем удачное определение. Наличие this внутри функции никак не обособляет её от других функций. Можно использовать this для навешивания свойств другому объекту, например. С другой (и правильной) стороны, все функции - конструкторы. Сама же функция, участвующая в купе с new является больше инициализатором (это моя локальная терминология, в Википедии её писать не надо), поскольку за создание объекта отвечает не сама функция, а внутренний метод [[Construct]].

Про DOM почитал поверхностно.

Цитата:

В статье «javascript: The World's Most Misunderstood Programming Language»[94][95] Дуглас Крокфорд пишет::

Практически, любая книга по JavaScript — это воплощение Зла. В них куча ошибок, бестолковых примеров и плохих советов. Важные особенности языка либо плохо рассмотрены, либо не затрагиваются вовсе. Я прошёлся через десятки книг по JavaScript и могу рекомендовать только одну из них: javascript: The Definitive Guide (5th Edition) by David Flanagan. Уважаемые авторы: Если вы написали хорошую книгу, пожалуйста, вышлете мне копию для ознакомления
http://javascript.ru/ecmascript-in-detail (возможно, будет перевод на английский).

Zeroglif 06.11.2009 18:22

Это надо подробно посмотреть, статья большая. Я потихоньку буду вычитывать и сюда писать. Мож кто ещё поможет. Неточности есть само собой.

Octane 06.11.2009 20:03

Цитата:

Сообщение от http://ru.wikipedia.org/wiki/JavaScript
Числовой тип данных в JavaScript соответствует 64-битному формату чисел с плавающей запятой, определённому стандартом IEEE 754-2008 за исключением того, что различные значения Not-a-Number, определяемые в стандарте[14], представляются в данном языке единственным специальным значением NaN[

Еще есть специальное значение Infinity.

Plest 06.11.2009 20:48

Dmitry A. Soshnikov: потрясающе. Спасибо большое. Привожу в соответствие с Вашими замечаниями. Начал с объявлений переменных: там смысл сильно меняется. Ни в одной книге из просмотренных не нашёл то, о чём Вы пишите в Тонкостях ECMA-262-3. Часть 2. Объект переменных. Однако со спецификацией и здравым смыслом материал статьи очень хорошо согласуется.

Zeroglif: Спасибо

Octane: Мм. Смысл фразы в том, что Number в JavaScript — это практически то же самое, что определяется стандартом IEEE 754-2008 за исключением небольшого отличия в отношении NaN. И в отношении специального значения Infinity всё в полном соответствии с IEEE 754-2008..

Dmitry A. Soshnikov 06.11.2009 21:44

Plest, рад помочь.

По поводу ООП, в разделе литературы, вы в первую очередь приводите и рекомендуете книги Дж.Резига; однако, некоторая его информация также местами является весьма поверхностной (а иногда, и отсебятиной), слабо стыкующейся с ES.

Объективно, наиболее полной и точной информацией по ООП в JS на сегодня в .ru-нете (и не только в ru-нете, по мнению некоторых англоговорящих коллег) является эта статья, она будет переведена в первую очередь.

Для тех, кто интересуется ES глубоко, можете сослаться на мой блог; я думаю, им будет, что почерпнуть из него.

Plest 06.11.2009 22:22

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

У Резига есть ошибки, конечно. Но, по-моему, из печатного на русском лучше его книги, а также «Подробных руководств» Флэнагана и Макфарланда, книг по JavaScript сейчас просто нет. Здесь хвалят книгу Гудмана. По-моему, из её тысячи страниц полезная информация есть страниц пятьдесят.

По поводу механики ООП в JavaScript IMHO книге Стояна Стефанова нет равных.

Dmitry A. Soshnikov 06.11.2009 23:28

Цитата:

Сообщение от Plest
Добавил, но из списка книг оно выбивается. По-моему, лучше на конкретные записи в подходящих местах ссылки поставить

Статья ваша, вам решать ;) Да, среди списка книг ссылка на web-log выбивается. Однако, в отличие от статичной книги, блог - это более живая информация, она может меняться, дополняться, корректироваться согласно времени (и благодаря комментариям компетентных коллег).

Как вариант, можно ниже где-нибудь в ссылках оставить, а не в списке литературы. Только тогда, получается, не в разделе " Блоги известных авторов книг ", поскольку я, всё-таки, книг (пока) не написал и не знаю, есть ли большой смысл.

Книга Флэнагана, действительно, очень неплохая (кто-то называет её "лучшей книгой по JS", кто-то "наименее плохой" - два высказывания, объективно, верные). Он использует собственную терминологию, местами что-то перевирает, но это можно оправдать - за некоторыми упрощениями кроется благородное желание рассказать это очень понятно, хоть и местами поверхностно и в альтернативных (выдуманных) названиях.

Цитата:

Сообщение от Plest
По поводу механики ООП в JavaScript IMHO книге Стояна Стефанова нет равных.

Я, к сожалению, подробно не читал эту книгу, мельком по диагонали пролистывал. Там тоже есть недочёты. Например, он пишет сначала, что каждый объект имеет свойство .constructor, которое записывается в объект при создании, что, естественно, неверно:

Цитата:

Сообщение от Chapter 4 Objects
When an object is created, a special property is assigned to it behind the scenes—the constructor property. It contains a reference to the constructor function used to create this object.

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

Цитата:

Сообщение от Chapter 5 Prototype
Now let's take this lookup one step further. Every object has a constructor. The prototype is an object, so it must have a constructor too. Which in turn has a prototype. In other words you can do:

>>> newtoy.constructor.prototype.constructor

>>> newtoy.constructor.prototype.constructor.prototype

This might go on for a while, depending on how long the prototype chain is, but you eventually end up with the built-in Object()

Последний код - явно полная белиберда. Показана рекурсивная ссылка функции на саму себя и снова на свойство prototype. Настоящая же цепь прототипов - она неявная (implicit) и прототип объекта - это внутреннее свойство [[Prototype]], которое недоступно напрямую и не может быть изменено (за исключением, опять же, расширений типа __proto__).

Также, цепь прототипов заканчивается не на Object, как пишется (и даже не на Object.prototype), а на Object.prototype.[[Prototype]], который и будет равен null.

Возможно, есть ещё недочёты - я только бегло просмотрел главы об объектах и прототипах. Вот именно в этом статичная книга и отличается от блога - в ней уже не исправить подобных грубых ошибок. В блоге же всегда можно посоветоваться с коллегами и решить, как лучше написать/подать тот или иной материал.

Цитата:

Сообщение от Plest
нет равных

Ну, я лично ни с кем не соревнуюсь ;) Я просто пишу то, что знаю, передавая знания тем, кому это интересно.

Zeroglif 06.11.2009 23:40

Быстро по истории:

Цитата:

Разработанный Бренданом Айхом из компании Netscape язык был включён в браузер Netscape Navigator начиная с версии 2.0B3 в декабре 1995 года.
Под именем LiveScript язык появился летом-осенью 1995 года на стадии разработки Netscape Navigator 2.0. Уже во второй бете NN2.0b2 язык появился (пока не официально) под своим нынешним именем JavaScript. Официальная презентация JavaScript состоялась 4 декабря 1995 года, звучал анонс так: "NETSCAPE AND SUN ANNOUNCE JAVASCRIPT(TM), THE OPEN, CROSS-PLATFORM OBJECT SCRIPTING LANGUAGE FOR ENTERPRISE NETWORKS AND THE INTERNET".

Цитата:

Первоначально язык назывался Mocha, затем он был переименован в LiveScript.
Термин "Mocha" использовался только узко среди разработчиков, но не выходил в свет в отличие от LiveScript и последующего JavaScript.
Цитата:

Реализация компании Microsoft получила название JScript. Internet Explorer поддерживает JScript, начиная с версии 3.0, выпущенной в августе 1996 года.
Microsoft официально анонсировала свой язык 29 мая 1996 года вместе с Internet Explorer 3.0 Beta под именем ActiveX Script. Следующая официальная презентация языка уже под его нынешним именем JScript состоялась 18 июля 1996 года, звучал анонс так: "Microsoft Corp. (Nasdaq: MSFT) today announced it would deliver binary and source reference implementations of the scripting engines for Visual Basic(R), Scripting Edition and JScript, the Microsoft(R) open implementation of the JavaScript(TM) language." Справедливости ради надо сказать, что Microsoft не долго отставала от Netscape в части создания скриптового языка, уже зимой 1996 года появились первые упоминания о реализации движка, который в разных источниках обозначался, как OLE Scripting, Scripting Host, ActiveX Scripting, ActiveX Script.

Zeroglif 06.11.2009 23:45

Что книжка стоянова, что книжка ресига - полное г. хотя бы с (полу)академической точки зрения. Назовите мне 10 страниц наугад и мы проверим качество. Неужели нельзя обойтись без того, чтобы тащить это в википедию. Обидно за предмет. ;-)


Часовой пояс GMT +3, время: 11:46.