From 1354c1a559ca8a79daef7e0c541ac26e8a5dfcb7 Mon Sep 17 00:00:00 2001 From: Yuriy Husnay Date: Tue, 16 Apr 2013 11:23:34 +0300 Subject: [PATCH 1/6] Ukrainian translation file added, translated up to Preface --- translations/ua_UA/readme.md | 1224 ++++++++++++++++++++++++++++++++++ 1 file changed, 1224 insertions(+) create mode 100644 translations/ua_UA/readme.md diff --git a/translations/ua_UA/readme.md b/translations/ua_UA/readme.md new file mode 100644 index 00000000..b624a5b9 --- /dev/null +++ b/translations/ua_UA/readme.md @@ -0,0 +1,1224 @@ +UA +# Принципи написання консистентного, ідіоматичного коду на JavaScript *** + +##Це "живий" документ і нові ідеї по покращенню коду завжди заохочуються. Візьміть участь: fork, clone, branch, commit, push, pull request. *** + +* Rick Waldron [@rwaldron](http://twitter.com/rwaldron), [github](https://github.com/rwldrn) +* Mathias Bynens [@mathias](http://twitter.com/mathias), [github](https://github.com/mathiasbynens) +* Schalk Neethling [@ossreleasefeed](http://twitter.com/ossreleasefeed), [github](https://github.com/ossreleasefeed/) +* Kit Cambridge [@kitcambridge](http://twitter.com/kitcambridge), [github](https://github.com/kitcambridge) +* Raynos [github](https://github.com/Raynos) +* Matias Arriola [@MatiasArriola](https://twitter.com/MatiasArriola), [github](https://github.com/MatiasArriola/) +* John Fischer [@jfroffice](https://twitter.com/jfroffice), [github](https://github.com/jfroffice/) +* Idan Gazit [@idangazit](http://twitter.com/idangazit), [github](https://github.com/idangazit) +* Leo Balter [@leobalter](http://twitter.com/leobalter), [github](https://github.com/leobalter) +* Breno Oliveira [@garu_rj](http://twitter.com/garu_rj), [github](https://github.com/garu) +* Leo Beto Souza [@leobetosouza](http://twitter.com/leobetosouza), [github](https://github.com/leobetosouza) +* Ryuichi Okumura [@okuryu](http://twitter.com/okuryu), [github](https://github.com/okuryu) +* Pascal Precht [@PascalPrecht](http://twitter.com/PascalPrecht), [github](https://github.com/pascalprecht) +* EngForDev [engfordev](http://www.opentutorials.org/course/167/1363) - Hwan Min Hong / MinTaek Kwon [@leoinsight](http://twitter.com/leoinsight) / Tw Shim [@marocchino](http://twitter.com/marocchino), [github](https://github.com/marocchino) / Nassol Kim [@nassol99](http://twitter.com/nassol99), [github](https://github.com/nassol) / Juntai Park [@rkJun](http://twitter.com/rkJun), [github](https://github.com/rkJun) / Minkyu Shim / Gangmin Won / Justin Yoo [@justinchronicle](http://twitter.com/justinchronicle) / Daeyup Lee +* Marco Trulla [@marcotrulla](http://twitter.com/marcotrulla), [github](https://github.com/Ragnarokkr) +* Alex Navasardyan [@alexnavasardyan](http://twitter.com/alexnavasardyan), [github](https://github.com/2k00l) +* Mihai Paun [@mihaipaun](http://twitter.com/mihaipaun), [github](https://github.com/mihaipaun) +* Evgeny Mandrikov [@\_godin\_](http://twitter.com/_godin_), [github](https://github.com/Godin) +* Sofish Lin [@sofish](http://twitter.com/sofish), [github](https://github.com/sofish) +* Дејан Димић [@dejan_dimic](http://twitter.com/dejan_dimic), [github](https://github.com/rubystream) +* Miloš Gavrilović [@gavrisimo](http://twitter.com/gavrisimo), [github](https://github.com/gavrisimo) + + +## Код в будь-якому проекті повинен виглядати так, ніби його писала одна людина, не залежно від того, скільки людей працювало над ним. *** + +### Все наступне є списком норм, якими я керуюсь при написанні коду, автором якого я є; будь-який вклад в проекти, які я створив, повинен відповідати даним нормам. *** + +### Я не маю наміру нав'язувати свої вподобання в стилі іншим; власний стиль написання коду гідний поваги. + +> ### "Суперечки з приводу стилів бузглузді. У вас повинен бути посібник по стилю і ви повинні слідувати йому." +>_Rebecca_ _Murphey_ + +  + +> ### "Щоб бути хорошим керівником проекту, потрібно розуміти, що писати код для себе - це погана ідея. Якщо ваш код використовують тисячі людей, то пишіть свій код максимально зрозуміло, а не на власний розсуд." +>_Idan_ _Gazit_ + +## Переклади + +* [ORIGINAL](https://github.com/rwldrn/idiomatic.js/) +* [German](https://github.com/rwldrn/idiomatic.js/tree/master/translations/de_DE) +* [French](https://github.com/rwldrn/idiomatic.js/tree/master/translations/fr_FR) +* [Spanish](https://github.com/rwldrn/idiomatic.js/tree/master/translations/es_ES) +* [Portuguese - Brazil](https://github.com/rwldrn/idiomatic.js/tree/master/translations/pt_BR) +* [Korean](https://github.com/rwldrn/idiomatic.js/tree/master/translations/ko_KR) +* [Japanese](https://github.com/rwldrn/idiomatic.js/tree/master/translations/ja_JP) +* [Italian](https://github.com/rwldrn/idiomatic.js/tree/master/translations/it_IT) +* [Russian](https://github.com/rwldrn/idiomatic.js/tree/master/translations/ru_RU) +* [Romanian](https://github.com/rwldrn/idiomatic.js/tree/master/translations/ro_RO) +* [简体中文](https://github.com/rwldrn/idiomatic.js/tree/master/translations/zh_CN) +* [Serbian - cyrilic alphabet](https://github.com/rwldrn/idiomatic.js/tree/master/translations/ср_СР) +* [Serbian - latin aplphabet](https://github.com/rwldrn/idiomatic.js/tree/master/translations/sr_SR) + +## Важливе, не ідіоматичне + +### Якість коду: онлайн сервіси, ресурси, посилання + + * [JavaScript Plugin](http://docs.codehaus.org/display/SONAR/JavaScript+Plugin) для [Sonar](http://www.sonarsource.org/) + * [jsPerf](http://jsperf.com/) + * [jsFiddle](http://jsfiddle.net/) + * [jsbin](http://jsbin.com/) + * [JavaScript Lint (JSL)](http://javascriptlint.com/) + * [jshint](http://jshint.com/) + * [jslint](http://jslint.org/) + +[Використання інструментів по покращенню коду від Антона Ковалева](http://anton.kovalyov.net/slides/gothamjs/) + +### Ставай розумнішим + +### [ECMAScript 5.1 з коментарями](http://es5.github.com/) +### [Специфікації мови ECMAScript, видання 5.1](http://ecma-international.org/ecma-262/5.1/) + +Наступне потрібо вважати 1) незакінченим, и 2) *ОБОВ'ЯЗКОВИМ ДО ПРОЧИТАННЯ*. Я не завжди згідний з стилями даних авторів, але одне є точно: вони консистентні. Крім того, це канони для мови. + + * [Baseline For Front End Developers](http://rmurphey.com/blog/2012/04/12/a-baseline-for-front-end-developers/) + * [Eloquent JavaScript](http://eloquentjavascript.net/) + * [JavaScript, JavaScript](http://javascriptweblog.wordpress.com/) + * [Adventures in JavaScript Development](http://rmurphey.com/) + * [Perfection Kills](http://perfectionkills.com/) + * [Douglas Crockford's Wrrrld Wide Web](http://www.crockford.com) + * [JS Assessment](https://github.com/rmurphey/js-assessment) + +### Компіляція і розгортання + +Проекти поивнні старатись включати в себе певний інструментарій для контролю стилю, тестування і стиснення коду. Для цього ви можете використовувати [grunt](https://github.com/cowboy/grunt) від Ben Alman. + + + +### Тестування + +Проекти повинні мати юніт, еталонні, "по реалізації" або функціональні тести. Демонстрація сценаріїв НЕ ЯВЛЯЄТЬСЯ тестом. Нижче наведений списоу фреймворків для тестування, ні один із них не отримав більшого схвалення, ніж інший. + + * [QUnit](http://github.com/jquery/qunit) + * [Jasmine](https://github.com/pivotal/jasmine) + * [Vows](https://github.com/cloudhead/vows) + * [Mocha](https://github.com/visionmedia/mocha) + * [Hiro](http://hirojs.com/) + * [JsTestDriver](https://code.google.com/p/js-test-driver/) + * [Buster.js](http://busterjs.org/) + +## Зміст + + * [Пробіли, табуляція, порожні рядки](#whitespace) + * [Гарний синтаксис](#spacing) + * [Перевірка типів (Інструкція по стилю від команди jQuery Core)](#type) + * [Умовні обчислення](#cond) + * [практичний стиль](#practical) + * [Найменування](#naming) + * [Різне](#misc) + * ["Рідні" і "чужі" об'єкти](#native) + * [Коментарі](#comments) + * [Код однієї мови](#language) + + +------------------------------------------------ + + +## Передмова + +Следующие секции обрисовывают приемлемое руководство по стилю для современной разработки на языке JavaScript и не являются предписанием. Самое важное - это **закон написания консистентного кода**. Какой бы стиль вы ни выбрали для вашего проекта, он должен считаться законом. Сошлитесь на этот документ как заявление о приверженности вашего проекта к консистентности кода, читабельности и удобству сопровождения. + + + + +## Манифест Идиоматического Стиля + +1. Пробелы, табуляция и пустые строки + - Никогда не мешайте пробел и знак табуляции. + - Перед тем как начать проект, перед тем, как писать код, выберите между "мягкими" отступами (пробелами) или настоящими знаками табуляции и считайте это **законом**. + - Для лучшей читабельности кода, я всегда рекомендую выставлять размер отступа в вашем редакторе на 2 символа &mdash это либо два пробела, либо два пробела, которые представляют собой знак табуляции. + - Всегда работайте со включенной опцией "показать скрытое", если ваш редактор поддерживает ее. Преимущества: + - принужденная последовательность + - удаление пробела в конце строки + - удаление пустых строк + - читабельные коммиты и диффы + +2. Красивый Синтаксис + + A. Скобки, Фигурные Скобки, Переносы Строк + + ```javascript + + // if/else/for/while/try всегда разделяются пробелом, + // это улучшает читабельность + + // 2.A.1.1 + // Пример неразборчивого синтаксиса + + if(condition) doSomething(); + + while(condition) iterating++; + + for(var i=0;i<100;i++) someInterativeFn(); + + // 2.A.1.1 + // Используйте пробелы для того, чтобы улучшить читабельность + + if ( condition ) { + // выражения + } + + while ( condition ) { + // выражения + } + + for ( var i = 0; i < 100; i++ ) { + // выражения + } + + // Еще лучше: + + var i, + length = 100; + + for ( i = 0; i < length; i++ ) { + // выражения + } + + // Или... + + var i = 0, + length = 100; + + for ( ; i < length; i++ ) { + // выражения + } + + var prop; + + for ( prop in object ) { + // выражения + } + + + if ( true ) { + // выражения + } else { + // выражения + } + ``` + + + B. Присваивание, Объявление, Функции (Именованные, Функции-Выражения, Функции-Конструкторы) + + ```javascript + + // 2.B.1.1 + // Переменные + var foo = "bar", + num = 1, + undef; + + // Объявление литералов: + var array = [], + object = {}; + + + // 2.B.1.2 + // Использование только одного `var` на одну область видимости улучшает читабельность + // и упорядочивает блок объявления переменных (также сохраняет вам несколько нажатий клавиш) + + // Неправильно + var foo = ""; + var bar = ""; + var qux; + + // Правильно + var foo = "", + bar = "", + quux; + + // или... + var // комментарий для переменных + foo = "", + bar = "", + quux; + + // 2.B.1.3 + // Оператор var всегда должен быть в начале области видимости (функции). + // То же самое верно для констант и оператора let из ECMAScript 6. + + // Неправильно + function foo() { + + // выражения + + var bar = "", + qux; + } + + // Правильно + function foo() { + var bar = "", + qux; + + // все выражения после объявления переменных. + } + ``` + + ```javascript + + // 2.B.2.1 + // Объявление Именованных Функций + function foo( arg1, argN ) { + + } + + // Использование + foo( arg1, argN ); + + + // 2.B.2.2 + // Объявление Именованных Функций + function square( number ) { + return number * number; + } + + // Использование + square( 10 ); + + // Очень надуманный стиль передачи параметров + function square( number, callback ) { + callback( number * number ); + } + + square( 10, function( square ) { + // обратный вызов + }); + + // 2.B.2.3 + // Функция-Выражение + var square = function( number ) { + // вернуть что-то ценное и важное + return number * number; + }; + + // Функция-Выражение с Идентификатором + // Такое объявление хорошо тем, что функция может вызвать сама себя + // и ее имя будет видно в стеке вызова функций: + var factorial = function factorial( number ) { + if ( number < 2 ) { + return 1; + } + + return number * factorial( number-1 ); + }; + + // 2.B.2.4 + // Объявление Конструктора + function FooBar( options ) { + + this.options = options; + } + + // Использование + var fooBar = new FooBar({ a: "alpha" }); + + fooBar.options; + // { a: "alpha" } + + ``` + + + C. Исключения, Незначительные Отклонения от правил + + ```javascript + + // 2.C.1.1 + // Функции с обратным вызовом + foo(function() { + // Заметьте, что пробела между "function" и первой скобкой нет + }); + + // Функция, которая принимает массив как параметр, тоже без пробела + foo([ "alpha", "beta" ]); + + // 2.C.1.2 + // Функция, которая принимает объект как параметр, тоже без пробела + foo({ + a: "alpha", + b: "beta" + }); + + // Одна строка, тоже без пробела + foo("bar"); + + // Внутренние скобки, тоже без пробела + if ( !("foo" in obj) ) { + + } + + ``` + + D. Консистентность Всегда Побеждает + + В секции 2.A-2.C, правила использования пробела и знака табуляции установлены с простой целью: консистентность. + Очень важно отметить, что предпочтения в форматировании, такие как "внутренний пробел", должны считаться опциональными, но в вашем проекте должен использоваться только один стиль форматирования. + + ```javascript + + // 2.D.1.1 + + if (condition) { + // выражения + } + + while (condition) { + // выражения + } + + for (var i = 0; i < 100; i++) { + // выражения + } + + if (true) { + // выражения + } else { + // выражения + } + + ``` + + E. Кавычки + + Абсолютно неважно, какие кавычки вы используете (одинарные или двойные), нет никакой разницы в том, как JavaScript обрабатывает их. Что **действительно важно**, это сохранять консистентность. **Никогда не путайте кавычки в вашем проекте. Выберите один стиль и придерживайтесь его.** + + F. Конец строки и пустые строки + + Пробелы, знаки табуляции могут испортить диффы и сделать чэнджсеты непригодными для чтения. Подумайте о том, чтобы убирать пробелы в конце строк и пустые строки автоматически перед коммитом. + +3. Проверка типов (Руководство по стилю от jQuery Core) + + A. Типы + + String: + + typeof variable === "string" + + Number: + + typeof variable === "number" + + Boolean: + + typeof variable === "boolean" + + Object: + + typeof variable === "object" + + Array: + + Array.isArray( arrayLikeObject ) + (где возможно) + + Node: + + elem.nodeType === 1 + + null: + + variable === null + + null or undefined: + + variable == null + + undefined: + + Глобальные переменные: + + typeof variable === "undefined" + + Локальные переменные: + + variable === undefined + + Свойства: + + object.prop === undefined + object.hasOwnProperty( prop ) + "prop" in object + + B. Неявное приведение типов + + Представьте результат следующего... + + Пусть дан следующий HTML: + + ```html + + + + ``` + + + ```js + + // 3.B.1.1 + + // `foo` была объявлена, ей был присвоен `0` и ее тип `number` + var foo = 0; + + // typeof foo; + // "number" + ... + + // Далее в коде вам нужно обновить значение `foo` + // новым значением из input элемента + + foo = document.getElementById("foo-input").value; + + // Если бы вы проверили тип переменной сейчас `typeof foo`, то получили бы `string` + // Это значит, что если бы вы тестировали `foo` вот так: + + if ( foo === 1 ) { + + importantTask(); + + } + + // то `importantTask()` не была вызвана, даже если значение `foo` было бы "1" + + + // 3.B.1.2 + + // Вы можете избежать ошибок, используя приведение типов с помощью унарных операторов "+" и "-": + + foo = +document.getElementById("foo-input").value; + // ^ унарный оператор + приведет правую часть выражения к типу `number` + + // typeof foo; + // "number" + + if ( foo === 1 ) { + + importantTask(); + + } + + // `importantTask()` будет вызвана + ``` + + Вот несколько простых примеров приведения типов: + + + ```javascript + + // 3.B.2.1 + + var number = 1, + string = "1", + bool = false; + + number; + // 1 + + number + ""; + // "1" + + string; + // "1" + + +string; + // 1 + + +string++; + // 1 + + string; + // 2 + + bool; + // false + + +bool; + // 0 + + bool + ""; + // "false" + ``` + + + ```javascript + // 3.B.2.2 + + var number = 1, + string = "1", + bool = true; + + string === number; + // false + + string === number + ""; + // true + + +string === number; + // true + + bool === number; + // false + + +bool === number; + // true + + bool === string; + // false + + bool === !!string; + // true + ``` + + ```javascript + // 3.B.2.3 + + var array = [ "a", "b", "c" ]; + + !!~array.indexOf("a"); + // true + + !!~array.indexOf("b"); + // true + + !!~array.indexOf("c"); + // true + + !!~array.indexOf("d"); + // false + + // Заметьте, что вышеизложенное можно считать "черезчур умным" + // Лучше делать так: + + if ( array.indexOf( "a" ) >= 0 ) { + // ... + } + ``` + + ```javascript + // 3.B.2.3 + + + var num = 2.5; + + parseInt( num, 10 ); + + // то же самое, что и ... + + ~~num; + + num >> 0; + + num >>> 0; + + // Во всех случаях результат равен 2 + + + // Помните, что отрицательные числа будут обработаны по-другому... + + var neg = -2.5; + + parseInt( neg, 10 ); + + // тоже самое что... + + ~~neg; + + neg >> 0; + + // Во всех случаях результат равен -2 + // Хотя... + + neg >>> 0; + + // покажет 4294967294 + + + + + ``` + + + +4. Условное Вычисление/Обработка + + ```javascript + + // 4.1.1 + // Проверяя, есть ли у массива длина, + // вместо: + if ( array.length > 0 ) ... + + // проверяйте значение выражения: + if ( array.length ) ... + + + // 4.1.2 + // Проверяя, пустой ли массив: + // вместо: + if ( array.length === 0 ) ... + + // проверяйте значение выражения: + if ( !array.length ) ... + + + // 4.1.3 + // Проверяя, не пуста ли строка: + // вместо: + if ( string !== "" ) ... + + // проверяйте значение выражения: + if ( string ) ... + + + // 4.1.4 + // Проверяя, пустая ли строка: + // вместо: + if ( string === "" ) ... + + // проверяйте ложно ли выражение: + if ( !string ) ... + + + // 4.1.5 + // Проверяя, является ли переменная истиной, + // вместо: + if ( foo === true ) ... + + // проверяйте следующим образом: + if ( foo ) ... + + + // 4.1.6 + // Проверяя, является ли переменная ложью, + // вместо: + if ( foo === false ) ... + + // проверяйте, используя отрицание: + if ( !foo ) ... + + // ...Будьте осторожны, потому что это выражение справедливо и для: 0, "", null, undefined, NaN + // Для проверки значения заведомо ложных выражений, используйте: + if ( foo === false ) ... + + + // 4.1.7 + // Проверяя, если переменная null или undefined, но НЕ ложь, "" или 0, + // вместо: + if ( foo === null || foo === undefined ) ... + + // ...воспользуйтесь оператором ==: + if ( foo == null ) ... + + // Помните, что сравнение с помощью оператора == с `null` сработает для ОБОИХ `null` и `undefined` + // но не для `false`, "" или 0 + null == undefined + + ``` + ВСЕГДА оценивайте самый лучший и точный результат - выше приведено руководство, а не догма. + + ```javascript + + // 4.2.1 + // Приведение типов и оценка выражений + + // Отдавайте предпочтение `===`, а не `==` (только если конкретный случай не требует слабо типизированной оценки) + + // === не приводит типы принудительно, т.е.: + + "1" === 1; + // false + + // == приводит типы принудительно, т.е.: + + "1" == 1; + // true + + + // 4.2.2 + // Логические выражения, Истинные и Ложные + + // Логические выражения: + true, false + + // Истинные: + "foo", 1 + + // Ложные: + "", 0, null, undefined, NaN, void 0 + + ``` + + +5. Стиль на практике + + ```javascript + + // 5.1.1 + // Модуль + + (function( global ) { + var Module = (function() { + + var data = "secret"; + + return { + // Логическое свойство + bool: true, + // Свойство типа строка + string: "a string", + // Свойство - массив + array: [ 1, 2, 3, 4 ], + // Свойство - объект + object: { + lang: "en-Us" + }, + getData: function() { + // получить текущее значение переменной `data` + return data; + }, + setData: function( value ) { + // присвоить значение переменной `data` и вернуть его + return ( data = value ); + } + }; + })(); + + // Другие объявления + + // делаем наш модуль глобальным + global.Module = Module; + + })( this ); + + ``` + + ```javascript + + // 5.2.1 + // Конструктор + + (function( global ) { + + function Ctor( foo ) { + + this.foo = foo; + + return this; + } + + Ctor.prototype.getFoo = function() { + return this.foo; + }; + + Ctor.prototype.setFoo = function( val ) { + return ( this.foo = val ); + }; + + + // Чтобы вызывать конструктор без использования оператора `new`, можно объявить конструктор так: + var ctor = function( foo ) { + return new Ctor( foo ); + }; + + + // делаем наш конструктор глобальным + global.ctor = ctor; + + })( this ); + + ``` + + + +6. Именование + + + A. Вы не компилятор или компрессор, так что не пытайтесь быть одним из них. + + Весь последующий код является примером плохого именования переменных: + + ```javascript + + // 6.A.1.1 + // Пример кода с "бедными на описание" именами переменных + + function q(s) { + return document.querySelectorAll(s); + } + var i,a=[],els=q("#foo"); + for(i=0;iРазное + + Этот раздел описывает идеи и концепции, которые не должны рассматриваться как догма. Он существуют для того, чтобы посеять сомнения в общепринятых методах в попытке найти более эффективные способы для выполнения общих задач программирования на JavaScript. + + A. Использование `switch` следует избегать, потому что современный метод отладки будет скрывать вызовы функций, которые используют `switch`. + + В последних версиях браузеров Firefox и Chrome, кажется, есть значительные улучшения в исполнении функций, которые используют `switch`. + http://jsperf.com/switch-vs-object-literal-vs-module + + На заметные улучшения также можно посмотреть тут: + https://github.com/rwldrn/idiomatic.js/issues/13 + + ```javascript + + // 7.A.1.1 + // Пример оператора switch + + switch( foo ) { + case "alpha": + alpha(); + break; + case "beta": + beta(); + break; + default: + // какое-то значение по умолчанию + break; + } + + // 7.A.1.2 + // Лучшим подходом было бы использовать объект или даже модуль: + + var switchObj = { + alpha: function() { + // выражения + // возвращаем результат + }, + beta: function() { + // выражения + // возвращаем результат + }, + _default: function() { + // выражения + // возвращаем результат + } + }; + + var switchModule = (function () { + return { + alpha: function() { + // выражения + // возвращаем результат + }, + beta: function() { + // выражения + // возвращаем результат + }, + _default: function() { + // выражения + // возвращаем результат + } + }; + })(); + + + // 7.A.1.3 + // Если `foo` это свойство `switchObj` или `switchModule`, то выполнить метод... + + ( Object.hasOwnProperty.call( switchObj, foo ) && switchObj[ foo ] || switchObj._default )( args ); + + ( Object.hasOwnProperty.call( switchObj, foo ) && switchModule[ foo ] || switchModule._default )( args ); + + // Если вы знаете возможные значения `foo` и доверяете его источнику, вы можете опустить условие ИЛИ + // оставив только выполнение + + switchObj[ foo ]( args ); + + switchModule[ foo ]( args ); + + + // Эта модель также поддерживает повторное использование кода. + + ``` + + B. "Ранние возвраты" способствуют читабельности кода с незначительной разницей в производительности + + ```javascript + + // 7.B.1.1 + // Неправильно: + function returnLate( foo ) { + var ret; + + if ( foo ) { + ret = "foo"; + } else { + ret = "quux"; + } + return ret; + } + + // Правильно: + + function returnEarly( foo ) { + + if ( foo ) { + return "foo"; + } + return "quux"; + } + + ``` + + +8. "Родные" и "чужие" объекты + + Основное правило: + + ### Не делайте тупых вещей и все будет хорошо. + + Для лучшего понимания этой концепции, посмотрите вот это видео: + + #### “Everything is Permitted: Extending Built-ins” by Andrew Dupont (JSConf2011, Portland, Oregon) + + + + http://blip.tv/jsconf/jsconf2011-andrew-dupont-everything-is-permitted-extending-built-ins-5211542 + + +9. Комментарии + + * Однострочные комментарии на линию выше кода + * Комментарии в несколько строк тоже приветствуются + * Комментарии в конце строки запрещены! + * Стиль JSDoc хорош, но в нем нужно долго разбираться + + +10. Код Одного Языка + +Программы должны быть написаны на одном языке (независимо от языка), как требуют того люди, которые сопровождают код. + +## Приложение + +### Первая Запятая. + +Любой проект, который ссылается на этот документ в качестве руководства по стилю, не примет форматирование кода "первой запятой", только если автор специально не укажется этого. \ No newline at end of file From 2a636caf0a56606915080f9e05b660752c929028 Mon Sep 17 00:00:00 2001 From: Yuriy Husnay Date: Wed, 17 Apr 2013 19:51:01 +0300 Subject: [PATCH 2/6] translated up to 2.C --- translations/ua_UA/readme.md | 108 +++++++++++++++++------------------ 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/translations/ua_UA/readme.md b/translations/ua_UA/readme.md index b624a5b9..47affeea 100644 --- a/translations/ua_UA/readme.md +++ b/translations/ua_UA/readme.md @@ -122,34 +122,33 @@ UA ## Передмова -Следующие секции обрисовывают приемлемое руководство по стилю для современной разработки на языке JavaScript и не являются предписанием. Самое важное - это **закон написания консистентного кода**. Какой бы стиль вы ни выбрали для вашего проекта, он должен считаться законом. Сошлитесь на этот документ как заявление о приверженности вашего проекта к консистентности кода, читабельности и удобству сопровождения. +Наступні секції описують прийнятну інструкцію по стилю для сучасної розробки на JavaScript і не являються обов’язковими.Найважливіше - це **закон написання консистентного коду**. Який стиль ви б не вибрали для вашого проекту, він повинен вважатись законом. Ссилайтесь на даний документ як на заяву про відношення вашого проекту до консистентності коду, читабельності і зручності супроводу. +## Маніфест Ідіоматичного Стилю -## Манифест Идиоматического Стиля +1. Пробіли, табуляція і порожні рядки + - Ніколи не змішуйте пробіли і знаки табуляції. + - Перед тим як почати проект, перед тим, як писати код, виберіть між "м’якими" відступами(пробіли) або знаками табуляції і вважайте це **законом**. + - Для кращої читабельності коду, я завжди рекомендую виставити розмір відступу в вашому редакторі на 2 символи &mdash - це або два пробіли, або два пробіли які являються знаком табуляції. + - Завжди працюйте з увімкнутою опцією "показати приховане", якщо ваш редактор підтримує її. Переваги: + - вимушена послідовність + - видалення пробілу в кінці рядка + - видалення порожніх рядків + - читабельні коміти та діффи -1. Пробелы, табуляция и пустые строки - - Никогда не мешайте пробел и знак табуляции. - - Перед тем как начать проект, перед тем, как писать код, выберите между "мягкими" отступами (пробелами) или настоящими знаками табуляции и считайте это **законом**. - - Для лучшей читабельности кода, я всегда рекомендую выставлять размер отступа в вашем редакторе на 2 символа &mdash это либо два пробела, либо два пробела, которые представляют собой знак табуляции. - - Всегда работайте со включенной опцией "показать скрытое", если ваш редактор поддерживает ее. Преимущества: - - принужденная последовательность - - удаление пробела в конце строки - - удаление пустых строк - - читабельные коммиты и диффы +2. Гарний Синтаксис -2. Красивый Синтаксис - - A. Скобки, Фигурные Скобки, Переносы Строк + A. Дужки, Фігурні Дужки, Перенос Рядка ```javascript - // if/else/for/while/try всегда разделяются пробелом, - // это улучшает читабельность + // if/else/for/while/try завжди розділяються пробілом, + // це покращує читабельність // 2.A.1.1 - // Пример неразборчивого синтаксиса + // // Приклад нерозбірливого синтаксису if(condition) doSomething(); @@ -158,71 +157,72 @@ UA for(var i=0;i<100;i++) someInterativeFn(); // 2.A.1.1 - // Используйте пробелы для того, чтобы улучшить читабельность + // Використовуйте пробіли для того, щоб покращити читабельність if ( condition ) { - // выражения + // вирази } while ( condition ) { - // выражения + // вирази } for ( var i = 0; i < 100; i++ ) { - // выражения + // вирази } - // Еще лучше: + // Ще краще: var i, length = 100; for ( i = 0; i < length; i++ ) { - // выражения + // вирази } - // Или... + // Або... var i = 0, length = 100; for ( ; i < length; i++ ) { - // выражения + // вирази } var prop; for ( prop in object ) { - // выражения + // вирази } if ( true ) { - // выражения + // вирази } else { - // выражения + // вирази } ``` - B. Присваивание, Объявление, Функции (Именованные, Функции-Выражения, Функции-Конструкторы) + B. Присвоєння, Оголошення, Функції(Іменовані, Функції-Вирази, Функціх-Конструктори) ```javascript // 2.B.1.1 - // Переменные + // Змінні var foo = "bar", num = 1, undef; - // Объявление литералов: + // Оголошення літералів: var array = [], object = {}; // 2.B.1.2 - // Использование только одного `var` на одну область видимости улучшает читабельность - // и упорядочивает блок объявления переменных (также сохраняет вам несколько нажатий клавиш) + // Використання тільки одного `var` на одну область видимості покращує читабельність + + // і впорядковує блок оголошення змінних(також зберігає вам декілька символів) // Неправильно var foo = ""; @@ -234,20 +234,20 @@ UA bar = "", quux; - // или... - var // комментарий для переменных + // або... + var // коментар для змінних foo = "", bar = "", quux; // 2.B.1.3 - // Оператор var всегда должен быть в начале области видимости (функции). - // То же самое верно для констант и оператора let из ECMAScript 6. + // Оператор var завжди повинен бути на початку області видимості(функції) + // Те саме вірно для констант і оператора let із ECMAScript 6. // Неправильно function foo() { - // выражения + // вирази var bar = "", qux; @@ -258,50 +258,50 @@ UA var bar = "", qux; - // все выражения после объявления переменных. + // всі вирази після оголошеня змінних. } ``` ```javascript // 2.B.2.1 - // Объявление Именованных Функций + // Оголошення Іменованих Функцій function foo( arg1, argN ) { } - // Использование + // Використання foo( arg1, argN ); // 2.B.2.2 - // Объявление Именованных Функций + // Оголошення Іменованих Функцій function square( number ) { return number * number; } - // Использование + // Використання square( 10 ); - // Очень надуманный стиль передачи параметров + // Дуже надуманий стиль передачі параметрів function square( number, callback ) { callback( number * number ); } square( 10, function( square ) { - // обратный вызов + // зворотній виклик }); // 2.B.2.3 - // Функция-Выражение + // Функція-Вираз var square = function( number ) { - // вернуть что-то ценное и важное + // повернути щось важливе і цінне return number * number; }; - // Функция-Выражение с Идентификатором - // Такое объявление хорошо тем, что функция может вызвать сама себя - // и ее имя будет видно в стеке вызова функций: + // Функція-Вираз з Ідентифікатором + // Таке оголошення гарне тим, що функція може викликати сама себе + // і її ім’я буде видно в стеку викликів функцій: var factorial = function factorial( number ) { if ( number < 2 ) { return 1; @@ -311,13 +311,13 @@ UA }; // 2.B.2.4 - // Объявление Конструктора + // Оголошення Конструктора function FooBar( options ) { this.options = options; } - // Использование + // Використання var fooBar = new FooBar({ a: "alpha" }); fooBar.options; @@ -326,7 +326,7 @@ UA ``` - C. Исключения, Незначительные Отклонения от правил + C. Виключення, Незначні відхилення від правил ```javascript @@ -1221,4 +1221,4 @@ UA ### Первая Запятая. -Любой проект, который ссылается на этот документ в качестве руководства по стилю, не примет форматирование кода "первой запятой", только если автор специально не укажется этого. \ No newline at end of file +Любой проект, который ссылается на этот документ в качестве руководства по стилю, не примет форматирование кода "первой запятой", только если автор специально не укажется этого. From 2417350c7b1d6682b20e9c795e1769dcc922990c Mon Sep 17 00:00:00 2001 From: Yuriy Husnay Date: Thu, 18 Apr 2013 18:10:50 +0300 Subject: [PATCH 3/6] 'UA' removed, fixed translation mistakes --- translations/ua_UA/readme.md | 2447 +++++++++++++++++----------------- 1 file changed, 1223 insertions(+), 1224 deletions(-) diff --git a/translations/ua_UA/readme.md b/translations/ua_UA/readme.md index 47affeea..f5b3bd4d 100644 --- a/translations/ua_UA/readme.md +++ b/translations/ua_UA/readme.md @@ -1,1224 +1,1223 @@ -UA -# Принципи написання консистентного, ідіоматичного коду на JavaScript *** - -##Це "живий" документ і нові ідеї по покращенню коду завжди заохочуються. Візьміть участь: fork, clone, branch, commit, push, pull request. *** - -* Rick Waldron [@rwaldron](http://twitter.com/rwaldron), [github](https://github.com/rwldrn) -* Mathias Bynens [@mathias](http://twitter.com/mathias), [github](https://github.com/mathiasbynens) -* Schalk Neethling [@ossreleasefeed](http://twitter.com/ossreleasefeed), [github](https://github.com/ossreleasefeed/) -* Kit Cambridge [@kitcambridge](http://twitter.com/kitcambridge), [github](https://github.com/kitcambridge) -* Raynos [github](https://github.com/Raynos) -* Matias Arriola [@MatiasArriola](https://twitter.com/MatiasArriola), [github](https://github.com/MatiasArriola/) -* John Fischer [@jfroffice](https://twitter.com/jfroffice), [github](https://github.com/jfroffice/) -* Idan Gazit [@idangazit](http://twitter.com/idangazit), [github](https://github.com/idangazit) -* Leo Balter [@leobalter](http://twitter.com/leobalter), [github](https://github.com/leobalter) -* Breno Oliveira [@garu_rj](http://twitter.com/garu_rj), [github](https://github.com/garu) -* Leo Beto Souza [@leobetosouza](http://twitter.com/leobetosouza), [github](https://github.com/leobetosouza) -* Ryuichi Okumura [@okuryu](http://twitter.com/okuryu), [github](https://github.com/okuryu) -* Pascal Precht [@PascalPrecht](http://twitter.com/PascalPrecht), [github](https://github.com/pascalprecht) -* EngForDev [engfordev](http://www.opentutorials.org/course/167/1363) - Hwan Min Hong / MinTaek Kwon [@leoinsight](http://twitter.com/leoinsight) / Tw Shim [@marocchino](http://twitter.com/marocchino), [github](https://github.com/marocchino) / Nassol Kim [@nassol99](http://twitter.com/nassol99), [github](https://github.com/nassol) / Juntai Park [@rkJun](http://twitter.com/rkJun), [github](https://github.com/rkJun) / Minkyu Shim / Gangmin Won / Justin Yoo [@justinchronicle](http://twitter.com/justinchronicle) / Daeyup Lee -* Marco Trulla [@marcotrulla](http://twitter.com/marcotrulla), [github](https://github.com/Ragnarokkr) -* Alex Navasardyan [@alexnavasardyan](http://twitter.com/alexnavasardyan), [github](https://github.com/2k00l) -* Mihai Paun [@mihaipaun](http://twitter.com/mihaipaun), [github](https://github.com/mihaipaun) -* Evgeny Mandrikov [@\_godin\_](http://twitter.com/_godin_), [github](https://github.com/Godin) -* Sofish Lin [@sofish](http://twitter.com/sofish), [github](https://github.com/sofish) -* Дејан Димић [@dejan_dimic](http://twitter.com/dejan_dimic), [github](https://github.com/rubystream) -* Miloš Gavrilović [@gavrisimo](http://twitter.com/gavrisimo), [github](https://github.com/gavrisimo) - - -## Код в будь-якому проекті повинен виглядати так, ніби його писала одна людина, не залежно від того, скільки людей працювало над ним. *** - -### Все наступне є списком норм, якими я керуюсь при написанні коду, автором якого я є; будь-який вклад в проекти, які я створив, повинен відповідати даним нормам. *** - -### Я не маю наміру нав'язувати свої вподобання в стилі іншим; власний стиль написання коду гідний поваги. - -> ### "Суперечки з приводу стилів бузглузді. У вас повинен бути посібник по стилю і ви повинні слідувати йому." ->_Rebecca_ _Murphey_ - -  - -> ### "Щоб бути хорошим керівником проекту, потрібно розуміти, що писати код для себе - це погана ідея. Якщо ваш код використовують тисячі людей, то пишіть свій код максимально зрозуміло, а не на власний розсуд." ->_Idan_ _Gazit_ - -## Переклади - -* [ORIGINAL](https://github.com/rwldrn/idiomatic.js/) -* [German](https://github.com/rwldrn/idiomatic.js/tree/master/translations/de_DE) -* [French](https://github.com/rwldrn/idiomatic.js/tree/master/translations/fr_FR) -* [Spanish](https://github.com/rwldrn/idiomatic.js/tree/master/translations/es_ES) -* [Portuguese - Brazil](https://github.com/rwldrn/idiomatic.js/tree/master/translations/pt_BR) -* [Korean](https://github.com/rwldrn/idiomatic.js/tree/master/translations/ko_KR) -* [Japanese](https://github.com/rwldrn/idiomatic.js/tree/master/translations/ja_JP) -* [Italian](https://github.com/rwldrn/idiomatic.js/tree/master/translations/it_IT) -* [Russian](https://github.com/rwldrn/idiomatic.js/tree/master/translations/ru_RU) -* [Romanian](https://github.com/rwldrn/idiomatic.js/tree/master/translations/ro_RO) -* [简体中文](https://github.com/rwldrn/idiomatic.js/tree/master/translations/zh_CN) -* [Serbian - cyrilic alphabet](https://github.com/rwldrn/idiomatic.js/tree/master/translations/ср_СР) -* [Serbian - latin aplphabet](https://github.com/rwldrn/idiomatic.js/tree/master/translations/sr_SR) - -## Важливе, не ідіоматичне - -### Якість коду: онлайн сервіси, ресурси, посилання - - * [JavaScript Plugin](http://docs.codehaus.org/display/SONAR/JavaScript+Plugin) для [Sonar](http://www.sonarsource.org/) - * [jsPerf](http://jsperf.com/) - * [jsFiddle](http://jsfiddle.net/) - * [jsbin](http://jsbin.com/) - * [JavaScript Lint (JSL)](http://javascriptlint.com/) - * [jshint](http://jshint.com/) - * [jslint](http://jslint.org/) - -[Використання інструментів по покращенню коду від Антона Ковалева](http://anton.kovalyov.net/slides/gothamjs/) - -### Ставай розумнішим - -### [ECMAScript 5.1 з коментарями](http://es5.github.com/) -### [Специфікації мови ECMAScript, видання 5.1](http://ecma-international.org/ecma-262/5.1/) - -Наступне потрібо вважати 1) незакінченим, и 2) *ОБОВ'ЯЗКОВИМ ДО ПРОЧИТАННЯ*. Я не завжди згідний з стилями даних авторів, але одне є точно: вони консистентні. Крім того, це канони для мови. - - * [Baseline For Front End Developers](http://rmurphey.com/blog/2012/04/12/a-baseline-for-front-end-developers/) - * [Eloquent JavaScript](http://eloquentjavascript.net/) - * [JavaScript, JavaScript](http://javascriptweblog.wordpress.com/) - * [Adventures in JavaScript Development](http://rmurphey.com/) - * [Perfection Kills](http://perfectionkills.com/) - * [Douglas Crockford's Wrrrld Wide Web](http://www.crockford.com) - * [JS Assessment](https://github.com/rmurphey/js-assessment) - -### Компіляція і розгортання - -Проекти поивнні старатись включати в себе певний інструментарій для контролю стилю, тестування і стиснення коду. Для цього ви можете використовувати [grunt](https://github.com/cowboy/grunt) від Ben Alman. - - - -### Тестування - -Проекти повинні мати юніт, еталонні, "по реалізації" або функціональні тести. Демонстрація сценаріїв НЕ ЯВЛЯЄТЬСЯ тестом. Нижче наведений списоу фреймворків для тестування, ні один із них не отримав більшого схвалення, ніж інший. - - * [QUnit](http://github.com/jquery/qunit) - * [Jasmine](https://github.com/pivotal/jasmine) - * [Vows](https://github.com/cloudhead/vows) - * [Mocha](https://github.com/visionmedia/mocha) - * [Hiro](http://hirojs.com/) - * [JsTestDriver](https://code.google.com/p/js-test-driver/) - * [Buster.js](http://busterjs.org/) - -## Зміст - - * [Пробіли, табуляція, порожні рядки](#whitespace) - * [Гарний синтаксис](#spacing) - * [Перевірка типів (Інструкція по стилю від команди jQuery Core)](#type) - * [Умовні обчислення](#cond) - * [практичний стиль](#practical) - * [Найменування](#naming) - * [Різне](#misc) - * ["Рідні" і "чужі" об'єкти](#native) - * [Коментарі](#comments) - * [Код однієї мови](#language) - - ------------------------------------------------- - - -## Передмова - -Наступні секції описують прийнятну інструкцію по стилю для сучасної розробки на JavaScript і не являються обов’язковими.Найважливіше - це **закон написання консистентного коду**. Який стиль ви б не вибрали для вашого проекту, він повинен вважатись законом. Ссилайтесь на даний документ як на заяву про відношення вашого проекту до консистентності коду, читабельності і зручності супроводу. - - - -## Маніфест Ідіоматичного Стилю - -1. Пробіли, табуляція і порожні рядки - - Ніколи не змішуйте пробіли і знаки табуляції. - - Перед тим як почати проект, перед тим, як писати код, виберіть між "м’якими" відступами(пробіли) або знаками табуляції і вважайте це **законом**. - - Для кращої читабельності коду, я завжди рекомендую виставити розмір відступу в вашому редакторі на 2 символи &mdash - це або два пробіли, або два пробіли які являються знаком табуляції. - - Завжди працюйте з увімкнутою опцією "показати приховане", якщо ваш редактор підтримує її. Переваги: - - вимушена послідовність - - видалення пробілу в кінці рядка - - видалення порожніх рядків - - читабельні коміти та діффи - -2. Гарний Синтаксис - - A. Дужки, Фігурні Дужки, Перенос Рядка - - ```javascript - - // if/else/for/while/try завжди розділяються пробілом, - // це покращує читабельність - - // 2.A.1.1 - // // Приклад нерозбірливого синтаксису - - if(condition) doSomething(); - - while(condition) iterating++; - - for(var i=0;i<100;i++) someInterativeFn(); - - // 2.A.1.1 - // Використовуйте пробіли для того, щоб покращити читабельність - - if ( condition ) { - // вирази - } - - while ( condition ) { - // вирази - } - - for ( var i = 0; i < 100; i++ ) { - // вирази - } - - // Ще краще: - - var i, - length = 100; - - for ( i = 0; i < length; i++ ) { - // вирази - } - - // Або... - - var i = 0, - length = 100; - - for ( ; i < length; i++ ) { - // вирази - } - - var prop; - - for ( prop in object ) { - // вирази - } - - - if ( true ) { - // вирази - } else { - // вирази - } - ``` - - - B. Присвоєння, Оголошення, Функції(Іменовані, Функції-Вирази, Функціх-Конструктори) - - ```javascript - - // 2.B.1.1 - // Змінні - var foo = "bar", - num = 1, - undef; - - // Оголошення літералів: - var array = [], - object = {}; - - - // 2.B.1.2 - // Використання тільки одного `var` на одну область видимості покращує читабельність - - // і впорядковує блок оголошення змінних(також зберігає вам декілька символів) - - // Неправильно - var foo = ""; - var bar = ""; - var qux; - - // Правильно - var foo = "", - bar = "", - quux; - - // або... - var // коментар для змінних - foo = "", - bar = "", - quux; - - // 2.B.1.3 - // Оператор var завжди повинен бути на початку області видимості(функції) - // Те саме вірно для констант і оператора let із ECMAScript 6. - - // Неправильно - function foo() { - - // вирази - - var bar = "", - qux; - } - - // Правильно - function foo() { - var bar = "", - qux; - - // всі вирази після оголошеня змінних. - } - ``` - - ```javascript - - // 2.B.2.1 - // Оголошення Іменованих Функцій - function foo( arg1, argN ) { - - } - - // Використання - foo( arg1, argN ); - - - // 2.B.2.2 - // Оголошення Іменованих Функцій - function square( number ) { - return number * number; - } - - // Використання - square( 10 ); - - // Дуже надуманий стиль передачі параметрів - function square( number, callback ) { - callback( number * number ); - } - - square( 10, function( square ) { - // зворотній виклик - }); - - // 2.B.2.3 - // Функція-Вираз - var square = function( number ) { - // повернути щось важливе і цінне - return number * number; - }; - - // Функція-Вираз з Ідентифікатором - // Таке оголошення гарне тим, що функція може викликати сама себе - // і її ім’я буде видно в стеку викликів функцій: - var factorial = function factorial( number ) { - if ( number < 2 ) { - return 1; - } - - return number * factorial( number-1 ); - }; - - // 2.B.2.4 - // Оголошення Конструктора - function FooBar( options ) { - - this.options = options; - } - - // Використання - var fooBar = new FooBar({ a: "alpha" }); - - fooBar.options; - // { a: "alpha" } - - ``` - - - C. Виключення, Незначні відхилення від правил - - ```javascript - - // 2.C.1.1 - // Функции с обратным вызовом - foo(function() { - // Заметьте, что пробела между "function" и первой скобкой нет - }); - - // Функция, которая принимает массив как параметр, тоже без пробела - foo([ "alpha", "beta" ]); - - // 2.C.1.2 - // Функция, которая принимает объект как параметр, тоже без пробела - foo({ - a: "alpha", - b: "beta" - }); - - // Одна строка, тоже без пробела - foo("bar"); - - // Внутренние скобки, тоже без пробела - if ( !("foo" in obj) ) { - - } - - ``` - - D. Консистентность Всегда Побеждает - - В секции 2.A-2.C, правила использования пробела и знака табуляции установлены с простой целью: консистентность. - Очень важно отметить, что предпочтения в форматировании, такие как "внутренний пробел", должны считаться опциональными, но в вашем проекте должен использоваться только один стиль форматирования. - - ```javascript - - // 2.D.1.1 - - if (condition) { - // выражения - } - - while (condition) { - // выражения - } - - for (var i = 0; i < 100; i++) { - // выражения - } - - if (true) { - // выражения - } else { - // выражения - } - - ``` - - E. Кавычки - - Абсолютно неважно, какие кавычки вы используете (одинарные или двойные), нет никакой разницы в том, как JavaScript обрабатывает их. Что **действительно важно**, это сохранять консистентность. **Никогда не путайте кавычки в вашем проекте. Выберите один стиль и придерживайтесь его.** - - F. Конец строки и пустые строки - - Пробелы, знаки табуляции могут испортить диффы и сделать чэнджсеты непригодными для чтения. Подумайте о том, чтобы убирать пробелы в конце строк и пустые строки автоматически перед коммитом. - -3. Проверка типов (Руководство по стилю от jQuery Core) - - A. Типы - - String: - - typeof variable === "string" - - Number: - - typeof variable === "number" - - Boolean: - - typeof variable === "boolean" - - Object: - - typeof variable === "object" - - Array: - - Array.isArray( arrayLikeObject ) - (где возможно) - - Node: - - elem.nodeType === 1 - - null: - - variable === null - - null or undefined: - - variable == null - - undefined: - - Глобальные переменные: - - typeof variable === "undefined" - - Локальные переменные: - - variable === undefined - - Свойства: - - object.prop === undefined - object.hasOwnProperty( prop ) - "prop" in object - - B. Неявное приведение типов - - Представьте результат следующего... - - Пусть дан следующий HTML: - - ```html - - - - ``` - - - ```js - - // 3.B.1.1 - - // `foo` была объявлена, ей был присвоен `0` и ее тип `number` - var foo = 0; - - // typeof foo; - // "number" - ... - - // Далее в коде вам нужно обновить значение `foo` - // новым значением из input элемента - - foo = document.getElementById("foo-input").value; - - // Если бы вы проверили тип переменной сейчас `typeof foo`, то получили бы `string` - // Это значит, что если бы вы тестировали `foo` вот так: - - if ( foo === 1 ) { - - importantTask(); - - } - - // то `importantTask()` не была вызвана, даже если значение `foo` было бы "1" - - - // 3.B.1.2 - - // Вы можете избежать ошибок, используя приведение типов с помощью унарных операторов "+" и "-": - - foo = +document.getElementById("foo-input").value; - // ^ унарный оператор + приведет правую часть выражения к типу `number` - - // typeof foo; - // "number" - - if ( foo === 1 ) { - - importantTask(); - - } - - // `importantTask()` будет вызвана - ``` - - Вот несколько простых примеров приведения типов: - - - ```javascript - - // 3.B.2.1 - - var number = 1, - string = "1", - bool = false; - - number; - // 1 - - number + ""; - // "1" - - string; - // "1" - - +string; - // 1 - - +string++; - // 1 - - string; - // 2 - - bool; - // false - - +bool; - // 0 - - bool + ""; - // "false" - ``` - - - ```javascript - // 3.B.2.2 - - var number = 1, - string = "1", - bool = true; - - string === number; - // false - - string === number + ""; - // true - - +string === number; - // true - - bool === number; - // false - - +bool === number; - // true - - bool === string; - // false - - bool === !!string; - // true - ``` - - ```javascript - // 3.B.2.3 - - var array = [ "a", "b", "c" ]; - - !!~array.indexOf("a"); - // true - - !!~array.indexOf("b"); - // true - - !!~array.indexOf("c"); - // true - - !!~array.indexOf("d"); - // false - - // Заметьте, что вышеизложенное можно считать "черезчур умным" - // Лучше делать так: - - if ( array.indexOf( "a" ) >= 0 ) { - // ... - } - ``` - - ```javascript - // 3.B.2.3 - - - var num = 2.5; - - parseInt( num, 10 ); - - // то же самое, что и ... - - ~~num; - - num >> 0; - - num >>> 0; - - // Во всех случаях результат равен 2 - - - // Помните, что отрицательные числа будут обработаны по-другому... - - var neg = -2.5; - - parseInt( neg, 10 ); - - // тоже самое что... - - ~~neg; - - neg >> 0; - - // Во всех случаях результат равен -2 - // Хотя... - - neg >>> 0; - - // покажет 4294967294 - - - - - ``` - - - -4. Условное Вычисление/Обработка - - ```javascript - - // 4.1.1 - // Проверяя, есть ли у массива длина, - // вместо: - if ( array.length > 0 ) ... - - // проверяйте значение выражения: - if ( array.length ) ... - - - // 4.1.2 - // Проверяя, пустой ли массив: - // вместо: - if ( array.length === 0 ) ... - - // проверяйте значение выражения: - if ( !array.length ) ... - - - // 4.1.3 - // Проверяя, не пуста ли строка: - // вместо: - if ( string !== "" ) ... - - // проверяйте значение выражения: - if ( string ) ... - - - // 4.1.4 - // Проверяя, пустая ли строка: - // вместо: - if ( string === "" ) ... - - // проверяйте ложно ли выражение: - if ( !string ) ... - - - // 4.1.5 - // Проверяя, является ли переменная истиной, - // вместо: - if ( foo === true ) ... - - // проверяйте следующим образом: - if ( foo ) ... - - - // 4.1.6 - // Проверяя, является ли переменная ложью, - // вместо: - if ( foo === false ) ... - - // проверяйте, используя отрицание: - if ( !foo ) ... - - // ...Будьте осторожны, потому что это выражение справедливо и для: 0, "", null, undefined, NaN - // Для проверки значения заведомо ложных выражений, используйте: - if ( foo === false ) ... - - - // 4.1.7 - // Проверяя, если переменная null или undefined, но НЕ ложь, "" или 0, - // вместо: - if ( foo === null || foo === undefined ) ... - - // ...воспользуйтесь оператором ==: - if ( foo == null ) ... - - // Помните, что сравнение с помощью оператора == с `null` сработает для ОБОИХ `null` и `undefined` - // но не для `false`, "" или 0 - null == undefined - - ``` - ВСЕГДА оценивайте самый лучший и точный результат - выше приведено руководство, а не догма. - - ```javascript - - // 4.2.1 - // Приведение типов и оценка выражений - - // Отдавайте предпочтение `===`, а не `==` (только если конкретный случай не требует слабо типизированной оценки) - - // === не приводит типы принудительно, т.е.: - - "1" === 1; - // false - - // == приводит типы принудительно, т.е.: - - "1" == 1; - // true - - - // 4.2.2 - // Логические выражения, Истинные и Ложные - - // Логические выражения: - true, false - - // Истинные: - "foo", 1 - - // Ложные: - "", 0, null, undefined, NaN, void 0 - - ``` - - -5. Стиль на практике - - ```javascript - - // 5.1.1 - // Модуль - - (function( global ) { - var Module = (function() { - - var data = "secret"; - - return { - // Логическое свойство - bool: true, - // Свойство типа строка - string: "a string", - // Свойство - массив - array: [ 1, 2, 3, 4 ], - // Свойство - объект - object: { - lang: "en-Us" - }, - getData: function() { - // получить текущее значение переменной `data` - return data; - }, - setData: function( value ) { - // присвоить значение переменной `data` и вернуть его - return ( data = value ); - } - }; - })(); - - // Другие объявления - - // делаем наш модуль глобальным - global.Module = Module; - - })( this ); - - ``` - - ```javascript - - // 5.2.1 - // Конструктор - - (function( global ) { - - function Ctor( foo ) { - - this.foo = foo; - - return this; - } - - Ctor.prototype.getFoo = function() { - return this.foo; - }; - - Ctor.prototype.setFoo = function( val ) { - return ( this.foo = val ); - }; - - - // Чтобы вызывать конструктор без использования оператора `new`, можно объявить конструктор так: - var ctor = function( foo ) { - return new Ctor( foo ); - }; - - - // делаем наш конструктор глобальным - global.ctor = ctor; - - })( this ); - - ``` - - - -6. Именование - - - A. Вы не компилятор или компрессор, так что не пытайтесь быть одним из них. - - Весь последующий код является примером плохого именования переменных: - - ```javascript - - // 6.A.1.1 - // Пример кода с "бедными на описание" именами переменных - - function q(s) { - return document.querySelectorAll(s); - } - var i,a=[],els=q("#foo"); - for(i=0;iРазное - - Этот раздел описывает идеи и концепции, которые не должны рассматриваться как догма. Он существуют для того, чтобы посеять сомнения в общепринятых методах в попытке найти более эффективные способы для выполнения общих задач программирования на JavaScript. - - A. Использование `switch` следует избегать, потому что современный метод отладки будет скрывать вызовы функций, которые используют `switch`. - - В последних версиях браузеров Firefox и Chrome, кажется, есть значительные улучшения в исполнении функций, которые используют `switch`. - http://jsperf.com/switch-vs-object-literal-vs-module - - На заметные улучшения также можно посмотреть тут: - https://github.com/rwldrn/idiomatic.js/issues/13 - - ```javascript - - // 7.A.1.1 - // Пример оператора switch - - switch( foo ) { - case "alpha": - alpha(); - break; - case "beta": - beta(); - break; - default: - // какое-то значение по умолчанию - break; - } - - // 7.A.1.2 - // Лучшим подходом было бы использовать объект или даже модуль: - - var switchObj = { - alpha: function() { - // выражения - // возвращаем результат - }, - beta: function() { - // выражения - // возвращаем результат - }, - _default: function() { - // выражения - // возвращаем результат - } - }; - - var switchModule = (function () { - return { - alpha: function() { - // выражения - // возвращаем результат - }, - beta: function() { - // выражения - // возвращаем результат - }, - _default: function() { - // выражения - // возвращаем результат - } - }; - })(); - - - // 7.A.1.3 - // Если `foo` это свойство `switchObj` или `switchModule`, то выполнить метод... - - ( Object.hasOwnProperty.call( switchObj, foo ) && switchObj[ foo ] || switchObj._default )( args ); - - ( Object.hasOwnProperty.call( switchObj, foo ) && switchModule[ foo ] || switchModule._default )( args ); - - // Если вы знаете возможные значения `foo` и доверяете его источнику, вы можете опустить условие ИЛИ - // оставив только выполнение - - switchObj[ foo ]( args ); - - switchModule[ foo ]( args ); - - - // Эта модель также поддерживает повторное использование кода. - - ``` - - B. "Ранние возвраты" способствуют читабельности кода с незначительной разницей в производительности - - ```javascript - - // 7.B.1.1 - // Неправильно: - function returnLate( foo ) { - var ret; - - if ( foo ) { - ret = "foo"; - } else { - ret = "quux"; - } - return ret; - } - - // Правильно: - - function returnEarly( foo ) { - - if ( foo ) { - return "foo"; - } - return "quux"; - } - - ``` - - -8. "Родные" и "чужие" объекты - - Основное правило: - - ### Не делайте тупых вещей и все будет хорошо. - - Для лучшего понимания этой концепции, посмотрите вот это видео: - - #### “Everything is Permitted: Extending Built-ins” by Andrew Dupont (JSConf2011, Portland, Oregon) - - - - http://blip.tv/jsconf/jsconf2011-andrew-dupont-everything-is-permitted-extending-built-ins-5211542 - - -9. Комментарии - - * Однострочные комментарии на линию выше кода - * Комментарии в несколько строк тоже приветствуются - * Комментарии в конце строки запрещены! - * Стиль JSDoc хорош, но в нем нужно долго разбираться - - -10. Код Одного Языка - -Программы должны быть написаны на одном языке (независимо от языка), как требуют того люди, которые сопровождают код. - -## Приложение - -### Первая Запятая. - -Любой проект, который ссылается на этот документ в качестве руководства по стилю, не примет форматирование кода "первой запятой", только если автор специально не укажется этого. +# Принципи написання консистентного, ідіоматичного коду на JavaScript *** + +##Це "живий" документ і нові ідеї по покращенню коду завжди заохочуються. Візьміть участь: fork, clone, branch, commit, push, pull request. *** + +* Rick Waldron [@rwaldron](http://twitter.com/rwaldron), [github](https://github.com/rwldrn) +* Mathias Bynens [@mathias](http://twitter.com/mathias), [github](https://github.com/mathiasbynens) +* Schalk Neethling [@ossreleasefeed](http://twitter.com/ossreleasefeed), [github](https://github.com/ossreleasefeed/) +* Kit Cambridge [@kitcambridge](http://twitter.com/kitcambridge), [github](https://github.com/kitcambridge) +* Raynos [github](https://github.com/Raynos) +* Matias Arriola [@MatiasArriola](https://twitter.com/MatiasArriola), [github](https://github.com/MatiasArriola/) +* John Fischer [@jfroffice](https://twitter.com/jfroffice), [github](https://github.com/jfroffice/) +* Idan Gazit [@idangazit](http://twitter.com/idangazit), [github](https://github.com/idangazit) +* Leo Balter [@leobalter](http://twitter.com/leobalter), [github](https://github.com/leobalter) +* Breno Oliveira [@garu_rj](http://twitter.com/garu_rj), [github](https://github.com/garu) +* Leo Beto Souza [@leobetosouza](http://twitter.com/leobetosouza), [github](https://github.com/leobetosouza) +* Ryuichi Okumura [@okuryu](http://twitter.com/okuryu), [github](https://github.com/okuryu) +* Pascal Precht [@PascalPrecht](http://twitter.com/PascalPrecht), [github](https://github.com/pascalprecht) +* EngForDev [engfordev](http://www.opentutorials.org/course/167/1363) - Hwan Min Hong / MinTaek Kwon [@leoinsight](http://twitter.com/leoinsight) / Tw Shim [@marocchino](http://twitter.com/marocchino), [github](https://github.com/marocchino) / Nassol Kim [@nassol99](http://twitter.com/nassol99), [github](https://github.com/nassol) / Juntai Park [@rkJun](http://twitter.com/rkJun), [github](https://github.com/rkJun) / Minkyu Shim / Gangmin Won / Justin Yoo [@justinchronicle](http://twitter.com/justinchronicle) / Daeyup Lee +* Marco Trulla [@marcotrulla](http://twitter.com/marcotrulla), [github](https://github.com/Ragnarokkr) +* Alex Navasardyan [@alexnavasardyan](http://twitter.com/alexnavasardyan), [github](https://github.com/2k00l) +* Mihai Paun [@mihaipaun](http://twitter.com/mihaipaun), [github](https://github.com/mihaipaun) +* Evgeny Mandrikov [@\_godin\_](http://twitter.com/_godin_), [github](https://github.com/Godin) +* Sofish Lin [@sofish](http://twitter.com/sofish), [github](https://github.com/sofish) +* Дејан Димић [@dejan_dimic](http://twitter.com/dejan_dimic), [github](https://github.com/rubystream) +* Miloš Gavrilović [@gavrisimo](http://twitter.com/gavrisimo), [github](https://github.com/gavrisimo) + + +## Код в будь-якому проекті повинен виглядати так, ніби його писала одна людина, не залежно від того, скільки людей працювало над ним. *** + +### Все наступне є списком норм, якими я керуюсь при написанні коду, автором якого я є; будь-який вклад в проекти, які я створив, повинен відповідати даним нормам. *** + +### Я не маю наміру нав'язувати свої вподобання в стилі іншим; власний стиль написання коду гідний поваги. + +> ### "Суперечки з приводу стилів бузглузді. У вас повинен бути посібник по стилю і ви повинні слідувати йому." +>_Rebecca_ _Murphey_ + +  + +> ### "Щоб бути хорошим керівником проекту, потрібно розуміти, що писати код для себе - це погана ідея. Якщо ваш код використовують тисячі людей, то пишіть свій код максимально зрозуміло, а не на власний розсуд." +>_Idan_ _Gazit_ + +## Переклади + +* [ORIGINAL](https://github.com/rwldrn/idiomatic.js/) +* [German](https://github.com/rwldrn/idiomatic.js/tree/master/translations/de_DE) +* [French](https://github.com/rwldrn/idiomatic.js/tree/master/translations/fr_FR) +* [Spanish](https://github.com/rwldrn/idiomatic.js/tree/master/translations/es_ES) +* [Portuguese - Brazil](https://github.com/rwldrn/idiomatic.js/tree/master/translations/pt_BR) +* [Korean](https://github.com/rwldrn/idiomatic.js/tree/master/translations/ko_KR) +* [Japanese](https://github.com/rwldrn/idiomatic.js/tree/master/translations/ja_JP) +* [Italian](https://github.com/rwldrn/idiomatic.js/tree/master/translations/it_IT) +* [Russian](https://github.com/rwldrn/idiomatic.js/tree/master/translations/ru_RU) +* [Romanian](https://github.com/rwldrn/idiomatic.js/tree/master/translations/ro_RO) +* [简体中文](https://github.com/rwldrn/idiomatic.js/tree/master/translations/zh_CN) +* [Serbian - cyrilic alphabet](https://github.com/rwldrn/idiomatic.js/tree/master/translations/ср_СР) +* [Serbian - latin aplphabet](https://github.com/rwldrn/idiomatic.js/tree/master/translations/sr_SR) + +## Важливе, не ідіоматичне + +### Якість коду: онлайн сервіси, ресурси, посилання + + * [JavaScript Plugin](http://docs.codehaus.org/display/SONAR/JavaScript+Plugin) для [Sonar](http://www.sonarsource.org/) + * [jsPerf](http://jsperf.com/) + * [jsFiddle](http://jsfiddle.net/) + * [jsbin](http://jsbin.com/) + * [JavaScript Lint (JSL)](http://javascriptlint.com/) + * [jshint](http://jshint.com/) + * [jslint](http://jslint.org/) + +[Використання інструментів по покращенню коду від Антона Ковалева](http://anton.kovalyov.net/slides/gothamjs/) + +### Ставай розумнішим + +### [ECMAScript 5.1 з коментарями](http://es5.github.com/) +### [Специфікації мови ECMAScript, видання 5.1](http://ecma-international.org/ecma-262/5.1/) + +Наступне потрібо вважати 1) незакінченим, и 2) *ОБОВ'ЯЗКОВИМ ДО ПРОЧИТАННЯ*. Я не завжди згідний з стилями даних авторів, але одне є точно: вони консистентні. Крім того, це канони для мови. + + * [Baseline For Front End Developers](http://rmurphey.com/blog/2012/04/12/a-baseline-for-front-end-developers/) + * [Eloquent JavaScript](http://eloquentjavascript.net/) + * [JavaScript, JavaScript](http://javascriptweblog.wordpress.com/) + * [Adventures in JavaScript Development](http://rmurphey.com/) + * [Perfection Kills](http://perfectionkills.com/) + * [Douglas Crockford's Wrrrld Wide Web](http://www.crockford.com) + * [JS Assessment](https://github.com/rmurphey/js-assessment) + +### Компіляція і розгортання + +Проекти повинні старатись включати в себе певний інструментарій для контролю стилю, тестування і стиснення коду. Для цього ви можете використовувати [grunt](https://github.com/cowboy/grunt) від Ben Alman. + + + +### Тестування + +Проекти повинні мати юніт, еталонні, "по реалізації" або функціональні тести. Демонстрація сценаріїв НЕ ЯВЛЯЄТЬСЯ тестом. Нижче наведений списоу фреймворків для тестування, ні один із них не отримав більшого схвалення, ніж інший. + + * [QUnit](http://github.com/jquery/qunit) + * [Jasmine](https://github.com/pivotal/jasmine) + * [Vows](https://github.com/cloudhead/vows) + * [Mocha](https://github.com/visionmedia/mocha) + * [Hiro](http://hirojs.com/) + * [JsTestDriver](https://code.google.com/p/js-test-driver/) + * [Buster.js](http://busterjs.org/) + +## Зміст + + * [Пробіли, табуляція, порожні рядки](#whitespace) + * [Гарний синтаксис](#spacing) + * [Перевірка типів (Інструкція по стилю від команди jQuery Core)](#type) + * [Умовні обчислення](#cond) + * [практичний стиль](#practical) + * [Найменування](#naming) + * [Різне](#misc) + * ["Рідні" і "чужі" об'єкти](#native) + * [Коментарі](#comments) + * [Код однієї мови](#language) + + +------------------------------------------------ + + +## Передмова + +Наступні секції описують прийнятну інструкцію по стилю для сучасної розробки на JavaScript і не являються обов’язковими.Найважливіше - це **закон написання консистентного коду**. Який стиль ви б не вибрали для вашого проекту, він повинен вважатись законом. Ссилайтесь на даний документ як на заяву про відношення вашого проекту до консистентності коду, читабельності і зручності супроводу. + + + +## Маніфест Ідіоматичного Стилю + +1. Пробіли, табуляція і порожні рядки + - Ніколи не змішуйте пробіли і знаки табуляції. + - Перед тим як почати проект, перед тим, як писати код, виберіть між "м’якими" відступами(пробіли) або знаками табуляції і вважайте це **законом**. + - Для кращої читабельності коду, я завжди рекомендую виставити розмір відступу в вашому редакторі на 2 символи &mdash - це або два пробіли, або два пробіли які являються знаком табуляції. + - Завжди працюйте з увімкнутою опцією "показати приховане", якщо ваш редактор підтримує її. Переваги: + - вимушена послідовність + - видалення пробілу в кінці рядка + - видалення порожніх рядків + - читабельні коміти та діффи + +2. Гарний Синтаксис + + A. Дужки, Фігурні Дужки, Перенос Рядка + + ```javascript + + // if/else/for/while/try завжди розділяються пробілом, + // це покращує читабельність + + // 2.A.1.1 + // // Приклад нерозбірливого синтаксису + + if(condition) doSomething(); + + while(condition) iterating++; + + for(var i=0;i<100;i++) someInterativeFn(); + + // 2.A.1.1 + // Використовуйте пробіли для того, щоб покращити читабельність + + if ( condition ) { + // вирази + } + + while ( condition ) { + // вирази + } + + for ( var i = 0; i < 100; i++ ) { + // вирази + } + + // Ще краще: + + var i, + length = 100; + + for ( i = 0; i < length; i++ ) { + // вирази + } + + // Або... + + var i = 0, + length = 100; + + for ( ; i < length; i++ ) { + // вирази + } + + var prop; + + for ( prop in object ) { + // вирази + } + + + if ( true ) { + // вирази + } else { + // вирази + } + ``` + + + B. Присвоєння, Оголошення, Функції(Іменовані, Функції-Вирази, Функціх-Конструктори) + + ```javascript + + // 2.B.1.1 + // Змінні + var foo = "bar", + num = 1, + undef; + + // Оголошення літералів: + var array = [], + object = {}; + + + // 2.B.1.2 + // Використання тільки одного `var` на одну область видимості покращує читабельність + + // і впорядковує блок оголошення змінних(також зберігає вам декілька символів) + + // Неправильно + var foo = ""; + var bar = ""; + var qux; + + // Правильно + var foo = "", + bar = "", + quux; + + // або... + var // коментар для змінних + foo = "", + bar = "", + quux; + + // 2.B.1.3 + // Оператор var завжди повинен бути на початку області видимості(функції) + // Те саме вірно для констант і оператора let із ECMAScript 6. + + // Неправильно + function foo() { + + // вирази + + var bar = "", + qux; + } + + // Правильно + function foo() { + var bar = "", + qux; + + // всі вирази після оголошеня змінних. + } + ``` + + ```javascript + + // 2.B.2.1 + // Оголошення Іменованих Функцій + function foo( arg1, argN ) { + + } + + // Використання + foo( arg1, argN ); + + + // 2.B.2.2 + // Оголошення Іменованих Функцій + function square( number ) { + return number * number; + } + + // Використання + square( 10 ); + + // Дуже надуманий стиль передачі параметрів + function square( number, callback ) { + callback( number * number ); + } + + square( 10, function( square ) { + // зворотній виклик + }); + + // 2.B.2.3 + // Функція-Вираз + var square = function( number ) { + // повернути щось важливе і цінне + return number * number; + }; + + // Функція-Вираз з Ідентифікатором + // Таке оголошення гарне тим, що функція може викликати сама себе + // і її ім’я буде видно в стеку викликів функцій: + var factorial = function factorial( number ) { + if ( number < 2 ) { + return 1; + } + + return number * factorial( number-1 ); + }; + + // 2.B.2.4 + // Оголошення Конструктора + function FooBar( options ) { + + this.options = options; + } + + // Використання + var fooBar = new FooBar({ a: "alpha" }); + + fooBar.options; + // { a: "alpha" } + + ``` + + + C. Виключення, Незначні відхилення від правил + + ```javascript + + // 2.C.1.1 + // Функции с обратным вызовом + foo(function() { + // Заметьте, что пробела между "function" и первой скобкой нет + }); + + // Функция, которая принимает массив как параметр, тоже без пробела + foo([ "alpha", "beta" ]); + + // 2.C.1.2 + // Функция, которая принимает объект как параметр, тоже без пробела + foo({ + a: "alpha", + b: "beta" + }); + + // Одна строка, тоже без пробела + foo("bar"); + + // Внутренние скобки, тоже без пробела + if ( !("foo" in obj) ) { + + } + + ``` + + D. Консистентность Всегда Побеждает + + В секции 2.A-2.C, правила использования пробела и знака табуляции установлены с простой целью: консистентность. + Очень важно отметить, что предпочтения в форматировании, такие как "внутренний пробел", должны считаться опциональными, но в вашем проекте должен использоваться только один стиль форматирования. + + ```javascript + + // 2.D.1.1 + + if (condition) { + // выражения + } + + while (condition) { + // выражения + } + + for (var i = 0; i < 100; i++) { + // выражения + } + + if (true) { + // выражения + } else { + // выражения + } + + ``` + + E. Кавычки + + Абсолютно неважно, какие кавычки вы используете (одинарные или двойные), нет никакой разницы в том, как JavaScript обрабатывает их. Что **действительно важно**, это сохранять консистентность. **Никогда не путайте кавычки в вашем проекте. Выберите один стиль и придерживайтесь его.** + + F. Конец строки и пустые строки + + Пробелы, знаки табуляции могут испортить диффы и сделать чэнджсеты непригодными для чтения. Подумайте о том, чтобы убирать пробелы в конце строк и пустые строки автоматически перед коммитом. + +3. Проверка типов (Руководство по стилю от jQuery Core) + + A. Типы + + String: + + typeof variable === "string" + + Number: + + typeof variable === "number" + + Boolean: + + typeof variable === "boolean" + + Object: + + typeof variable === "object" + + Array: + + Array.isArray( arrayLikeObject ) + (где возможно) + + Node: + + elem.nodeType === 1 + + null: + + variable === null + + null or undefined: + + variable == null + + undefined: + + Глобальные переменные: + + typeof variable === "undefined" + + Локальные переменные: + + variable === undefined + + Свойства: + + object.prop === undefined + object.hasOwnProperty( prop ) + "prop" in object + + B. Неявное приведение типов + + Представьте результат следующего... + + Пусть дан следующий HTML: + + ```html + + + + ``` + + + ```js + + // 3.B.1.1 + + // `foo` была объявлена, ей был присвоен `0` и ее тип `number` + var foo = 0; + + // typeof foo; + // "number" + ... + + // Далее в коде вам нужно обновить значение `foo` + // новым значением из input элемента + + foo = document.getElementById("foo-input").value; + + // Если бы вы проверили тип переменной сейчас `typeof foo`, то получили бы `string` + // Это значит, что если бы вы тестировали `foo` вот так: + + if ( foo === 1 ) { + + importantTask(); + + } + + // то `importantTask()` не была вызвана, даже если значение `foo` было бы "1" + + + // 3.B.1.2 + + // Вы можете избежать ошибок, используя приведение типов с помощью унарных операторов "+" и "-": + + foo = +document.getElementById("foo-input").value; + // ^ унарный оператор + приведет правую часть выражения к типу `number` + + // typeof foo; + // "number" + + if ( foo === 1 ) { + + importantTask(); + + } + + // `importantTask()` будет вызвана + ``` + + Вот несколько простых примеров приведения типов: + + + ```javascript + + // 3.B.2.1 + + var number = 1, + string = "1", + bool = false; + + number; + // 1 + + number + ""; + // "1" + + string; + // "1" + + +string; + // 1 + + +string++; + // 1 + + string; + // 2 + + bool; + // false + + +bool; + // 0 + + bool + ""; + // "false" + ``` + + + ```javascript + // 3.B.2.2 + + var number = 1, + string = "1", + bool = true; + + string === number; + // false + + string === number + ""; + // true + + +string === number; + // true + + bool === number; + // false + + +bool === number; + // true + + bool === string; + // false + + bool === !!string; + // true + ``` + + ```javascript + // 3.B.2.3 + + var array = [ "a", "b", "c" ]; + + !!~array.indexOf("a"); + // true + + !!~array.indexOf("b"); + // true + + !!~array.indexOf("c"); + // true + + !!~array.indexOf("d"); + // false + + // Заметьте, что вышеизложенное можно считать "черезчур умным" + // Лучше делать так: + + if ( array.indexOf( "a" ) >= 0 ) { + // ... + } + ``` + + ```javascript + // 3.B.2.3 + + + var num = 2.5; + + parseInt( num, 10 ); + + // то же самое, что и ... + + ~~num; + + num >> 0; + + num >>> 0; + + // Во всех случаях результат равен 2 + + + // Помните, что отрицательные числа будут обработаны по-другому... + + var neg = -2.5; + + parseInt( neg, 10 ); + + // тоже самое что... + + ~~neg; + + neg >> 0; + + // Во всех случаях результат равен -2 + // Хотя... + + neg >>> 0; + + // покажет 4294967294 + + + + + ``` + + + +4. Условное Вычисление/Обработка + + ```javascript + + // 4.1.1 + // Проверяя, есть ли у массива длина, + // вместо: + if ( array.length > 0 ) ... + + // проверяйте значение выражения: + if ( array.length ) ... + + + // 4.1.2 + // Проверяя, пустой ли массив: + // вместо: + if ( array.length === 0 ) ... + + // проверяйте значение выражения: + if ( !array.length ) ... + + + // 4.1.3 + // Проверяя, не пуста ли строка: + // вместо: + if ( string !== "" ) ... + + // проверяйте значение выражения: + if ( string ) ... + + + // 4.1.4 + // Проверяя, пустая ли строка: + // вместо: + if ( string === "" ) ... + + // проверяйте ложно ли выражение: + if ( !string ) ... + + + // 4.1.5 + // Проверяя, является ли переменная истиной, + // вместо: + if ( foo === true ) ... + + // проверяйте следующим образом: + if ( foo ) ... + + + // 4.1.6 + // Проверяя, является ли переменная ложью, + // вместо: + if ( foo === false ) ... + + // проверяйте, используя отрицание: + if ( !foo ) ... + + // ...Будьте осторожны, потому что это выражение справедливо и для: 0, "", null, undefined, NaN + // Для проверки значения заведомо ложных выражений, используйте: + if ( foo === false ) ... + + + // 4.1.7 + // Проверяя, если переменная null или undefined, но НЕ ложь, "" или 0, + // вместо: + if ( foo === null || foo === undefined ) ... + + // ...воспользуйтесь оператором ==: + if ( foo == null ) ... + + // Помните, что сравнение с помощью оператора == с `null` сработает для ОБОИХ `null` и `undefined` + // но не для `false`, "" или 0 + null == undefined + + ``` + ВСЕГДА оценивайте самый лучший и точный результат - выше приведено руководство, а не догма. + + ```javascript + + // 4.2.1 + // Приведение типов и оценка выражений + + // Отдавайте предпочтение `===`, а не `==` (только если конкретный случай не требует слабо типизированной оценки) + + // === не приводит типы принудительно, т.е.: + + "1" === 1; + // false + + // == приводит типы принудительно, т.е.: + + "1" == 1; + // true + + + // 4.2.2 + // Логические выражения, Истинные и Ложные + + // Логические выражения: + true, false + + // Истинные: + "foo", 1 + + // Ложные: + "", 0, null, undefined, NaN, void 0 + + ``` + + +5. Стиль на практике + + ```javascript + + // 5.1.1 + // Модуль + + (function( global ) { + var Module = (function() { + + var data = "secret"; + + return { + // Логическое свойство + bool: true, + // Свойство типа строка + string: "a string", + // Свойство - массив + array: [ 1, 2, 3, 4 ], + // Свойство - объект + object: { + lang: "en-Us" + }, + getData: function() { + // получить текущее значение переменной `data` + return data; + }, + setData: function( value ) { + // присвоить значение переменной `data` и вернуть его + return ( data = value ); + } + }; + })(); + + // Другие объявления + + // делаем наш модуль глобальным + global.Module = Module; + + })( this ); + + ``` + + ```javascript + + // 5.2.1 + // Конструктор + + (function( global ) { + + function Ctor( foo ) { + + this.foo = foo; + + return this; + } + + Ctor.prototype.getFoo = function() { + return this.foo; + }; + + Ctor.prototype.setFoo = function( val ) { + return ( this.foo = val ); + }; + + + // Чтобы вызывать конструктор без использования оператора `new`, можно объявить конструктор так: + var ctor = function( foo ) { + return new Ctor( foo ); + }; + + + // делаем наш конструктор глобальным + global.ctor = ctor; + + })( this ); + + ``` + + + +6. Именование + + + A. Вы не компилятор или компрессор, так что не пытайтесь быть одним из них. + + Весь последующий код является примером плохого именования переменных: + + ```javascript + + // 6.A.1.1 + // Пример кода с "бедными на описание" именами переменных + + function q(s) { + return document.querySelectorAll(s); + } + var i,a=[],els=q("#foo"); + for(i=0;iРазное + + Этот раздел описывает идеи и концепции, которые не должны рассматриваться как догма. Он существуют для того, чтобы посеять сомнения в общепринятых методах в попытке найти более эффективные способы для выполнения общих задач программирования на JavaScript. + + A. Использование `switch` следует избегать, потому что современный метод отладки будет скрывать вызовы функций, которые используют `switch`. + + В последних версиях браузеров Firefox и Chrome, кажется, есть значительные улучшения в исполнении функций, которые используют `switch`. + http://jsperf.com/switch-vs-object-literal-vs-module + + На заметные улучшения также можно посмотреть тут: + https://github.com/rwldrn/idiomatic.js/issues/13 + + ```javascript + + // 7.A.1.1 + // Пример оператора switch + + switch( foo ) { + case "alpha": + alpha(); + break; + case "beta": + beta(); + break; + default: + // какое-то значение по умолчанию + break; + } + + // 7.A.1.2 + // Лучшим подходом было бы использовать объект или даже модуль: + + var switchObj = { + alpha: function() { + // выражения + // возвращаем результат + }, + beta: function() { + // выражения + // возвращаем результат + }, + _default: function() { + // выражения + // возвращаем результат + } + }; + + var switchModule = (function () { + return { + alpha: function() { + // выражения + // возвращаем результат + }, + beta: function() { + // выражения + // возвращаем результат + }, + _default: function() { + // выражения + // возвращаем результат + } + }; + })(); + + + // 7.A.1.3 + // Если `foo` это свойство `switchObj` или `switchModule`, то выполнить метод... + + ( Object.hasOwnProperty.call( switchObj, foo ) && switchObj[ foo ] || switchObj._default )( args ); + + ( Object.hasOwnProperty.call( switchObj, foo ) && switchModule[ foo ] || switchModule._default )( args ); + + // Если вы знаете возможные значения `foo` и доверяете его источнику, вы можете опустить условие ИЛИ + // оставив только выполнение + + switchObj[ foo ]( args ); + + switchModule[ foo ]( args ); + + + // Эта модель также поддерживает повторное использование кода. + + ``` + + B. "Ранние возвраты" способствуют читабельности кода с незначительной разницей в производительности + + ```javascript + + // 7.B.1.1 + // Неправильно: + function returnLate( foo ) { + var ret; + + if ( foo ) { + ret = "foo"; + } else { + ret = "quux"; + } + return ret; + } + + // Правильно: + + function returnEarly( foo ) { + + if ( foo ) { + return "foo"; + } + return "quux"; + } + + ``` + + +8. "Родные" и "чужие" объекты + + Основное правило: + + ### Не делайте тупых вещей и все будет хорошо. + + Для лучшего понимания этой концепции, посмотрите вот это видео: + + #### “Everything is Permitted: Extending Built-ins” by Andrew Dupont (JSConf2011, Portland, Oregon) + + + + http://blip.tv/jsconf/jsconf2011-andrew-dupont-everything-is-permitted-extending-built-ins-5211542 + + +9. Комментарии + + * Однострочные комментарии на линию выше кода + * Комментарии в несколько строк тоже приветствуются + * Комментарии в конце строки запрещены! + * Стиль JSDoc хорош, но в нем нужно долго разбираться + + +10. Код Одного Языка + +Программы должны быть написаны на одном языке (независимо от языка), как требуют того люди, которые сопровождают код. + +## Приложение + +### Первая Запятая. + +Любой проект, который ссылается на этот документ в качестве руководства по стилю, не примет форматирование кода "первой запятой", только если автор специально не укажется этого. From 29b3271568a64c777095bce3199f33a632e50a8e Mon Sep 17 00:00:00 2001 From: Yuriy Husnay Date: Sat, 20 Apr 2013 11:45:08 +0300 Subject: [PATCH 4/6] translated up to 6/B --- translations/ua_UA/readme.md | 214 +++++++++++++++++------------------ 1 file changed, 107 insertions(+), 107 deletions(-) diff --git a/translations/ua_UA/readme.md b/translations/ua_UA/readme.md index 47affeea..65a5e700 100644 --- a/translations/ua_UA/readme.md +++ b/translations/ua_UA/readme.md @@ -109,7 +109,7 @@ UA * [Гарний синтаксис](#spacing) * [Перевірка типів (Інструкція по стилю від команди jQuery Core)](#type) * [Умовні обчислення](#cond) - * [практичний стиль](#practical) + * [Стиль на практиці](#practical) * [Найменування](#naming) * [Різне](#misc) * ["Рідні" і "чужі" об'єкти](#native) @@ -331,71 +331,71 @@ UA ```javascript // 2.C.1.1 - // Функции с обратным вызовом + // Функції з зворотнім викликом foo(function() { - // Заметьте, что пробела между "function" и первой скобкой нет + // Зауважте, що пробілу між "function" і першою дужкою нема }); - // Функция, которая принимает массив как параметр, тоже без пробела + // Функція, що приймає масив як параметр, теж без пробілу foo([ "alpha", "beta" ]); // 2.C.1.2 - // Функция, которая принимает объект как параметр, тоже без пробела + // Функція, що приймає об’єкт як параметр, теж без пробілу foo({ a: "alpha", b: "beta" }); - // Одна строка, тоже без пробела + // Один рядок - без пробілу foo("bar"); - // Внутренние скобки, тоже без пробела + // Внутрішні дужки теж без пробілу if ( !("foo" in obj) ) { } ``` - D. Консистентность Всегда Побеждает + D. Консистентність Завжди Виграє - В секции 2.A-2.C, правила использования пробела и знака табуляции установлены с простой целью: консистентность. - Очень важно отметить, что предпочтения в форматировании, такие как "внутренний пробел", должны считаться опциональными, но в вашем проекте должен использоваться только один стиль форматирования. + В секції 2.A-2.C, правила використання пробілу і знака табуляції встановлені з простою цілюю: консистентність. + Важливо зазначити, що переваги в форматуванні, такі як "внутрішній пробіл", повинні вважатись опціональними, але в вашому проекті повинен використовуватись тільки один стиль форматування. ```javascript // 2.D.1.1 if (condition) { - // выражения + // вирази } while (condition) { - // выражения + // вирази } for (var i = 0; i < 100; i++) { - // выражения + // вирази } if (true) { - // выражения + // вирази } else { - // выражения + // вирази } ``` - E. Кавычки + E. Лапки - Абсолютно неважно, какие кавычки вы используете (одинарные или двойные), нет никакой разницы в том, как JavaScript обрабатывает их. Что **действительно важно**, это сохранять консистентность. **Никогда не путайте кавычки в вашем проекте. Выберите один стиль и придерживайтесь его.** + Абсолютно не важливо, які лапки ви використовуєте(одинарні чи подвійні), нема різниці в тому, як JavaScript обробляє їх. Що **справді важливо**, так це зберігати консистентність. **Ніколи не плутайте лапки в вашому проекті. Оберіть один стиль і притримуйтель його.** - F. Конец строки и пустые строки + F. Кінець рядка і порожні рядки - Пробелы, знаки табуляции могут испортить диффы и сделать чэнджсеты непригодными для чтения. Подумайте о том, чтобы убирать пробелы в конце строк и пустые строки автоматически перед коммитом. + Пробіли, знаки табуляції можуть зіпсувати діффи і зробити чейнджсети непридатними для читання. Подумайте про те, щоб забирати пробіли в кінці рядка і породні рядки автоматично перед комітом. -3. Проверка типов (Руководство по стилю от jQuery Core) +3. Перевірка типів (Інструкція по стилю від команди jQuery Core) - A. Типы + A. Типи String: @@ -416,7 +416,7 @@ UA Array: Array.isArray( arrayLikeObject ) - (где возможно) + (де можливо) Node: @@ -432,25 +432,25 @@ UA undefined: - Глобальные переменные: + Глобальні змінні: typeof variable === "undefined" - Локальные переменные: + Локальні змінні: variable === undefined - Свойства: + Властивості(properties): object.prop === undefined object.hasOwnProperty( prop ) "prop" in object - B. Неявное приведение типов + B. Неявне приведення типів - Представьте результат следующего... + Представте результат наступного... - Пусть дан следующий HTML: + Нехай дано HTML: ```html @@ -463,20 +463,20 @@ UA // 3.B.1.1 - // `foo` была объявлена, ей был присвоен `0` и ее тип `number` + // `foo` була оголошена, їй був присвоєний `0` и її тип `number` var foo = 0; // typeof foo; // "number" ... - // Далее в коде вам нужно обновить значение `foo` - // новым значением из input элемента + // Далі в коді вам потрібно оновити значення `foo` + // новим значенням із input елемента foo = document.getElementById("foo-input").value; - // Если бы вы проверили тип переменной сейчас `typeof foo`, то получили бы `string` - // Это значит, что если бы вы тестировали `foo` вот так: + // Якби ви перевірили тип змінної зараз `typeof foo`, то отрималм б `string` + // Це означає, що якщо б ви тестували `foo` ось так: if ( foo === 1 ) { @@ -484,15 +484,15 @@ UA } - // то `importantTask()` не была вызвана, даже если значение `foo` было бы "1" + // то `importantTask()` не была викликана, навіит якщо б значення `foo` було б "1" // 3.B.1.2 - // Вы можете избежать ошибок, используя приведение типов с помощью унарных операторов "+" и "-": + // Ви можете уникнути помилок, використовуючи зведення типів за допомогою унарних операторів "+" і "-": foo = +document.getElementById("foo-input").value; - // ^ унарный оператор + приведет правую часть выражения к типу `number` + //унарний оператор "+" зведе праву частину виразу до типу `number` // typeof foo; // "number" @@ -503,10 +503,10 @@ UA } - // `importantTask()` будет вызвана + // `importantTask()` буде викликана ``` - Вот несколько простых примеров приведения типов: + Ось декілька простих прикладів зведення типів: ```javascript @@ -592,8 +592,8 @@ UA !!~array.indexOf("d"); // false - // Заметьте, что вышеизложенное можно считать "черезчур умным" - // Лучше делать так: + // Зауважту, що вищесказане можна вважати "занадто розумним" + // Краще зробити так: if ( array.indexOf( "a" ) >= 0 ) { // ... @@ -608,7 +608,7 @@ UA parseInt( num, 10 ); - // то же самое, что и ... + // те саме що ~~num; @@ -616,27 +616,27 @@ UA num >>> 0; - // Во всех случаях результат равен 2 + // У всіх випадках результат рівний 2 - // Помните, что отрицательные числа будут обработаны по-другому... + // Пам’ятайте, що від’ємні числа будуть опрацьовані іншим чином... var neg = -2.5; parseInt( neg, 10 ); - // тоже самое что... + // те саме що... ~~neg; neg >> 0; - // Во всех случаях результат равен -2 - // Хотя... + // У всіх випадках результат рівний -2 + // Хоча... neg >>> 0; - // покажет 4294967294 + // покаже 4294967294 @@ -645,117 +645,117 @@ UA -4. Условное Вычисление/Обработка +4. Умовні обчислення/Опрацювання ```javascript // 4.1.1 - // Проверяя, есть ли у массива длина, - // вместо: + // Перевіряючи, чи у масиву є довжина + // замість: if ( array.length > 0 ) ... - // проверяйте значение выражения: + // перевіряйте значення виразу: if ( array.length ) ... // 4.1.2 - // Проверяя, пустой ли массив: - // вместо: + // Перевіряючи, чи масив не порожній: + // замість: if ( array.length === 0 ) ... - // проверяйте значение выражения: + // перевіряйте значення виразу: if ( !array.length ) ... // 4.1.3 - // Проверяя, не пуста ли строка: - // вместо: + // Перевіряючи, чи рядок не порожній: + // замість: if ( string !== "" ) ... - // проверяйте значение выражения: + // перевіряйте значення виразу: if ( string ) ... // 4.1.4 - // Проверяя, пустая ли строка: - // вместо: + // Перевіряючи, чи рядок порожній: + // замість: if ( string === "" ) ... - // проверяйте ложно ли выражение: + // перевіряйте значення виразу: if ( !string ) ... // 4.1.5 - // Проверяя, является ли переменная истиной, - // вместо: + // Перевіряючи, чи змінна істинна + // замість: if ( foo === true ) ... - // проверяйте следующим образом: + // перевіряйте наступним чином: if ( foo ) ... // 4.1.6 - // Проверяя, является ли переменная ложью, - // вместо: + // Перевіряючи, чи змінна хибна + // замість: if ( foo === false ) ... - // проверяйте, используя отрицание: + // перевіряйте, використовуючи заперечення: if ( !foo ) ... - // ...Будьте осторожны, потому что это выражение справедливо и для: 0, "", null, undefined, NaN - // Для проверки значения заведомо ложных выражений, используйте: + // ...Будьте уважні, тому що вираз справедливий і для: 0, "", null, undefined, NaN + // Для перевірки завідомо хибних виразів, використовуйте: if ( foo === false ) ... // 4.1.7 - // Проверяя, если переменная null или undefined, но НЕ ложь, "" или 0, - // вместо: + // Перевіряючи, чи змінна null або undefined, але не хибна, "" або 0, + // замість: if ( foo === null || foo === undefined ) ... - // ...воспользуйтесь оператором ==: + // ... скористайтеся оператором ==: if ( foo == null ) ... - // Помните, что сравнение с помощью оператора == с `null` сработает для ОБОИХ `null` и `undefined` - // но не для `false`, "" или 0 + // Пам’ятайте, що за допомогою оператора == з `null` спрацює для ОБОХ `null` і `undefined` + // але не для `false`, "" або 0 null == undefined ``` - ВСЕГДА оценивайте самый лучший и точный результат - выше приведено руководство, а не догма. + Завжди оцінюйте найкращий і точний результат - вище наведено інструкцію, а не догму. ```javascript // 4.2.1 - // Приведение типов и оценка выражений + // Зведення типів і оцінка виразів - // Отдавайте предпочтение `===`, а не `==` (только если конкретный случай не требует слабо типизированной оценки) + // Віддавайте перевагу `===`, а не `==` (тільки якщо конкретний випадок не потребує слабо типізованої оцінки) - // === не приводит типы принудительно, т.е.: + // === не зводить типи примусово, тобто: "1" === 1; // false - // == приводит типы принудительно, т.е.: + // == зводить типи примусово, тобто: "1" == 1; // true // 4.2.2 - // Логические выражения, Истинные и Ложные + // Логічні вирази, Істинні і Хибні - // Логические выражения: + // Логічні вирази: true, false - // Истинные: + // Істинні: "foo", 1 - // Ложные: + // Хибні: "", 0, null, undefined, NaN, void 0 ``` -5. Стиль на практике +5. Стиль на практиці ```javascript @@ -768,30 +768,30 @@ UA var data = "secret"; return { - // Логическое свойство + // Логічна властивість bool: true, - // Свойство типа строка + // Властивість типу рядок string: "a string", - // Свойство - массив + // Властивість - масив array: [ 1, 2, 3, 4 ], - // Свойство - объект + // Властивість - об’єкт object: { lang: "en-Us" }, getData: function() { - // получить текущее значение переменной `data` + // отримати поточне значення змінної `data` return data; }, setData: function( value ) { - // присвоить значение переменной `data` и вернуть его + // присвоїти значення змінної `data` і повернути його return ( data = value ); } }; })(); - // Другие объявления + // Інші оголошення - // делаем наш модуль глобальным + // робимо наш модуль глобальним global.Module = Module; })( this ); @@ -821,13 +821,13 @@ UA }; - // Чтобы вызывать конструктор без использования оператора `new`, можно объявить конструктор так: + // Щоб викликати конструктор без використання оператора `new`, можна оголосити конструктор так: var ctor = function( foo ) { return new Ctor( foo ); }; - // делаем наш конструктор глобальным + // робим наш конструктор глобальним global.ctor = ctor; })( this ); @@ -836,17 +836,17 @@ UA -6. Именование +6. Найменування - A. Вы не компилятор или компрессор, так что не пытайтесь быть одним из них. + A. Ви не компілятор і не компрессор, так що не старайтесь бути одним із них. - Весь последующий код является примером плохого именования переменных: + Весь наступний код являється прикладом поганого найменування змінних: ```javascript // 6.A.1.1 - // Пример кода с "бедными на описание" именами переменных + // Приклад коду з "бідними на описання" іменами змінних function q(s) { return document.querySelectorAll(s); @@ -855,14 +855,14 @@ UA for(i=0;i Date: Mon, 3 Jun 2013 16:31:59 +0300 Subject: [PATCH 5/6] some typo fixes --- translations/ua_UA/readme.md | 2450 +++++++++++++++++----------------- 1 file changed, 1225 insertions(+), 1225 deletions(-) diff --git a/translations/ua_UA/readme.md b/translations/ua_UA/readme.md index 4a76f305..a124458d 100644 --- a/translations/ua_UA/readme.md +++ b/translations/ua_UA/readme.md @@ -1,1225 +1,1225 @@ -<<<<<<< HEAD -# Принципи написання консистентного, ідіоматичного коду на JavaScript *** - -##Це "живий" документ і нові ідеї по покращенню коду завжди заохочуються. Візьміть участь: fork, clone, branch, commit, push, pull request. *** - -* Rick Waldron [@rwaldron](http://twitter.com/rwaldron), [github](https://github.com/rwldrn) -* Mathias Bynens [@mathias](http://twitter.com/mathias), [github](https://github.com/mathiasbynens) -* Schalk Neethling [@ossreleasefeed](http://twitter.com/ossreleasefeed), [github](https://github.com/ossreleasefeed/) -* Kit Cambridge [@kitcambridge](http://twitter.com/kitcambridge), [github](https://github.com/kitcambridge) -* Raynos [github](https://github.com/Raynos) -* Matias Arriola [@MatiasArriola](https://twitter.com/MatiasArriola), [github](https://github.com/MatiasArriola/) -* John Fischer [@jfroffice](https://twitter.com/jfroffice), [github](https://github.com/jfroffice/) -* Idan Gazit [@idangazit](http://twitter.com/idangazit), [github](https://github.com/idangazit) -* Leo Balter [@leobalter](http://twitter.com/leobalter), [github](https://github.com/leobalter) -* Breno Oliveira [@garu_rj](http://twitter.com/garu_rj), [github](https://github.com/garu) -* Leo Beto Souza [@leobetosouza](http://twitter.com/leobetosouza), [github](https://github.com/leobetosouza) -* Ryuichi Okumura [@okuryu](http://twitter.com/okuryu), [github](https://github.com/okuryu) -* Pascal Precht [@PascalPrecht](http://twitter.com/PascalPrecht), [github](https://github.com/pascalprecht) -* EngForDev [engfordev](http://www.opentutorials.org/course/167/1363) - Hwan Min Hong / MinTaek Kwon [@leoinsight](http://twitter.com/leoinsight) / Tw Shim [@marocchino](http://twitter.com/marocchino), [github](https://github.com/marocchino) / Nassol Kim [@nassol99](http://twitter.com/nassol99), [github](https://github.com/nassol) / Juntai Park [@rkJun](http://twitter.com/rkJun), [github](https://github.com/rkJun) / Minkyu Shim / Gangmin Won / Justin Yoo [@justinchronicle](http://twitter.com/justinchronicle) / Daeyup Lee -* Marco Trulla [@marcotrulla](http://twitter.com/marcotrulla), [github](https://github.com/Ragnarokkr) -* Alex Navasardyan [@alexnavasardyan](http://twitter.com/alexnavasardyan), [github](https://github.com/2k00l) -* Mihai Paun [@mihaipaun](http://twitter.com/mihaipaun), [github](https://github.com/mihaipaun) -* Evgeny Mandrikov [@\_godin\_](http://twitter.com/_godin_), [github](https://github.com/Godin) -* Sofish Lin [@sofish](http://twitter.com/sofish), [github](https://github.com/sofish) -* Дејан Димић [@dejan_dimic](http://twitter.com/dejan_dimic), [github](https://github.com/rubystream) -* Miloš Gavrilović [@gavrisimo](http://twitter.com/gavrisimo), [github](https://github.com/gavrisimo) - - -## Код в будь-якому проекті повинен виглядати так, ніби його писала одна людина, не залежно від того, скільки людей працювало над ним. *** - -### Все наступне є списком норм, якими я керуюсь при написанні коду, автором якого я є; будь-який вклад в проекти, які я створив, повинен відповідати даним нормам. *** - -### Я не маю наміру нав'язувати свої вподобання в стилі іншим; власний стиль написання коду гідний поваги. - -> ### "Суперечки з приводу стилів бузглузді. У вас повинен бути посібник по стилю і ви повинні слідувати йому." ->_Rebecca_ _Murphey_ - -  - -> ### "Щоб бути хорошим керівником проекту, потрібно розуміти, що писати код для себе - це погана ідея. Якщо ваш код використовують тисячі людей, то пишіть свій код максимально зрозуміло, а не на власний розсуд." ->_Idan_ _Gazit_ - -## Переклади - -* [ORIGINAL](https://github.com/rwldrn/idiomatic.js/) -* [German](https://github.com/rwldrn/idiomatic.js/tree/master/translations/de_DE) -* [French](https://github.com/rwldrn/idiomatic.js/tree/master/translations/fr_FR) -* [Spanish](https://github.com/rwldrn/idiomatic.js/tree/master/translations/es_ES) -* [Portuguese - Brazil](https://github.com/rwldrn/idiomatic.js/tree/master/translations/pt_BR) -* [Korean](https://github.com/rwldrn/idiomatic.js/tree/master/translations/ko_KR) -* [Japanese](https://github.com/rwldrn/idiomatic.js/tree/master/translations/ja_JP) -* [Italian](https://github.com/rwldrn/idiomatic.js/tree/master/translations/it_IT) -* [Russian](https://github.com/rwldrn/idiomatic.js/tree/master/translations/ru_RU) -* [Romanian](https://github.com/rwldrn/idiomatic.js/tree/master/translations/ro_RO) -* [简体中文](https://github.com/rwldrn/idiomatic.js/tree/master/translations/zh_CN) -* [Serbian - cyrilic alphabet](https://github.com/rwldrn/idiomatic.js/tree/master/translations/ср_СР) -* [Serbian - latin aplphabet](https://github.com/rwldrn/idiomatic.js/tree/master/translations/sr_SR) - -## Важливе, не ідіоматичне - -### Якість коду: онлайн сервіси, ресурси, посилання - - * [JavaScript Plugin](http://docs.codehaus.org/display/SONAR/JavaScript+Plugin) для [Sonar](http://www.sonarsource.org/) - * [jsPerf](http://jsperf.com/) - * [jsFiddle](http://jsfiddle.net/) - * [jsbin](http://jsbin.com/) - * [JavaScript Lint (JSL)](http://javascriptlint.com/) - * [jshint](http://jshint.com/) - * [jslint](http://jslint.org/) - -[Використання інструментів по покращенню коду від Антона Ковалева](http://anton.kovalyov.net/slides/gothamjs/) - -### Ставай розумнішим - -### [ECMAScript 5.1 з коментарями](http://es5.github.com/) -### [Специфікації мови ECMAScript, видання 5.1](http://ecma-international.org/ecma-262/5.1/) - -Наступне потрібо вважати 1) незакінченим, и 2) *ОБОВ'ЯЗКОВИМ ДО ПРОЧИТАННЯ*. Я не завжди згідний з стилями даних авторів, але одне є точно: вони консистентні. Крім того, це канони для мови. - - * [Baseline For Front End Developers](http://rmurphey.com/blog/2012/04/12/a-baseline-for-front-end-developers/) - * [Eloquent JavaScript](http://eloquentjavascript.net/) - * [JavaScript, JavaScript](http://javascriptweblog.wordpress.com/) - * [Adventures in JavaScript Development](http://rmurphey.com/) - * [Perfection Kills](http://perfectionkills.com/) - * [Douglas Crockford's Wrrrld Wide Web](http://www.crockford.com) - * [JS Assessment](https://github.com/rmurphey/js-assessment) - -### Компіляція і розгортання - -Проекти поивнні старатись включати в себе певний інструментарій для контролю стилю, тестування і стиснення коду. Для цього ви можете використовувати [grunt](https://github.com/cowboy/grunt) від Ben Alman. - - - -### Тестування - -Проекти повинні мати юніт, еталонні, "по реалізації" або функціональні тести. Демонстрація сценаріїв НЕ ЯВЛЯЄТЬСЯ тестом. Нижче наведений списоу фреймворків для тестування, ні один із них не отримав більшого схвалення, ніж інший. - - * [QUnit](http://github.com/jquery/qunit) - * [Jasmine](https://github.com/pivotal/jasmine) - * [Vows](https://github.com/cloudhead/vows) - * [Mocha](https://github.com/visionmedia/mocha) - * [Hiro](http://hirojs.com/) - * [JsTestDriver](https://code.google.com/p/js-test-driver/) - * [Buster.js](http://busterjs.org/) - -## Зміст - - * [Пробіли, табуляція, порожні рядки](#whitespace) - * [Гарний синтаксис](#spacing) - * [Перевірка типів (Інструкція по стилю від команди jQuery Core)](#type) - * [Умовні обчислення](#cond) - * [Стиль на практиці](#practical) - * [Найменування](#naming) - * [Різне](#misc) - * ["Рідні" і "чужі" об'єкти](#native) - * [Коментарі](#comments) - * [Код однієї мови](#language) - - ------------------------------------------------- - - -## Передмова - -Наступні секції описують прийнятну інструкцію по стилю для сучасної розробки на JavaScript і не являються обов’язковими.Найважливіше - це **закон написання консистентного коду**. Який стиль ви б не вибрали для вашого проекту, він повинен вважатись законом. Ссилайтесь на даний документ як на заяву про відношення вашого проекту до консистентності коду, читабельності і зручності супроводу. - - - -## Маніфест Ідіоматичного Стилю - -1. Пробіли, табуляція і порожні рядки - - Ніколи не змішуйте пробіли і знаки табуляції. - - Перед тим як почати проект, перед тим, як писати код, виберіть між "м’якими" відступами(пробіли) або знаками табуляції і вважайте це **законом**. - - Для кращої читабельності коду, я завжди рекомендую виставити розмір відступу в вашому редакторі на 2 символи &mdash - це або два пробіли, або два пробіли які являються знаком табуляції. - - Завжди працюйте з увімкнутою опцією "показати приховане", якщо ваш редактор підтримує її. Переваги: - - вимушена послідовність - - видалення пробілу в кінці рядка - - видалення порожніх рядків - - читабельні коміти та діффи - -2. Гарний Синтаксис - - A. Дужки, Фігурні Дужки, Перенос Рядка - - ```javascript - - // if/else/for/while/try завжди розділяються пробілом, - // це покращує читабельність - - // 2.A.1.1 - // // Приклад нерозбірливого синтаксису - - if(condition) doSomething(); - - while(condition) iterating++; - - for(var i=0;i<100;i++) someInterativeFn(); - - // 2.A.1.1 - // Використовуйте пробіли для того, щоб покращити читабельність - - if ( condition ) { - // вирази - } - - while ( condition ) { - // вирази - } - - for ( var i = 0; i < 100; i++ ) { - // вирази - } - - // Ще краще: - - var i, - length = 100; - - for ( i = 0; i < length; i++ ) { - // вирази - } - - // Або... - - var i = 0, - length = 100; - - for ( ; i < length; i++ ) { - // вирази - } - - var prop; - - for ( prop in object ) { - // вирази - } - - - if ( true ) { - // вирази - } else { - // вирази - } - ``` - - - B. Присвоєння, Оголошення, Функції(Іменовані, Функції-Вирази, Функціх-Конструктори) - - ```javascript - - // 2.B.1.1 - // Змінні - var foo = "bar", - num = 1, - undef; - - // Оголошення літералів: - var array = [], - object = {}; - - - // 2.B.1.2 - // Використання тільки одного `var` на одну область видимості покращує читабельність - - // і впорядковує блок оголошення змінних(також зберігає вам декілька символів) - - // Неправильно - var foo = ""; - var bar = ""; - var qux; - - // Правильно - var foo = "", - bar = "", - quux; - - // або... - var // коментар для змінних - foo = "", - bar = "", - quux; - - // 2.B.1.3 - // Оператор var завжди повинен бути на початку області видимості(функції) - // Те саме вірно для констант і оператора let із ECMAScript 6. - - // Неправильно - function foo() { - - // вирази - - var bar = "", - qux; - } - - // Правильно - function foo() { - var bar = "", - qux; - - // всі вирази після оголошеня змінних. - } - ``` - - ```javascript - - // 2.B.2.1 - // Оголошення Іменованих Функцій - function foo( arg1, argN ) { - - } - - // Використання - foo( arg1, argN ); - - - // 2.B.2.2 - // Оголошення Іменованих Функцій - function square( number ) { - return number * number; - } - - // Використання - square( 10 ); - - // Дуже надуманий стиль передачі параметрів - function square( number, callback ) { - callback( number * number ); - } - - square( 10, function( square ) { - // зворотній виклик - }); - - // 2.B.2.3 - // Функція-Вираз - var square = function( number ) { - // повернути щось важливе і цінне - return number * number; - }; - - // Функція-Вираз з Ідентифікатором - // Таке оголошення гарне тим, що функція може викликати сама себе - // і її ім’я буде видно в стеку викликів функцій: - var factorial = function factorial( number ) { - if ( number < 2 ) { - return 1; - } - - return number * factorial( number-1 ); - }; - - // 2.B.2.4 - // Оголошення Конструктора - function FooBar( options ) { - - this.options = options; - } - - // Використання - var fooBar = new FooBar({ a: "alpha" }); - - fooBar.options; - // { a: "alpha" } - - ``` - - - C. Виключення, Незначні відхилення від правил - - ```javascript - - // 2.C.1.1 - // Функції з зворотнім викликом - foo(function() { - // Зауважте, що пробілу між "function" і першою дужкою нема - }); - - // Функція, що приймає масив як параметр, теж без пробілу - foo([ "alpha", "beta" ]); - - // 2.C.1.2 - // Функція, що приймає об’єкт як параметр, теж без пробілу - foo({ - a: "alpha", - b: "beta" - }); - - // Один рядок - без пробілу - foo("bar"); - - // Внутрішні дужки теж без пробілу - if ( !("foo" in obj) ) { - - } - - ``` - - D. Консистентність Завжди Виграє - - В секції 2.A-2.C, правила використання пробілу і знака табуляції встановлені з простою цілюю: консистентність. - Важливо зазначити, що переваги в форматуванні, такі як "внутрішній пробіл", повинні вважатись опціональними, але в вашому проекті повинен використовуватись тільки один стиль форматування. - - ```javascript - - // 2.D.1.1 - - if (condition) { - // вирази - } - - while (condition) { - // вирази - } - - for (var i = 0; i < 100; i++) { - // вирази - } - - if (true) { - // вирази - } else { - // вирази - } - - ``` - - E. Лапки - - Абсолютно не важливо, які лапки ви використовуєте(одинарні чи подвійні), нема різниці в тому, як JavaScript обробляє їх. Що **справді важливо**, так це зберігати консистентність. **Ніколи не плутайте лапки в вашому проекті. Оберіть один стиль і притримуйтель його.** - - F. Кінець рядка і порожні рядки - - Пробіли, знаки табуляції можуть зіпсувати діффи і зробити чейнджсети непридатними для читання. Подумайте про те, щоб забирати пробіли в кінці рядка і породні рядки автоматично перед комітом. - -3. Перевірка типів (Інструкція по стилю від команди jQuery Core) - - A. Типи - - String: - - typeof variable === "string" - - Number: - - typeof variable === "number" - - Boolean: - - typeof variable === "boolean" - - Object: - - typeof variable === "object" - - Array: - - Array.isArray( arrayLikeObject ) - (де можливо) - - Node: - - elem.nodeType === 1 - - null: - - variable === null - - null or undefined: - - variable == null - - undefined: - - Глобальні змінні: - - typeof variable === "undefined" - - Локальні змінні: - - variable === undefined - - Властивості(properties): - - object.prop === undefined - object.hasOwnProperty( prop ) - "prop" in object - - B. Неявне зведення типів - - Представте результат наступного... - - Нехай дано HTML: - - ```html - - - - ``` - - - ```js - - // 3.B.1.1 - - // `foo` була оголошена, їй був присвоєний `0` и її тип `number` - var foo = 0; - - // typeof foo; - // "number" - ... - - // Далі в коді вам потрібно оновити значення `foo` - // новим значенням із input елемента - - foo = document.getElementById("foo-input").value; - - // Якщо б ви перевірили тип змінної зараз `typeof foo`, то отрималм б `string` - // Це означає, що якщо б ви тестували `foo` ось так: - - if ( foo === 1 ) { - - importantTask(); - - } - - // то `importantTask()` не була б викликана, навіть якщо б значення `foo` було рівне "1" - - - // 3.B.1.2 - - // Ви можете уникнути помилок, використовуючи зведення типів за допомогою унарних операторів "+" і "-": - - foo = +document.getElementById("foo-input").value; - //унарний оператор "+" зведе праву частину виразу до типу `number` - - // typeof foo; - // "number" - - if ( foo === 1 ) { - - importantTask(); - - } - - // `importantTask()` буде викликана - ``` - - Ось декілька простих прикладів зведення типів: - - - ```javascript - - // 3.B.2.1 - - var number = 1, - string = "1", - bool = false; - - number; - // 1 - - number + ""; - // "1" - - string; - // "1" - - +string; - // 1 - - +string++; - // 1 - - string; - // 2 - - bool; - // false - - +bool; - // 0 - - bool + ""; - // "false" - ``` - - - ```javascript - // 3.B.2.2 - - var number = 1, - string = "1", - bool = true; - - string === number; - // false - - string === number + ""; - // true - - +string === number; - // true - - bool === number; - // false - - +bool === number; - // true - - bool === string; - // false - - bool === !!string; - // true - ``` - - ```javascript - // 3.B.2.3 - - var array = [ "a", "b", "c" ]; - - !!~array.indexOf("a"); - // true - - !!~array.indexOf("b"); - // true - - !!~array.indexOf("c"); - // true - - !!~array.indexOf("d"); - // false - - // Зауважте, що вищесказане можна вважати "занадто розумним" - // Краще зробити так: - - if ( array.indexOf( "a" ) >= 0 ) { - // ... - } - ``` - - ```javascript - // 3.B.2.3 - - - var num = 2.5; - - parseInt( num, 10 ); - - // те саме що - - ~~num; - - num >> 0; - - num >>> 0; - - // У всіх випадках результат рівний 2 - - - // Пам’ятайте, що від’ємні числа будуть опрацьовані іншим чином... - - var neg = -2.5; - - parseInt( neg, 10 ); - - // те саме що... - - ~~neg; - - neg >> 0; - - // У всіх випадках результат рівний -2 - // Хоча... - - neg >>> 0; - - // покаже 4294967294 - - - - - ``` - - - -4. Умовні обчислення/Опрацювання - - ```javascript - - // 4.1.1 - // Перевіряючи, чи у масиву є довжина - // замість: - if ( array.length > 0 ) ... - - // перевіряйте значення виразу: - if ( array.length ) ... - - - // 4.1.2 - // Перевіряючи, чи масив не порожній: - // замість: - if ( array.length === 0 ) ... - - // перевіряйте значення виразу: - if ( !array.length ) ... - - - // 4.1.3 - // Перевіряючи, чи рядок не порожній: - // замість: - if ( string !== "" ) ... - - // перевіряйте значення виразу: - if ( string ) ... - - - // 4.1.4 - // Перевіряючи, чи рядок порожній: - // замість: - if ( string === "" ) ... - - // перевіряйте значення виразу: - if ( !string ) ... - - - // 4.1.5 - // Перевіряючи, чи змінна істинна - // замість: - if ( foo === true ) ... - - // перевіряйте наступним чином: - if ( foo ) ... - - - // 4.1.6 - // Перевіряючи, чи змінна хибна - // замість: - if ( foo === false ) ... - - // перевіряйте, використовуючи заперечення: - if ( !foo ) ... - - // ...Будьте уважні, тому що вираз справедливий і для: 0, "", null, undefined, NaN - // Для перевірки завідомо хибних виразів, використовуйте: - if ( foo === false ) ... - - - // 4.1.7 - // Перевіряючи, чи змінна null або undefined, але не хибна, "" або 0, - // замість: - if ( foo === null || foo === undefined ) ... - - // ... скористайтеся оператором ==: - if ( foo == null ) ... - - // Пам’ятайте, що за допомогою оператора == з `null` спрацює для ОБОХ `null` і `undefined` - // але не для `false`, "" або 0 - null == undefined - - ``` - Завжди оцінюйте найкращий і точний результат - вище наведено інструкцію, а не догму. - - ```javascript - - // 4.2.1 - // Зведення типів і оцінка виразів - - // Віддавайте перевагу `===`, а не `==` (тільки якщо конкретний випадок не потребує слабо типізованої оцінки) - - // === не зводить типи примусово, тобто: - - "1" === 1; - // false - - // == зводить типи примусово, тобто: - - "1" == 1; - // true - - - // 4.2.2 - // Логічні вирази, Істинні і Хибні - - // Логічні вирази: - true, false - - // Істинні: - "foo", 1 - - // Хибні: - "", 0, null, undefined, NaN, void 0 - - ``` - - -5. Стиль на практиці - - ```javascript - - // 5.1.1 - // Модуль - - (function( global ) { - var Module = (function() { - - var data = "secret"; - - return { - // Логічна властивість - bool: true, - // Властивість типу рядок - string: "a string", - // Властивість - масив - array: [ 1, 2, 3, 4 ], - // Властивість - об’єкт - object: { - lang: "en-Us" - }, - getData: function() { - // отримати поточне значення змінної `data` - return data; - }, - setData: function( value ) { - // присвоїти значення змінної `data` і повернути його - return ( data = value ); - } - }; - })(); - - // Інші оголошення - - // робимо наш модуль глобальним - global.Module = Module; - - })( this ); - - ``` - - ```javascript - - // 5.2.1 - // Конструктор - - (function( global ) { - - function Ctor( foo ) { - - this.foo = foo; - - return this; - } - - Ctor.prototype.getFoo = function() { - return this.foo; - }; - - Ctor.prototype.setFoo = function( val ) { - return ( this.foo = val ); - }; - - - // Щоб викликати конструктор без використання оператора `new`, можна оголосити конструктор так: - var ctor = function( foo ) { - return new Ctor( foo ); - }; - - - // робимо наш конструктор глобальним - global.ctor = ctor; - - })( this ); - - ``` - - - -6. Найменування - - - A. Ви не компілятор і не компрессор, так що не старайтесь бути одним із них. - - Весь наступний код являється прикладом поганого найменування змінних: - - ```javascript - - // 6.A.1.1 - // Приклад коду з "бідними на описання" іменами змінних - - function q(s) { - return document.querySelectorAll(s); - } - var i,a=[],els=q("#foo"); - for(i=0;iРізне - - Даний розділ описує ідеї і концепції, які не повинні розглядатись як догма. Він існує для того, щоб посіяти сумніви в загальноприйнятих методах в спробах знайти більш ефективні пособи вирішення загальних задач програмування на JavaScript. - - A. Використання `switch` варто уникати, тому що сучасний метод відлагодження буде приховувати виклики функцій, які використовують `switch`. - - В останніх версіях браузерів Firefox і Chrome, здається, є вагомі покращення в виконанні функцій, які використовують `switch`. - http://jsperf.com/switch-vs-object-literal-vs-module - - На вагомі покращення також можна поглянути тут: - https://github.com/rwldrn/idiomatic.js/issues/13 - - ```javascript - - // 7.A.1.1 - // Приклад оператора switch - - switch( foo ) { - case "alpha": - alpha(); - break; - case "beta": - beta(); - break; - default: - // якесь значення по замовчуванню - break; - } - - // 7.A.1.2 - // Кращим підходом було б використати об’єкт або навіть модуль: - - var switchObj = { - alpha: function() { - // вирази - // повертаєм результат - }, - beta: function() { - // вирази - // повертаєм результат - }, - _default: function() { - // вирази - // повертаєм результат - } - }; - - var switchModule = (function () { - return { - alpha: function() { - // вирази - // повертаєм результат - }, - beta: function() { - // вирази - // повертаєм результат - }, - _default: function() { - // вирази - // повертаєм результат - } - }; - })(); - - - // 7.A.1.3 - // Якщо `foo` це властивість `switchObj` або `switchModule`, то виконати метод... - - ( Object.hasOwnProperty.call( switchObj, foo ) && switchObj[ foo ] || switchObj._default )( args ); - - ( Object.hasOwnProperty.call( switchObj, foo ) && switchModule[ foo ] || switchModule._default )( args ); - - // Якщо ви знаєте можливі значення `foo` і довіряєту його джерелу, можете опустити умови АБО - // залишивши тільки виконання - - switchObj[ foo ]( args ); - - switchModule[ foo ]( args ); - - - // Дана можель підтримує повторне використання коду - - ``` - - B. "Ранні повернення" сприяють читабельності коду з незначною різницею в продуктивності - - ```javascript - - // 7.B.1.1 - // Неправильно: - function returnLate( foo ) { - var ret; - - if ( foo ) { - ret = "foo"; - } else { - ret = "quux"; - } - return ret; - } - - // Правильно: - - function returnEarly( foo ) { - - if ( foo ) { - return "foo"; - } - return "quux"; - } - - ``` - - -8. "Рідні" і "чужі" об’єкти - - Основне правило: - - ### Не робіть тупих речей, і все буде добре. - - Для кращого розуміння даної концепції, подивіться ось це відео: - - #### “Everything is Permitted: Extending Built-ins” by Andrew Dupont (JSConf2011, Portland, Oregon) - - - - http://blip.tv/jsconf/jsconf2011-andrew-dupont-everything-is-permitted-extending-built-ins-5211542 - - -9. Коментарі - - * Однорядкові коментарі на рядок вище коду - * Коментарі в декілька рядків теж вітаються - * коментарі в кінці рядка забронені! - * Стиль JSDoc гарний, але в ньому потрібно довго розбиратись - - -10. Код однієї мови - -Програми повинні бути написані на одній мові (незалежно від мови), як потребують того люди, які супроводжують код. - -## Додаток - -### Перша Кома. - -Будь-який проект, котрий посилається на даний документ в якості інструкції по стилю, не прийме форматування коду "першої коми", тільки якщо автор спеціально не вкаже цього. +<<<<<<< HEAD +# Принципи написання консистентного, ідіоматичного коду на JavaScript *** + +##Це "живий" документ і нові ідеї по покращенню коду завжди заохочуються. Візьміть участь: fork, clone, branch, commit, push, pull request. *** + +* Rick Waldron [@rwaldron](http://twitter.com/rwaldron), [github](https://github.com/rwldrn) +* Mathias Bynens [@mathias](http://twitter.com/mathias), [github](https://github.com/mathiasbynens) +* Schalk Neethling [@ossreleasefeed](http://twitter.com/ossreleasefeed), [github](https://github.com/ossreleasefeed/) +* Kit Cambridge [@kitcambridge](http://twitter.com/kitcambridge), [github](https://github.com/kitcambridge) +* Raynos [github](https://github.com/Raynos) +* Matias Arriola [@MatiasArriola](https://twitter.com/MatiasArriola), [github](https://github.com/MatiasArriola/) +* John Fischer [@jfroffice](https://twitter.com/jfroffice), [github](https://github.com/jfroffice/) +* Idan Gazit [@idangazit](http://twitter.com/idangazit), [github](https://github.com/idangazit) +* Leo Balter [@leobalter](http://twitter.com/leobalter), [github](https://github.com/leobalter) +* Breno Oliveira [@garu_rj](http://twitter.com/garu_rj), [github](https://github.com/garu) +* Leo Beto Souza [@leobetosouza](http://twitter.com/leobetosouza), [github](https://github.com/leobetosouza) +* Ryuichi Okumura [@okuryu](http://twitter.com/okuryu), [github](https://github.com/okuryu) +* Pascal Precht [@PascalPrecht](http://twitter.com/PascalPrecht), [github](https://github.com/pascalprecht) +* EngForDev [engfordev](http://www.opentutorials.org/course/167/1363) - Hwan Min Hong / MinTaek Kwon [@leoinsight](http://twitter.com/leoinsight) / Tw Shim [@marocchino](http://twitter.com/marocchino), [github](https://github.com/marocchino) / Nassol Kim [@nassol99](http://twitter.com/nassol99), [github](https://github.com/nassol) / Juntai Park [@rkJun](http://twitter.com/rkJun), [github](https://github.com/rkJun) / Minkyu Shim / Gangmin Won / Justin Yoo [@justinchronicle](http://twitter.com/justinchronicle) / Daeyup Lee +* Marco Trulla [@marcotrulla](http://twitter.com/marcotrulla), [github](https://github.com/Ragnarokkr) +* Alex Navasardyan [@alexnavasardyan](http://twitter.com/alexnavasardyan), [github](https://github.com/2k00l) +* Mihai Paun [@mihaipaun](http://twitter.com/mihaipaun), [github](https://github.com/mihaipaun) +* Evgeny Mandrikov [@\_godin\_](http://twitter.com/_godin_), [github](https://github.com/Godin) +* Sofish Lin [@sofish](http://twitter.com/sofish), [github](https://github.com/sofish) +* Дејан Димић [@dejan_dimic](http://twitter.com/dejan_dimic), [github](https://github.com/rubystream) +* Miloš Gavrilović [@gavrisimo](http://twitter.com/gavrisimo), [github](https://github.com/gavrisimo) + + +## Код в будь-якому проекті повинен виглядати так, ніби його писала одна людина, не залежно від того, скільки людей працювало над ним. *** + +### Все наступне є списком норм, якими я керуюсь при написанні коду, автором якого я є; будь-який вклад в проекти, які я створив, повинен відповідати даним нормам. *** + +### Я не маю наміру нав'язувати свої вподобання в стилі іншим; власний стиль написання коду гідний поваги. + +> ### "Суперечки з приводу стилів бузглузді. У вас повинен бути посібник по стилю і ви повинні слідувати йому." +>_Rebecca_ _Murphey_ + +  + +> ### "Щоб бути хорошим керівником проекту, потрібно розуміти, що писати код для себе - це погана ідея. Якщо ваш код використовують тисячі людей, то пишіть свій код максимально зрозуміло, а не на власний розсуд." +>_Idan_ _Gazit_ + +## Переклади + +* [ORIGINAL](https://github.com/rwldrn/idiomatic.js/) +* [German](https://github.com/rwldrn/idiomatic.js/tree/master/translations/de_DE) +* [French](https://github.com/rwldrn/idiomatic.js/tree/master/translations/fr_FR) +* [Spanish](https://github.com/rwldrn/idiomatic.js/tree/master/translations/es_ES) +* [Portuguese - Brazil](https://github.com/rwldrn/idiomatic.js/tree/master/translations/pt_BR) +* [Korean](https://github.com/rwldrn/idiomatic.js/tree/master/translations/ko_KR) +* [Japanese](https://github.com/rwldrn/idiomatic.js/tree/master/translations/ja_JP) +* [Italian](https://github.com/rwldrn/idiomatic.js/tree/master/translations/it_IT) +* [Russian](https://github.com/rwldrn/idiomatic.js/tree/master/translations/ru_RU) +* [Romanian](https://github.com/rwldrn/idiomatic.js/tree/master/translations/ro_RO) +* [简体中文](https://github.com/rwldrn/idiomatic.js/tree/master/translations/zh_CN) +* [Serbian - cyrilic alphabet](https://github.com/rwldrn/idiomatic.js/tree/master/translations/ср_СР) +* [Serbian - latin aplphabet](https://github.com/rwldrn/idiomatic.js/tree/master/translations/sr_SR) + +## Важливе, не ідіоматичне + +### Якість коду: онлайн сервіси, ресурси, посилання + + * [JavaScript Plugin](http://docs.codehaus.org/display/SONAR/JavaScript+Plugin) для [Sonar](http://www.sonarsource.org/) + * [jsPerf](http://jsperf.com/) + * [jsFiddle](http://jsfiddle.net/) + * [jsbin](http://jsbin.com/) + * [JavaScript Lint (JSL)](http://javascriptlint.com/) + * [jshint](http://jshint.com/) + * [jslint](http://jslint.org/) + +[Використання інструментів по покращенню коду від Антона Ковалева](http://anton.kovalyov.net/slides/gothamjs/) + +### Ставай розумнішим + +### [ECMAScript 5.1 з коментарями](http://es5.github.com/) +### [Специфікації мови ECMAScript, видання 5.1](http://ecma-international.org/ecma-262/5.1/) + +Наступне потрібо вважати 1) незакінченим, и 2) *ОБОВ'ЯЗКОВИМ ДО ПРОЧИТАННЯ*. Я не завжди згідний з стилями даних авторів, але одне є точно: вони консистентні. Крім того, це канони для мови. + + * [Baseline For Front End Developers](http://rmurphey.com/blog/2012/04/12/a-baseline-for-front-end-developers/) + * [Eloquent JavaScript](http://eloquentjavascript.net/) + * [JavaScript, JavaScript](http://javascriptweblog.wordpress.com/) + * [Adventures in JavaScript Development](http://rmurphey.com/) + * [Perfection Kills](http://perfectionkills.com/) + * [Douglas Crockford's Wrrrld Wide Web](http://www.crockford.com) + * [JS Assessment](https://github.com/rmurphey/js-assessment) + +### Компіляція і розгортання + +Проекти поивнні старатись включати в себе певний інструментарій для контролю стилю, тестування і стиснення коду. Для цього ви можете використовувати [grunt](https://github.com/cowboy/grunt) від Ben Alman. + + + +### Тестування + +Проекти повинні мати юніт, еталонні, "по реалізації" або функціональні тести. Демонстрація сценаріїв НЕ ЯВЛЯЄТЬСЯ тестом. Нижче наведений списоу фреймворків для тестування, ні один із них не отримав більшого схвалення, ніж інший. + + * [QUnit](http://github.com/jquery/qunit) + * [Jasmine](https://github.com/pivotal/jasmine) + * [Vows](https://github.com/cloudhead/vows) + * [Mocha](https://github.com/visionmedia/mocha) + * [Hiro](http://hirojs.com/) + * [JsTestDriver](https://code.google.com/p/js-test-driver/) + * [Buster.js](http://busterjs.org/) + +## Зміст + + * [Пробіли, табуляція, порожні рядки](#whitespace) + * [Гарний синтаксис](#spacing) + * [Перевірка типів (Інструкція по стилю від команди jQuery Core)](#type) + * [Умовні обчислення](#cond) + * [Стиль на практиці](#practical) + * [Найменування](#naming) + * [Різне](#misc) + * ["Рідні" і "чужі" об'єкти](#native) + * [Коментарі](#comments) + * [Код однієї мови](#language) + + +------------------------------------------------ + + +## Передмова + +Наступні секції описують прийнятну інструкцію по стилю для сучасної розробки на JavaScript і не являються обов’язковими.Найважливіше - це **закон написання консистентного коду**. Який стиль ви б не вибрали для вашого проекту, він повинен вважатись законом. Ссилайтесь на даний документ як на заяву про відношення вашого проекту до консистентності коду, читабельності і зручності супроводу. + + + +## Маніфест Ідіоматичного Стилю + +1. Пробіли, табуляція і порожні рядки + - Ніколи не змішуйте пробіли і знаки табуляції. + - Перед тим як почати проект, перед тим, як писати код, виберіть між "м’якими" відступами(пробіли) або знаками табуляції і вважайте це **законом**. + - Для кращої читабельності коду, я завжди рекомендую виставити розмір відступу в вашому редакторі на 2 символи &mdash - це або два пробіли, або два пробіли які являються знаком табуляції. + - Завжди працюйте з увімкнутою опцією "показати приховане", якщо ваш редактор підтримує її. Переваги: + - вимушена послідовність + - видалення пробілу в кінці рядка + - видалення порожніх рядків + - читабельні коміти та діффи + +2. Гарний Синтаксис + + A. Дужки, Фігурні Дужки, Перенос Рядка + + ```javascript + + // if/else/for/while/try завжди розділяються пробілом, + // це покращує читабельність + + // 2.A.1.1 + // // Приклад нерозбірливого синтаксису + + if(condition) doSomething(); + + while(condition) iterating++; + + for(var i=0;i<100;i++) someInterativeFn(); + + // 2.A.1.1 + // Використовуйте пробіли для того, щоб покращити читабельність + + if ( condition ) { + // вирази + } + + while ( condition ) { + // вирази + } + + for ( var i = 0; i < 100; i++ ) { + // вирази + } + + // Ще краще: + + var i, + length = 100; + + for ( i = 0; i < length; i++ ) { + // вирази + } + + // Або... + + var i = 0, + length = 100; + + for ( ; i < length; i++ ) { + // вирази + } + + var prop; + + for ( prop in object ) { + // вирази + } + + + if ( true ) { + // вирази + } else { + // вирази + } + ``` + + + B. Присвоєння, Оголошення, Функції(Іменовані, Функції-Вирази, Функціх-Конструктори) + + ```javascript + + // 2.B.1.1 + // Змінні + var foo = "bar", + num = 1, + undef; + + // Оголошення літералів: + var array = [], + object = {}; + + + // 2.B.1.2 + // Використання тільки одного `var` на одну область видимості покращує читабельність + + // і впорядковує блок оголошення змінних(також зберігає вам декілька символів) + + // Неправильно + var foo = ""; + var bar = ""; + var qux; + + // Правильно + var foo = "", + bar = "", + quux; + + // або... + var // коментар для змінних + foo = "", + bar = "", + quux; + + // 2.B.1.3 + // Оператор var завжди повинен бути на початку області видимості(функції) + // Те саме вірно для констант і оператора let із ECMAScript 6. + + // Неправильно + function foo() { + + // вирази + + var bar = "", + qux; + } + + // Правильно + function foo() { + var bar = "", + qux; + + // всі вирази після оголошеня змінних. + } + ``` + + ```javascript + + // 2.B.2.1 + // Оголошення Іменованих Функцій + function foo( arg1, argN ) { + + } + + // Використання + foo( arg1, argN ); + + + // 2.B.2.2 + // Оголошення Іменованих Функцій + function square( number ) { + return number * number; + } + + // Використання + square( 10 ); + + // Дуже надуманий стиль передачі параметрів + function square( number, callback ) { + callback( number * number ); + } + + square( 10, function( square ) { + // зворотній виклик + }); + + // 2.B.2.3 + // Функція-Вираз + var square = function( number ) { + // повернути щось важливе і цінне + return number * number; + }; + + // Функція-Вираз з Ідентифікатором + // Таке оголошення гарне тим, що функція може викликати сама себе + // і її ім’я буде видно в стеку викликів функцій: + var factorial = function factorial( number ) { + if ( number < 2 ) { + return 1; + } + + return number * factorial( number-1 ); + }; + + // 2.B.2.4 + // Оголошення Конструктора + function FooBar( options ) { + + this.options = options; + } + + // Використання + var fooBar = new FooBar({ a: "alpha" }); + + fooBar.options; + // { a: "alpha" } + + ``` + + + C. Виключення, Незначні відхилення від правил + + ```javascript + + // 2.C.1.1 + // Функції з зворотнім викликом + foo(function() { + // Зауважте, що пробілу між "function" і першою дужкою нема + }); + + // Функція, що приймає масив як параметр, теж без пробілу + foo([ "alpha", "beta" ]); + + // 2.C.1.2 + // Функція, що приймає об’єкт як параметр, теж без пробілу + foo({ + a: "alpha", + b: "beta" + }); + + // Один рядок - без пробілу + foo("bar"); + + // Внутрішні дужки теж без пробілу + if ( !("foo" in obj) ) { + + } + + ``` + + D. Консистентність Завжди Виграє + + В секції 2.A-2.C, правила використання пробілу і знака табуляції встановлені з простою цілюю: консистентність. + Важливо зазначити, що переваги в форматуванні, такі як "внутрішній пробіл", повинні вважатись опціональними, але в вашому проекті повинен використовуватись тільки один стиль форматування. + + ```javascript + + // 2.D.1.1 + + if (condition) { + // вирази + } + + while (condition) { + // вирази + } + + for (var i = 0; i < 100; i++) { + // вирази + } + + if (true) { + // вирази + } else { + // вирази + } + + ``` + + E. Лапки + + Абсолютно не важливо, які лапки ви використовуєте(одинарні чи подвійні), немає різниці в тому, як JavaScript обробляє їх. Що **справді важливо**, так це зберігати консистентність. **Ніколи не плутайте лапки в вашому проекті. Оберіть один стиль і притримуйтель його.** + + F. Кінець рядка і порожні рядки + + Пробіли, знаки табуляції можуть зіпсувати діффи і зробити чейнджсети непридатними для читання. Подумайте про те, щоб забирати пробіли в кінці рядка і породні рядки автоматично перед комітом. + +3. Перевірка типів (Інструкція по стилю від команди jQuery Core) + + A. Типи + + String: + + typeof variable === "string" + + Number: + + typeof variable === "number" + + Boolean: + + typeof variable === "boolean" + + Object: + + typeof variable === "object" + + Array: + + Array.isArray( arrayLikeObject ) + (де можливо) + + Node: + + elem.nodeType === 1 + + null: + + variable === null + + null or undefined: + + variable == null + + undefined: + + Глобальні змінні: + + typeof variable === "undefined" + + Локальні змінні: + + variable === undefined + + Властивості(properties): + + object.prop === undefined + object.hasOwnProperty( prop ) + "prop" in object + + B. Неявне зведення типів + + Представте результат наступного... + + Нехай дано HTML: + + ```html + + + + ``` + + + ```js + + // 3.B.1.1 + + // `foo` була оголошена, їй був присвоєний `0` и її тип `number` + var foo = 0; + + // typeof foo; + // "number" + ... + + // Далі в коді вам потрібно оновити значення `foo` + // новим значенням із input елемента + + foo = document.getElementById("foo-input").value; + + // Якщо б ви перевірили тип змінної зараз `typeof foo`, то отрималм б `string` + // Це означає, що якщо б ви тестували `foo` ось так: + + if ( foo === 1 ) { + + importantTask(); + + } + + // то `importantTask()` не була б викликана, навіть якщо б значення `foo` було рівне "1" + + + // 3.B.1.2 + + // Ви можете уникнути помилок, використовуючи зведення типів за допомогою унарних операторів "+" і "-": + + foo = +document.getElementById("foo-input").value; + //унарний оператор "+" зведе праву частину виразу до типу `number` + + // typeof foo; + // "number" + + if ( foo === 1 ) { + + importantTask(); + + } + + // `importantTask()` буде викликана + ``` + + Ось декілька простих прикладів зведення типів: + + + ```javascript + + // 3.B.2.1 + + var number = 1, + string = "1", + bool = false; + + number; + // 1 + + number + ""; + // "1" + + string; + // "1" + + +string; + // 1 + + +string++; + // 1 + + string; + // 2 + + bool; + // false + + +bool; + // 0 + + bool + ""; + // "false" + ``` + + + ```javascript + // 3.B.2.2 + + var number = 1, + string = "1", + bool = true; + + string === number; + // false + + string === number + ""; + // true + + +string === number; + // true + + bool === number; + // false + + +bool === number; + // true + + bool === string; + // false + + bool === !!string; + // true + ``` + + ```javascript + // 3.B.2.3 + + var array = [ "a", "b", "c" ]; + + !!~array.indexOf("a"); + // true + + !!~array.indexOf("b"); + // true + + !!~array.indexOf("c"); + // true + + !!~array.indexOf("d"); + // false + + // Зауважте, що вищесказане можна вважати "занадто розумним" + // Краще зробити так: + + if ( array.indexOf( "a" ) >= 0 ) { + // ... + } + ``` + + ```javascript + // 3.B.2.3 + + + var num = 2.5; + + parseInt( num, 10 ); + + // те саме що + + ~~num; + + num >> 0; + + num >>> 0; + + // У всіх випадках результат рівний 2 + + + // Пам’ятайте, що від’ємні числа будуть опрацьовані іншим чином... + + var neg = -2.5; + + parseInt( neg, 10 ); + + // те саме що... + + ~~neg; + + neg >> 0; + + // У всіх випадках результат рівний -2 + // Хоча... + + neg >>> 0; + + // покаже 4294967294 + + + + + ``` + + + +4. Умовні обчислення/Опрацювання + + ```javascript + + // 4.1.1 + // Перевіряючи, чи у масиву є довжина + // замість: + if ( array.length > 0 ) ... + + // перевіряйте значення виразу: + if ( array.length ) ... + + + // 4.1.2 + // Перевіряючи, чи масив не порожній: + // замість: + if ( array.length === 0 ) ... + + // перевіряйте значення виразу: + if ( !array.length ) ... + + + // 4.1.3 + // Перевіряючи, чи рядок не порожній: + // замість: + if ( string !== "" ) ... + + // перевіряйте значення виразу: + if ( string ) ... + + + // 4.1.4 + // Перевіряючи, чи рядок порожній: + // замість: + if ( string === "" ) ... + + // перевіряйте значення виразу: + if ( !string ) ... + + + // 4.1.5 + // Перевіряючи, чи змінна істинна + // замість: + if ( foo === true ) ... + + // перевіряйте наступним чином: + if ( foo ) ... + + + // 4.1.6 + // Перевіряючи, чи змінна хибна + // замість: + if ( foo === false ) ... + + // перевіряйте, використовуючи заперечення: + if ( !foo ) ... + + // ...Будьте уважні, тому що вираз справедливий і для: 0, "", null, undefined, NaN + // Для перевірки завідомо хибних виразів, використовуйте: + if ( foo === false ) ... + + + // 4.1.7 + // Перевіряючи, чи змінна null або undefined, але не хибна, "" або 0, + // замість: + if ( foo === null || foo === undefined ) ... + + // ... скористайтеся оператором ==: + if ( foo == null ) ... + + // Пам’ятайте, що за допомогою оператора == з `null` спрацює для ОБОХ `null` і `undefined` + // але не для `false`, "" або 0 + null == undefined + + ``` + Завжди оцінюйте найкращий і найточніший результат - вище наведено інструкцію, а не догму. + + ```javascript + + // 4.2.1 + // Зведення типів і оцінка виразів + + // Віддавайте перевагу `===`, а не `==` (тільки якщо конкретний випадок не потребує слабо типізованої оцінки) + + // === не зводить типи примусово, тобто: + + "1" === 1; + // false + + // == зводить типи примусово, тобто: + + "1" == 1; + // true + + + // 4.2.2 + // Логічні вирази, Істинні і Хибні + + // Логічні вирази: + true, false + + // Істинні: + "foo", 1 + + // Хибні: + "", 0, null, undefined, NaN, void 0 + + ``` + + +5. Стиль на практиці + + ```javascript + + // 5.1.1 + // Модуль + + (function( global ) { + var Module = (function() { + + var data = "secret"; + + return { + // Логічна властивість + bool: true, + // Властивість типу рядок + string: "a string", + // Властивість - масив + array: [ 1, 2, 3, 4 ], + // Властивість - об’єкт + object: { + lang: "en-Us" + }, + getData: function() { + // отримати поточне значення змінної `data` + return data; + }, + setData: function( value ) { + // присвоїти значення змінної `data` і повернути його + return ( data = value ); + } + }; + })(); + + // Інші оголошення + + // робимо наш модуль глобальним + global.Module = Module; + + })( this ); + + ``` + + ```javascript + + // 5.2.1 + // Конструктор + + (function( global ) { + + function Ctor( foo ) { + + this.foo = foo; + + return this; + } + + Ctor.prototype.getFoo = function() { + return this.foo; + }; + + Ctor.prototype.setFoo = function( val ) { + return ( this.foo = val ); + }; + + + // Щоб викликати конструктор без використання оператора `new`, можна оголосити конструктор так: + var ctor = function( foo ) { + return new Ctor( foo ); + }; + + + // робимо наш конструктор глобальним + global.ctor = ctor; + + })( this ); + + ``` + + + +6. Найменування + + + A. Ви не компілятор і не компрессор, так що не старайтесь бути одним із них. + + Весь наступний код являється прикладом поганого найменування змінних: + + ```javascript + + // 6.A.1.1 + // Приклад коду з "бідними на описання" іменами змінних + + function q(s) { + return document.querySelectorAll(s); + } + var i,a=[],els=q("#foo"); + for(i=0;iРізне + + Даний розділ описує ідеї і концепції, які не повинні розглядатись як догма. Він існує для того, щоб посіяти сумніви в загальноприйнятих методах в спробах знайти більш ефективні пособи вирішення загальних задач програмування на JavaScript. + + A. Використання `switch` варто уникати, тому що сучасний метод відлагодження буде приховувати виклики функцій, які використовують `switch`. + + В останніх версіях браузерів Firefox і Chrome, здається, є вагомі покращення в виконанні функцій, які використовують `switch`. + http://jsperf.com/switch-vs-object-literal-vs-module + + На вагомі покращення також можна поглянути тут: + https://github.com/rwldrn/idiomatic.js/issues/13 + + ```javascript + + // 7.A.1.1 + // Приклад оператора switch + + switch( foo ) { + case "alpha": + alpha(); + break; + case "beta": + beta(); + break; + default: + // якесь значення по замовчуванню + break; + } + + // 7.A.1.2 + // Кращим підходом було б використати об’єкт або навіть модуль: + + var switchObj = { + alpha: function() { + // вирази + // повертаєм результат + }, + beta: function() { + // вирази + // повертаєм результат + }, + _default: function() { + // вирази + // повертаєм результат + } + }; + + var switchModule = (function () { + return { + alpha: function() { + // вирази + // повертаєм результат + }, + beta: function() { + // вирази + // повертаєм результат + }, + _default: function() { + // вирази + // повертаєм результат + } + }; + })(); + + + // 7.A.1.3 + // Якщо `foo` це властивість `switchObj` або `switchModule`, то виконати метод... + + ( Object.hasOwnProperty.call( switchObj, foo ) && switchObj[ foo ] || switchObj._default )( args ); + + ( Object.hasOwnProperty.call( switchObj, foo ) && switchModule[ foo ] || switchModule._default )( args ); + + // Якщо ви знаєте можливі значення `foo` і довіряєту його джерелу, можете опустити умови АБО + // залишивши тільки виконання + + switchObj[ foo ]( args ); + + switchModule[ foo ]( args ); + + + // Дана можель підтримує повторне використання коду + + ``` + + B. "Ранні повернення" сприяють читабельності коду з незначними відмінностями в продуктивності + + ```javascript + + // 7.B.1.1 + // Неправильно: + function returnLate( foo ) { + var ret; + + if ( foo ) { + ret = "foo"; + } else { + ret = "quux"; + } + return ret; + } + + // Правильно: + + function returnEarly( foo ) { + + if ( foo ) { + return "foo"; + } + return "quux"; + } + + ``` + + +8. "Рідні" і "чужі" об’єкти + + Основне правило: + + ### Не робіть тупих речей, і все буде добре. + + Для кращого розуміння даної концепції, подивіться відео: + + #### “Everything is Permitted: Extending Built-ins” by Andrew Dupont (JSConf2011, Portland, Oregon) + + + + http://blip.tv/jsconf/jsconf2011-andrew-dupont-everything-is-permitted-extending-built-ins-5211542 + + +9. Коментарі + + * Однорядкові коментарі на рядок вище коду + * Коментарі в декілька рядків теж вітаються + * Коментарі в кінці рядка заборонені! + * Стиль JSDoc гарний, але в ньому потрібно довго розбиратись + + +10. Код однієї мови + +Програми повинні бути написані на одній мові (незалежно від мови), як потребують того люди, які супроводжують код. + +## Додаток + +### Перша Кома. + +Будь-який проект, котрий посилається на даний документ в якості інструкції по стилю, не прийме форматування коду "першої коми", тільки якщо автор спеціально не вкаже цього. From 6f0cb8c4bcf7aa8dffbff25f237115b6f96ea607 Mon Sep 17 00:00:00 2001 From: Yuriy Husnay Date: Mon, 3 Jun 2013 16:35:59 +0300 Subject: [PATCH 6/6] removed unneeded title --- translations/ua_UA/readme.md | 1 - 1 file changed, 1 deletion(-) diff --git a/translations/ua_UA/readme.md b/translations/ua_UA/readme.md index a124458d..bc6b00c7 100644 --- a/translations/ua_UA/readme.md +++ b/translations/ua_UA/readme.md @@ -1,4 +1,3 @@ -<<<<<<< HEAD # Принципи написання консистентного, ідіоматичного коду на JavaScript *** ##Це "живий" документ і нові ідеї по покращенню коду завжди заохочуються. Візьміть участь: fork, clone, branch, commit, push, pull request. ***