Ответы:
Не JQuery. Не YUI. Не (и т. Д. И т. П.)
Фреймворки могут быть полезны, но они часто скрывают некрасивые детали того, как на самом деле работают JavaScript и DOM от вас. Если ваша цель - сказать «Я знаю JavaScript», то мы тратим на это много времени.
Вот некоторые особенности языка JavaScript, которые вы должны знать, чтобы понять, что он делает, и не быть пойманными, но которые не сразу очевидны для многих людей:
Это object.prop
и object['prop']
то же самое (так что вы можете перестать использовать eval
, спасибо); свойства объекта всегда являются строками (даже для массивов); что for
... in
для (и что это не так ).
Недвижимость обнюхивать; что undefined
есть (и почему пахнет ); почему, казалось бы, малоизвестный in
оператор выгоден и отличается от typeof
/ undefined
проверок; hasOwnProperty
; цель delete
.
Что Number
тип данных действительно является плавающим; не зависящие от языка трудности использования поплавков; избегая parseInt
восьмеричной ловушки.
Определение вложенной функции; необходимость использования var
в области, которую вы хотите, чтобы избежать случайных глобалов; как можно использовать прицелы для укупорки; проблема петли закрытия .
Как глобальные переменные и window
свойства сталкиваются; как глобальные переменные и элементы документа не должны сталкиваться, а происходят в IE; необходимость использования var
в глобальном масштабе, чтобы избежать этого.
Как function
оператор действует, чтобы « поднять » определение перед кодом, предшествующим ему; разница между функциональными операторами и функциональными выражениями; почему выражения именованных функций не должны использоваться .
Как действительно работает конструктор, prototype
свойство и new
оператор; методы использования этого для создания нормальной системы класса / подкласса / экземпляра, которую вы на самом деле хотели; когда вы можете захотеть использовать объекты на основе замыкания вместо прототипирования. (Большинство учебного материала по JS абсолютно ужасны по этому поводу; мне потребовались годы, чтобы разобраться в этом.)
Как this
определяется во время разговора, не связано; следовательно, передача методов не работает так, как вы ожидаете от других языков; как замыкания или Function#bind
могут быть использованы, чтобы обойти это.
Другое ECMAScript Fifth Edition функции , такие как indexOf
, forEach
и функционально-программные методы наArray
; как исправить старые браузеры, чтобы их можно было использовать; используя их со встроенными выражениями анонимных функций, чтобы получить компактный, читаемый код.
Поток управления между браузером и кодом пользователя; синхронное и асинхронное выполнение; события, которые возникают внутри потока управления (например, фокус), против событий и тайм-аутов, которые происходят, когда управление возвращается; как вызов якобы синхронного встроенного типа alert
может привести к потенциально катастрофическому повторному входу.
Как влияет межоконный сценарий instanceof
; как межоконный сценарий влияет на поток управления различными документами; как postMessage
надеюсь это исправить.
Смотрите этот ответ относительно последних двух пунктов.
Прежде всего, вы должны критически относиться к JavaScript, признавая, что по историческим причинам он является несовершенным языком (даже больше, чем большинство языков), и избегая его наихудших проблем. Работы Крокфорда в этой области определенно заслуживают прочтения (хотя я не на 100% согласен с ним в том, что такое «хорошие роли»).
this
зависит от того, как вы к нему обращаетесь . Попробуйте: var o= {b: function(){alert(this===o);}};
тогда o['b']();
-> true
. И если вы хотите действительно причудливый, (o['b'])()
-> true
, но (c= o['b'])()
-> false
, и только в Mozilla, (true? o['b'] : null)()
-> true
. W, T, и действительно, F.
Это можно отключить.
Понимание материала, написанного в Javascript Крокфорда : «Хорошие части», является довольно хорошим предположением, что человек является достойным программистом JS.
Вы можете в значительной степени знать, как использовать хорошую библиотеку, такую как JQuery, и все еще не знать скрытые части Javascript.
Еще одно замечание - инструменты отладки в различных браузерах. Программист JS должен знать, как отлаживать свой код в разных браузерах.
Ой! И зная, что JSLint полностью обидит ваши чувства !!
Если вы хотите быть настоящим ниндзя JavaScript, вы должны знать ответы на все вопросы в Совершенстве убивает JavaScript Quiz .
Пример для разжигания аппетита:
(function f(f){
return typeof f();
})(function(){ return 1; });
Что возвращает это выражение?
- "число"
- «Неопределенный»
- «Функция»
- ошибка
Вы не знаете JavaScript, если не знаете:
You don't know JavaScript if you don't know The W3C-DOM
. Две вещи разные.
..это javascript это не java :)
Многие, многие люди, начинающие с разработки сайтов, говорили мне, что javascript - это просто java!
Ознакомьтесь с хотя бы одной библиотекой Javascript (Jquery, Prototype и т. Д.).
Узнайте, как использовать инструменты отладки основных браузеров (MSIE 7-8, Firefox, Chrome, Safari)
Читайте об индустрии: сайт Дугласа Крокфорда - это сокровище, а Ajaxian.com - хороший блог, чтобы следить за новыми, интересными или странными идеями для Javascript. Есть ряд других ресурсов, но это те, которые помогли мне больше всего.
Javascript объекты и функции в качестве первого класса гражданина , обратных вызовов , чтобы не забыть о событиях , а затем 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();
for (var i=0;
всем своим петлям
var
верхнюю часть функции, потому что она не обманывает вас относительно размера области видимости переменной. js2-mode
будет жаловаться, если вы находитесь var i
в двух отдельных for
циклах в одной и той же функции, поскольку она предполагает, что вы думаете, что у вас есть две отдельные переменные, а вы нет. Тем не менее, я стараюсь никогда не var
отделять вещи от того, где я их инициализирую.
Для того, чтобы знать, что Javascript изначально назывался LiveScript, а префикс «Java» был прикреплен в маркетинговых целях, а не потому, что Java и Javascript связаны между собой (а это не так).
Да, и за то, что вы владеете любой версией «Javascript: Полное руководство» Дэвида Фланагана (эта информация на странице 2).
... и за то, что высоко оценили тех, кто пытался запутать документ Internet Explorer 4 document.all [] и Netscape Navigator 4 document.layers [] до того, как подобные Jquery убрали боль.
РЕДАКТИРОВАТЬ:
Как отмечает @Kinopiko, JavaScript изначально назывался проектом Mocha ( некоторые источники также считают, что он назывался проектом LiveWire), но общепринято, что язык (написанный Бренданом Эйхом) планировалось выпустить как LiveScript до того, как префикс Java был принят на выпуск в начале 1996 года.
Нужно знать о следующем, чтобы сказать «Я знаю JavaScript»:
Этот JavaScript намного отличается от других языков, чем вы думаете. Посмотрите этот великолепный Google Tech Talk, чтобы получить впечатление: http://www.youtube.com/watch?v=hQVTIJBZook
Что должен знать каждый кодировщик javascript?
Как насчет, я могу отключить ваши усилия в 2 клика. Так что предоставьте запасной вариант, если это возможно.
Я настоятельно рекомендую прочитать Javascript: The Good Parts
Вы знаете javascript, если вы можете эффективно использовать Array, Number, String, Date и Object. Плюс очки по математике и регэкспу. Вы должны уметь писать функции и использовать переменные (в правильной области видимости, то есть как «методы» объекта).
Я вижу некоторые комментарии о знании замыканий, экстравагантный синтаксис функций, блабла. Все это не имеет отношения к этому вопросу. Это все равно что сказать, что вы бегун, если вы можете пробежать 100 м за 11 секунд.
Я говорю, что может понадобиться несколько недель, чтобы стать опытным в JavaScript. После этого требуются годы, десятки книг и тысячи строк программирования, чтобы стать экспертом, ниндзя и т. Д.
Но это был не вопрос.
О, и DOM не является частью javascript и jQuery. Поэтому я думаю, что оба вопроса в равной степени не имеют отношения к этому вопросу.
JSLint http://www.JSLint.com/
массив . 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.
Попытка запомнить несколько ошибок или WTF не очень поможет, вы поймете это, если начнете кодировать и проходить код библиотеки / фреймворков, особенно с комментариями, чтобы понять, почему они использовали определенные свойства / значения, а не другие, почему и когда хорошо использовать определенные операнды и операторы, все это есть в коде, который используют люди фреймворка. Как лучше, чем учиться на примере? : ^)
В Javascript производительность имеет значение.
Не существует интеллектуального компилятора для оптимизации вашего кода, поэтому вы должны быть более осторожны при написании кода JavaScript, чем такие языки, как C #, Java ...
Следующие вещи также важны:
1) Переменный подъем. 2) Область видимости цепей и объектов активации.
и тогда такие вещи :)
3) wtfjs.com
4) все является объектом http://www.lifeinafolder.com/images/Js.jpg
with()
и где провести черту.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') : '');
}
var foo = "bar" +
читает) анализатор.
var foo = 5
и -1;
приведет к Foo, установленным на 4, хотя каждый уважительных заявления сами по себе.
Поскольку JS является функциональным языком, порядочный JS-программист должен уметь писать Y-комбинатор и объяснять, как он работает на пределе возможностей.
... о Google Web Toolkit , что означает, что ваш проект javascript, вероятно, мог бы быть разработан более удобным способом.