В этой первой статье рассказывается о некоторых деталях программирования Nodejs.
1. ОТВЕТИТЬ через массив
для (var i = 0, l = arr.length; i <l; i ++)
Одним из преимуществ написания таким образом является получение операции по получению длины объекта массива на один шаг в каждом цикле. Чем дольше длина массива, тем более очевидным значение.
2. Определите подлинность переменных
if (a) {...} // a = '', a = '0', a = [], a = {}Результаты, если условное суждение: ложь, верно, верно, верно. Этот результат отличается от результата PHP, так что не путайте. Также необходимо провести различие между ситуациями, в которых она похожа на суждения, не являющиеся идентификацией.
3. Неищность суждения о 0 значении
1 if (0 == '0') {...} // true2 if (0 == []) {...} // true3 if (0 == [0]) {...} // true4 if (0 == {}) {...} // false5 if (0 == null) {...} // failНа самом деле, есть много таких странных суждений, и я перечислил только более распространенные. Если вы хотите понять правила, пожалуйста, обратитесь к другому сообщению в блоге моего: [JavaScript] углубленный анализ реляционных операций JavaScript и IF-заявлений.
4. ловушка Parseint
var n = parseint (ы); // s = '010'
После того, как утверждение выполнено, значение n составляет 8, а не 10. Хотя многие люди знают это, неизбежно, что в программировании будут ошибки, и у меня есть глубокое понимание этого. Следовательно, лучше всего писать следующим образом, поэтому ошибок не будет.
var n = parseint (s, 10);
5. Должен объявить переменные перед использованием
Хотя он не допустит никаких ошибок напрямую, используя переменные, не объявляя их, легко допустить какие -либо ошибки при написании таким образом. Поскольку интерпретатор интерпретирует его как глобальную переменную, легко вызывать ошибки, деляя его на другие глобальные переменные. Поэтому вы должны развить хорошую привычку объявлять переменные перед их использованием.
6. В цикле есть асинхронность
for (var i = 0, l = arr.length; i <l; i ++) {var sql = "select * from nx_user"; db.query (sql, function () {sys.log (i + ':' + sql);}); //db.query - это операция на таблице, которая является асинхронной операцией}Вы обнаружите, что выходные результаты одинаковы, и являются выходным содержанием, когда i = arr.length-1. Поскольку JavaScript является однопоточным, он выполнит синхронное содержание полного цикла перед выполнением асинхронных операций. Анонимная функция обратного вызова в коде является асинхронным обратным вызовом. Когда функция выполняется, были выполнены цикл и некоторые последующие операции синхронизации. Из -за принципа закрытия эта функция сохранит содержимое переменной SQL и переменной I последней петли петли для FOR, что приведет к неправильному результату.
Так что мне делать? Есть два решения, одно из них - использовать непосредственную функцию следующим образом:
for (var i = 0, l = arr.length; i <l; i ++) {var sql = "select * from nx_user"; (function (sql, i) {db.query (sql, function () {sys.log (i + ':' + sql);}); //db.query - это операция таблица, которая является асинхронной операцией}) (sql, i);};Другим методом является извлечение асинхронной операционной части и написать одну функцию следующим образом:
var outputSql = function (sql, i) {db.query (sql, function () {sys.log (i + ':' + sql);}); //DB.QUERY - это операция табличного запроса, которая является асинхронной операцией} для (var i = 0, l = arr.length; i <l; i ++) {var sql = "select * from nx_user"; outputSql (sql, i); }7. При обработке больших объемов данных старайтесь избегать гнездования петли.
Поскольку время обработки гнездования цикла будет увеличиваться в геометрической прогрессии с увеличением объема данных, его следует избегать как можно больше. В этом случае, если нет лучшего способа, общая стратегия состоит в том, чтобы обмениваться пространством на время, то есть установить таблицу сопоставления хеш -картирования вторичных циклических данных. Конечно, конкретный анализ ситуации также требуется. Еще одна вещь, чтобы сказать, что некоторые методы являются самими телами цикла, такими как Array.sort () (этот метод должен реализовать с двумя уровнями петель), поэтому вам необходимо обратить внимание при его использовании.
8. Старайтесь избегать рекурсивных вызовов.
Преимущество рекурсивных вызовов заключается в том, что код является кратким, а реализация проста, в то время как его недостатки очень важны. Следующее описание следующим образом:
(1) Размер стека функций будет расти линейно с рекурсивным уровнем, а стек функций имеет верхнее предельное значение. Когда рекурсив достигает определенного количества слоев, стек функций будет переполняться, что приведет к ошибкам программы;
(2) Каждый рекурсивный уровень добавит дополнительные операции нажатия и выпуска стека, то есть сайт сохранения и сайт восстановления во время вызова функции.
Поэтому следует избегать рекурсивных вызовов как можно больше.
9. Относительно изоляции модулей файлов модулей.
Когда узел компилирует файлы модуля JavaScript, его содержимое было завершено в начале и конец следующим образом:
(функция (экспорт, требование, модуль, __filename, __dirname) {ваш код файла javascript});Это позволяет выделить область между каждым файлом модуля. Поэтому, когда вы пишете файлы модулей Nodejs, вам не нужно добавлять еще один слой инкапсуляции изоляции области. Например, в следующем формате кода только добавит дополнительный уровень функциональных вызовов, который не рекомендуется:
(function () {...…}) ();10. Не смешивайте массивы и объекты
Вот пример кода ошибки:
var o = []; o ['name'] = 'liming';
Смешанные массивы и объекты могут привести к непредсказуемым ошибкам. Мой коллега столкнулся с очень странной проблемой. Давайте сначала посмотрим на код:
var o = []; o ['name'] = 'liming'; var s = json.stringify (o);
Он думал, что атрибут имени объекта O будет в строке JSON, но результат был ничто. В то время я был очень странным, но у меня было предчувствие, что это была проблема смешивания массивов и объектов. Я попробовал это, и это была действительно ее проблема. Позже я обнаружил в спецификации ECMA, что массивы сериализованы в соответствии с правилами JA. Поэтому вы должны разработать хорошую привычку программирования, правильно использовать массивы и объекты и не смешивать их.
11. Обещают элегантное программирование
Я считаю, что люди, которые подвергались воздействию Nodejs, имели этот опыт. Когда асинхронный обратный вызов вложен в асинхронном обратном вызове, код кажется очень запутанным и не имеет простота читабельности. Эта дилемма Nodejs может быть преодолена с обещаниями. Обещание похоже на скульптурное инструмент, который делает ваш код элегантным и красивым. Существует спецификация A+ для обещаний, и есть несколько методов реализации в Интернете, вы можете обратиться к нему.