Что должен знать каждый программист JavaScript? [закрытый]

есть ли набор вещей, которые каждый программист JavaScript должен знать, чтобы иметь возможность сказать "Я знаю JavaScript"?

30 ответов


не jQuery. Не Юи. Не (и т. д. так далее.)

фреймворки могут быть полезны, но они часто скрывают иногда уродливые детали того, как JavaScript и DOM на самом деле работают от вас. Если ваша цель состоит в том, чтобы иметь возможность сказать "Я знаю JavaScript", то инвестирование много времени в фреймворк против этого.

вот некоторые функции языка JavaScript, которые вы должны знать, чтобы grok, что он делает, и не попасться, но которые не сразу очевидное для многих людей:

  • это object.prop и object['prop'] то же самое (так что вы можете прекратить использовать eval, спасибо); что свойства объекта всегда являются строками (даже для массивов);что for...in начто это не).

  • обнюхивание собственности; что undefinedпочему пахнет); почему, казалось бы, малоизвестный in оператор полезен и различен от typeof/undefined проверок; hasOwnProperty; цель delete.

  • что Number datatype действительно float; языковые трудности использования поплавков; избегая parseInt восьмеричной ловушку.

  • область вложенных функций; необходимость использования var в области, которую вы хотите избежать случайных глобалов; как области могут использоваться для замыканий;петля закрытия проблема.

  • как глобальные переменные и window свойства сталкиваются; как глобальные переменные и элементы документа не должны сталкиваться, но делать в IE; необходимость использования var в глобальном масштабе тоже, чтобы избежать этого.

  • как function утверждение актов ‘’ определение перед кодом, предшествующим ему; разница между операторами функций и выражениями функций; почему именованные выражения функций не следует использовать.

  • как работает конструктор, то prototype собственность и new оператор действительно работает; методы использования этого для создания нормальной системы класса / подкласса / экземпляра, которую вы действительно хотели; когда вы можете использовать объекты на основе закрытия вместо прототипирования. (Большинство учебных материалов JS абсолютно ужасны на этом; мне потребовались годы, чтобы получить его прямо в моем голова.)

  • как this определяется во время вызова, не связали; как, следовательно, способ-передает не работает, как вы ожидаете из других языков, как закрытие или Function#bind может использоваться, чтобы обойти это.

  • другие функции пятого издания ECMAScript, такие как indexOf, forEach и функциональное программирование методы on Array; как исправить старые браузеры, чтобы вы могли их использовать; используя их с помощью встроенных анонимных выражений функций, чтобы получить компактный, читаемый код.

  • поток управления между браузером и кодом пользователя; синхронное и асинхронное выполнение; события, которые срабатывают внутри потока управления (например. focus) против событий и таймаутов, которые происходят при возврате элемента управления; как вызов предположительно-синхронной сборки, такой как alert может привести к потенциально катастрофическому повторному поступлению.

  • как кросс-оконные скрипты аффекты instanceof; как межоконный сценарий влияет на поток управления в разных документах; как postMessage надеюсь, это исправит.

посмотреть ответ относительно последних двух пунктов.

больше всего, вы должны критически рассматривать JavaScript, признавая, что он по историческим причинам является несовершенным языком (даже больше, чем большинство языков), и избегая его худших проблем. Работа Крокфорда на этом фронте определенно стоит прочитать (хотя я не на 100% согласен с ним в том, какие "хорошие части").


что его можно отключить.


понимание написанного в Крокфорд по Javascript: Хорошие Части довольно хорошее предположение, что человек является достойным программистом JS.

вы можете в значительной степени знать, как использовать хорошую библиотеку, такую как JQuery, и все еще не знать скрытые части Javascript.

другое Примечание-отладка инструментов в различных браузерах. Программист JS должен знать, как отлаживать свой код в разных браузерах.

о! И зная JSLint будет полностью ранить твои чувства!!


Если вы хотите быть настоящим ниндзя JavaScript, вы должны знать ответы на каждый вопрос в совершенство убивает JavaScript викторины.

пример для затравки:

(function f(f){ 
  return typeof f(); 
})(function(){ return 1; });

что возвращает это выражение?

  • "номер"
  • "undefined"
  • "функции"

вы не знаете JavaScript, если вы не знаете:

  1. закрытие
  2. прототип на основе наследования
  3. шаблон модуля
  4. W3C-DOM
  5. как работают события

..что javascript не является java:)

многие, многие люди, начиная с разработки веб-сайта, сказали мне, что javascript-это просто java!


  1. ознакомьтесь по крайней мере с одной библиотекой Javascript ( jQuery, Prototype и т. д. ).

  2. узнайте, как использовать инструменты отладки основных браузеров (MSIE 7-8, Firefox, Chrome, Safari )

  3. прочитайте вверх на индустрии: вебсайт Дугласа Крокфорда сокровищница пока Ajaxian.com это хороший блог, чтобы идти в ногу с новыми, интересными и странными идеями для Javascript. Есть ряд других ресурсов, но это те, которые помогли мне больше всего.


