Я планирую то, чтобы делать вводный доклад на JavaScript, и в процессе подготовки я задался вопросом, что главные ловушки - тот, новобранцы падают в.
Я знаю, что у меня было несколько глюков, прежде чем я полностью понял закрытие, но большая часть странного поведения в JavaScript не что-то, о чем я думаю больше...
Так, на какие ловушки необходимо определенно указать новобранцам?
Не оставляйте случайно запятую в определении объекта в буквальном смысле, иначе IE потерпит неудачу, и вы не заметите этого гораздо позже, потому что вы никогда не используете IE для разработки, и к тому времени это может отсосать выяснение того, что произошло.
var foo = {
bar: "bar",
baz: "baz",
};
Обратите внимание на комментарий @JulianR:
В массивах,IE не терпит сбой напрямую, выбрасывая синтаксическую ошибку, но потерпит неудачу при попытке использовать массив, потому что добавленная запятая заставляет IE думать, что в массиве есть еще один элемент со значением undefined
, чем есть на самом деле. Поэтому, если у вас когда-либо возникает ошибка, потому что по какой-то причине последним элементом в массиве является undefined
: это запятая.
var
'' == '0' //false
0 == '' //true
0 == '0' //true
false == 'false' //false
false == '0' //true
false == undefined //false
false == null //false
null == undefined //true
" \t\r\n" == 0 //true
А также разница между null
и undefined
. Как указано в таблице выше, сравнение null
и undefined
с ==
возвращает true, а с ===
- false. Такое поведение имеет смысл, если понять, что undefined
сильно отличается от переменной, имеющей null
значение, а что-то, имеющее значение undefined
, отличается от чего-то being undefined.
Самые большие трудности, с которыми я сталкиваюсь для новичка, - это понимание контекста выполнения (то есть, что «это» означает, когда и где бы оно ни встречалось) и прототип системы наследования.
window.onload = init();
вместо window.onload = init;
для варианта цикла in
для итерации по массивам. ;
, потому что это «необязательно». это
(просто... в общем :))var
obj.ref === obj["ref"]
Это не настоящий подводный камень в кодировании, а скорее общая мысль:
Не доверяйте тому, что делает ваш JavaScript, он может быть отключен или даже исправлен обезьянами. Это означает, что никогда не полагайтесь на валидацию на стороне клиента. НИКОГДА.
+
для объединения строк:
var a = '2';
var b = 3;
a * b # 6
a - b # -1
a + b # 23
Для полного понимания всей концепции прототипирования требуется некоторое время, но вот некоторые распространенные подводные камни:
Забывание сбросить свойство конструктора после назначения объекта прототипа:
var Foo() = function ()
{
this.batz = '...';
};
Foo.prototype = new Bar();
Foo.prototype.constructor = Foo;
Если вы забудете наименьшую строку, new Foo()
фактически выполнит Bar()
.
Еще одна ловушка с прототипированием заключается в итерации по объектам/массивам без фильтрации членов прототипа:
for (var i in obj) {
if (obj.hasOwnProperty(i)) {
//stuff...
}
}
Дополнительное условие пропустит все члены, унаследованные от прототипа obj
.
Я не могу вспомнить больше, но надеюсь, что это поможет.
По общему признанию, я был виноват в некоторых из них в прошлом, для вашего развлечения они выделены жирным шрифтом:
eval
eval ( "obj." + prop);
с операторами
parseInt (str, base)
без указания аргумента base
. this
в функциях таймера / обратного вызова. setTimeout ("someFunc (myScopedVarWhoops)");
$ (1) .plus ( 1)
кто-нибудь? ;-) continue
без увеличения или изменения условной переменной. var
в или до для
операторов. for (i = 0; i <10; i ++)
условие возврата? true: false;
вместо return condition;
try ... catch ... finally
для обнаружения ошибок вместо использования операторов if
для проверки переменных. {0: "Foo" , 1: «Бар», 2: «Foobar»}
вместо [«Foo», «Bar», «Foobar»]
parseInt ()
при вводе пользователем
parseInt ("1,000") // -> 1, неверно!
+ "1,000" // -> NaN, правильно!
Некоторые уже упоминались:
===
) ;
правильное завершение операторов for ... в
циклах на массивах Возможно, придумаю еще кое-что после того, как я высплюсь: -)