в JavaScript объекты и функции as первоклассный гражданин, обратные вызовы, чтобы не забыть о событий а то в jQuery.


Что JavaScript-это не то, что можно узнать за час!


переменные являются глобальными, если они не объявлены локальными!!

плохо (DoSomething () вызывается только 10 раз):

function CountToTen()
{
  for(i=0; i< 10; i++)
  {
    DoSomething(i);
  }
}

function countToFive()
{
  for(i=0; i<5; i++)
  {
    CountToTen();
  }
}

CountToFive();

хорошо (DoSomething () вызывается 50 раз по назначению):

function CountToTen()
{
  var i;
  for(i=0; i< 10; i++)
  {
    DoSomething(i);
  }
}

function countToFive()
{
  var i;
  for(i=0; i<5; i++)
  {
    CountToTen();
  }
}

CountToFive();


за знание того, что Javascript изначально назывался LiveScript и префикс "Java" был прикреплен для маркетинговых целей не потому, что Java и Javascript связаны (чего они не являются).

О, и за владение любой версией Дэвида Фланагана 'Javascript: Окончательное Руководство' (эта информация находится на стр. 2).

... и для оценки тех, кто пошел раньше в попытке запутать документ Internet Explorer 4.все и Документ навигатор Netscape 4 по.слои [] до того, как подобные Jquery забрали боль.

изменить:

Как указывает @Kinopiko, JavaScript изначально назывался project Mocha (в некоторых источниках также считают, что он назывался project LiveWire), но общепризнано, что язык (написанный Бренданом Эйчем) должен был быть выпущен как LiveScript до того, как префикс Java был принят в начале 1996 года.


следует знать о следующем, чтобы сказать "Я знаю JavaScript":

  1. JavaScript хорош, но DOM-болевая точка
  2. проблемы с кросс-браузером может заставить вас сойти с ума
  3. Если код протестировано по крайней мере на 4 разных хороших браузерах вы не можете сказать, что его ошибка бесплатно
  4. закрытие.............. Должен знать
  5. его прототипа ........... Неплохо его интересно узнать это
  6. отладчик ключевое слово ..... Помогает в кризис

этот JavaScript намного отличается от других языков, чем вы могли бы подумать. Посмотрите этот отличный Google Tech Talk, чтобы получить впечатление:http://www.youtube.com/watch?v=hQVTIJBZook


Что должен знать каждый кодер javascript?

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


Я настоятельно рекомендую прочитать Javascript: Хорошие Части


вы знаете javascript, если вы можете эффективно использовать массив, номер, строку, дату и объект. Плюс очки за математику и регулярное выражение. Вы должны иметь возможность писать функции и использовать переменные (в правильной области, т. е. как "методы" объекта).

Я вижу некоторые комментарии о знании замыканий, экстравагантного синтаксиса функции, blabla. Все это совершенно не относится к данному вопросу. Это как сказать, что вы бегун, если вы можете запустить 100M тире под 11 секунд.

Я говорю, что это занимает может быть, пару недель, чтобы стать опытным в javascript. После этого требуются годы и десятки книг и тысячи строк программирования, чтобы стать экспертом, ниндзя и т. д.

О, и DOM не является частью javascript, и jQuery тоже. Поэтому я думаю, что оба одинаково не имеют отношения к вопросу.



прочитав все вышесказанное, кроме прекрасно чтобы изучить Javascript с помощью фреймворка, такого как jQuery. Правда в том, что это первый способ, которым многие люди взяли JS в первую очередь. в этом нет ничего зазорного.


массив.length метод - это не количество элементов массива, а самый высокий индекс. даже когда элемент был установлен в undefined

var a = [];
a.length;   // === 0
a[10];      // === undefined
a[10] = undefined;
a.length;   // === 11
a.pop();    // === undefined
a.length;   // === 10

это поведение трудно отличить от ошибки языкового дизайна..


jQuery будет моей лучшей рекомендацией. Не только для самого кода, это идиома, стиль, мышление за ним, которые наиболее достойны подражания.


Что JavaScript является наиболее широко распространенным языком в мире. (Вероятно)


изучение языка действительно хорошо и понимание его различных причуд происходит от (лет) опыта. Если вы хотите быть лучшим программистом, я бы сказал, понимание шаблонов проектирования, как и когда их использовать и/ или даже когда вы используете их, не осознавая этого; техническая архитектура и пользовательский опыт.

знание языка (JavaScript) означает, что вы можете выбрать любую структуру и использовать ее по своему желанию. Вам неизбежно нужно будет погрузиться в исходный код, и если все вы знайте, что синтаксис-это фреймворк или 2 или 3, тогда вы не уйдете далеко. Говоря это, попадание в исходный код нескольких разных фреймворков, вероятно, является одним из лучших способов увидеть, как можно использовать JavaScript. Возиться, проходя через код в Firebug или Web Inspector, а затем проверяя документацию JavaScript, особенно документы Mozilla и Webkit, чтобы получить дальнейшее понимание того, что вы смотрите.

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

просто читая некоторые книги, особенно "хорошие части" Крокфорда, который просто представляет свое мнение о том, что хорошо в JavaScript, в то время как пропуская большинство удивительных частей JavaScript собирается получить вас на неправильной ноге.

проверка кода, написанного кем-то вроде Томаса Фукса с другой стороны, это даст вам гораздо больше информации о силе написания удивительного и эффективного JavaScript.

попытка запомнить несколько gotchas или WTFs тоже не поможет, вы это поймете, если начнете кодировать и проходить через код библиотеки/ фреймворков, особенно услужливо прокомментированный, чтобы понять, почему они использовали определенные свойства / значения, а не другие, почему и когда хорошо использовать определенные операнды и операторы, это все есть в коде люди фреймворка используют. Что может быть лучше, чем учиться на примере? :^)


в Javascript важна производительность.

нет интеллектуального компилятора для оптимизации кода, поэтому вы должны быть более осторожны при написании кода javascript, чем такие языки, как C#, Java...


объектные литералы, потому что их так приятно писать.


Что важно:

1) переменных поднимать. 2) цепочки областей и объекты активации.

а потом такие вещи::)

3) wtfjs.com

4) все является объектом http://www.lifeinafolder.com/images/Js.jpg


  1. зная, что есть жизнь и без with() и где провести черту.
  2. вы можете создавать пользовательские ошибки с throw оператор, чтобы намеренно остановить среду выполнения javascript.

JavaScript не поддерживает отделение возвращение ключевое слово и оператор возврата с символом новой строки, как следующий код (или попробуйте его в моя страница jsFiddle)

function foo()
{
    return
    {
        bar: 'something'
    };
}

$(function()
{
    document.write(foo());
});

Я не понимаю, почему JavaScript не поддерживает этот стиль, потому что гораздо проще читать очень сложный исходный код JavaScript при сравнении со стилем JavaScript по умолчанию.

PS. Я написал JavaScript почти 6 лет. Но я только что нашел эту ошибку с себя, когда я пытаюсь выполнить следующую функцию. Она всегда возвращает undefined. Когда я использую отладчик и шагаю в эту функцию, все работает нормально. Я думаю, что это должна быть худшая ошибка программирования в моей жизни.

function JqGridInlineEditor_GenerateTool(cellvalue, options, rowObject, disableEdit, disableDelete)
{
    return 
        (!disableEdit ? '<a class="button edit" href="javascript: void(0);" onclick="JqGridInlineEditor_EditRow(this, \'{0}\');return false;" title="{2}"><img src="{1}" alt="{2}" /></a>'.format(options.rowId, getUrl('~/Content/Icons/Edit.gif'), 'Click here to Edit or \nDouble-click row to edit.') : '') +
        (!disableDelete ? '<a class="button delete" href="javascript: void(0);" onclick="JqGridInlineEditor_DeleteRow(this, \'{0}\');return false;" title="{2}"><img src="{1}" alt="{2}" /></a>'.format(options.rowId, getUrl('~/Content/Icons/Delete.png'), 'Click here to Delete or \nSelect row and then press Delete') : '') +
        (!disableEdit ? '<a class="button save" style="display:none" href="javascript: void(0);" onclick="JqGridInlineEditor_SaveRow(this, \'{0}\');return false;" title="{2}"><img src="{1}" alt="{2}" /></a>'.format(options.rowId, getUrl('~/Content/Icons/Save.png'), 'Click here to Save or \nPress Enter') : '') +
        (!disableEdit ? '<a class="button cancel" style="display:none" href="javascript: void(0);" onclick="JqGridInlineEditor_RestoreRow(this, \'{0}\');return false;" title="{2}"><img src="{1}" alt="{2}" /></a>'.format(options.rowId, getUrl('~/Content/Icons/Cancel.png'), 'Click here to Cancel or \nPress Esc') : '');
}

поскольку JS является функциональным языком, приличный программист JS должен уметь писать Y-комбинатор и объяснять, как он работает с верхней части головы.


... о Google Web Toolkit, что означает, что ваш проект javascript, вероятно, может быть разработан гораздо более удобным способом.