Skip to content

Commit 7be0a8a

Browse files
committed
Merge pull request BonsaiDen#301 from it-na-move/master
translation into Belorussian
2 parents af15e0a + e3131fd commit 7be0a8a

24 files changed

+2038
-2
lines changed

doc/by/array/constructor.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
## Канструктар `Array`
2+
3+
Праз тое, што канструктар `Array` неадназначна апрацоўвае свае параметры,
4+
крайне рэкамендуецца выкарыстоўваць літэрал - `[]` - для стварэння масіваў.
5+
6+
[1, 2, 3]; // Вынік: [1, 2, 3]
7+
new Array(1, 2, 3); // Вынік: [1, 2, 3]
8+
9+
[3]; // Вынік: [3]
10+
new Array(3); // Вынік: []
11+
new Array('3') // Вынік: ['3']
12+
13+
У выпадку, калі канструктару `Array` перадаецца толькі адзін параметр, і калі гэты
14+
аргумент тыпу `Number`, канструктар верне *разрэджаны* масіў, які мае уласціваць
15+
`length` са значэннем аргумента. Варта адзначыць, што такім чынам будзе зменена
16+
**толькі** значэнне ўласцівасці `length` масіва; індэксы масіва не будуць
17+
праініцыялізаваныя.
18+
19+
var arr = new Array(3);
20+
arr[1]; // undefined
21+
1 in arr; // false, індэкс не праініцыялізаваны
22+
23+
Магчымасць загадзя вызначыць даўжыню масіва карысна толькі ў рэдкіх выпадках,
24+
напрыклад, паўтор радка без выкарыстання цыкла.
25+
26+
new Array(count + 1).join(stringToRepeat);
27+
28+
### У заключэнне
29+
30+
Літэралы маюць перавагі над канструктарам Array. Яны карацейшыя, маюць больш чысты
31+
сінтаксіс і робяць код больш чытэльным.

doc/by/array/general.md

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
## Ітэрацыі па масівам і ўласцівасці
2+
3+
Хоць масівы ў JavaScript — аб'екты, няма добрых падставаў для таго, каб
4+
выкарыстоўваць [цыкл `for in`](#object.forinloop) для ітэрацыі па масівах.
5+
Фактычна, ёсць шэраг добрых падстаў **супраць** гэтага.
6+
7+
> **Заўвага:** масівы JavaScript **не** *асацыятыўныя масівы*. JavaScript мае
8+
> [аб'екты](#object.general) для структуры ключ-значэнне. Але калі асацыятыўныя
9+
> масівы **захоўваюць** парадак, аб'екты — **не**.
10+
11+
З той прычыны, што цыкл `for in` пералічвае ўсе ўласцівасці, якія ёсць у ланцужку прататыпаў,
12+
і таму, што адзіны спосаб выключыць гэтыя значэнні — [`hasOwnProperty`](#object.hasownproperty),
13+
ітэрацыя атрымліваецца ў **20 разоў** марудней за звычайны цыкл `for`.
14+
15+
### Ітэрацыя
16+
17+
Для таго, каб атрымаць найлепшую прадукцыйнасць у ітэрацыі па масіву, лепш
18+
выкарыстаць класічны цыкл `for`.
19+
20+
var list = [1, 2, 3, 4, 5, ...... 100000000];
21+
for(var i = 0, l = list.length; i < l; i++) {
22+
console.log(list[i]);
23+
}
24+
25+
У вышэйпрыведзеным прыкладзе ёсць яшчэ адзін прыём, з дапамогай якога можна кэшаваць
26+
памер масіва: `l = list.length`.
27+
28+
Негледзячы на тое, што ўласцівасць `length` вызначана ў самім масіве, пошук
29+
гэтай уласцівасці накладвае выдаткі на пошук пры кожнай ітэрацыі цыкла. І хоць
30+
новыя рухавікі JavaScript **могуць** прымяніць аптымізацыю у гэтым выпадку, няма
31+
магчымасці дакладна ведаць, ці будзе код выкананы на гэтых новых рухавіках.
32+
33+
Фактычна, адсутнасць кэшавання можа зрабіць выкананне цыкла **ў два разы больш
34+
марудным**, чым з кэшаваным 'length'.
35+
36+
### Уласцівасць `length`
37+
38+
Хоць *гэтэр* уласцівасці `length` проста вяртае колькасць элементаў, што
39+
знаходзяцца у масіве, *сэтэр* можа быць выкарыстаны для **абразання** масіва.
40+
41+
var arr = [1, 2, 3, 4, 5, 6];
42+
arr.length = 3;
43+
arr; // [1, 2, 3]
44+
45+
arr.length = 6;
46+
arr.push(4);
47+
arr; // [1, 2, 3, undefined, undefined, undefined, 4]
48+
49+
Прысвойванне ўласцівасці 'length' меншага значэння абразае масіў. Прысваенне большага
50+
значэнне створыць разрэджаны масіў.
51+
52+
### У заключэнне
53+
54+
Для лепшай прадукцыйнасці рэкамендуецца заўсёды выкарыстоўваць звычайны цыкл `for`,
55+
і кэшаваць уласціваць `length`. Выкарыстоўванне `for in` для ітэрацыі па масіву —
56+
прыкмета дрэнна напісанага коду, схільнага да памылак і дрэннай прадукцыйнасці.

doc/by/core/delete.md

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
## Аператар `delete`
2+
3+
У JavaScript *немагчыма* выдаліць глабальныя пераменныя, функцыі і некаторыя іншыя
4+
рэчы, што маюць атрыбут `DontDelete`.
5+
6+
### Глабальны код і код функцый.
7+
8+
Калі пераменная або функцыя аб'яўленыя ў глабальнай зоне бачнасці, або [зоне бачнасці
9+
функцыі](#function.scopes) то яна будзе ўласцівасцю або аб'екта актывацыі, або
10+
глабальнай зоны бачнасці. Такія ўласцівасці маюць набор атрыбутаў, адзін з іх —
11+
`DontDelete`. Пераменныя і функцыі, аб'яўленыя ў глабальнай зоне бачнасці і зоне
12+
бачнасці функцыі, заўсёды ствараюцца з уласцівасцю `DontDelete`, а таму не могуць
13+
быць выдаленыя.
14+
15+
// глабальная пераменная:
16+
var a = 1; // мае ўласцівасць DontDelete
17+
delete a; // false
18+
a; // 1
19+
20+
// звычайная функцыя:
21+
function f() {} // мае ўласціваць DontDelete
22+
delete f; // false
23+
typeof f; // "function"
24+
25+
// перапрызначэнне не дапамагае:
26+
f = 1;
27+
delete f; // false
28+
f; // 1
29+
30+
### Яўна прызначаныя ўласцівасці
31+
32+
Яўна прызначаныя ўласцівасці могуць быць лёгка выдаленыя.
33+
34+
// яўна прызначаныя ўласцівасці:
35+
var obj = {x: 1};
36+
obj.y = 2;
37+
delete obj.x; // true
38+
delete obj.y; // true
39+
obj.x; // undefined
40+
obj.y; // undefined
41+
42+
У вышэйпрыведзеным прыкладзе, `obj.x` і `obj.y` могуць быць выдаленыя, бо не маюць
43+
атрыбута `DontDelete`. Таму і прыкад ніжэй працуе:
44+
45+
// Гэта працуе правільна, акрамя IE:
46+
var GLOBAL_OBJECT = this;
47+
GLOBAL_OBJECT.a = 1;
48+
a === GLOBAL_OBJECT.a; // true — глабальная пераменная
49+
delete GLOBAL_OBJECT.a; // true
50+
GLOBAL_OBJECT.a; // undefined
51+
52+
Гэта прыём, каб выдаліць `a`. [`this`](#function.this) спасылаецца на глабальны
53+
аб'ект, і мы яўна аб'яўляем пераменную `a` як яго ўласцівасць, што дазваляе нам
54+
выдаліць яе.
55+
56+
IE (прынамсі 6-8) мае хібы, таму вышэйпрыведзены код там працаваць не будзе.
57+
58+
### Аргументы функцый і ўбудаваныя ўласцівасці
59+
60+
Звычайныя аргументы функцыі, [аб'ект `arguments`](#function.arguments), а таксама
61+
убудаваныя ўласцівасці таксама маюць атрыбут `DontDelete`.
62+
63+
// аргументы функцыі і ўласцівасці:
64+
(function (x) {
65+
66+
delete arguments; // false
67+
typeof arguments; // "object"
68+
69+
delete x; // false
70+
x; // 1
71+
72+
function f(){}
73+
delete f.length; // false
74+
typeof f.length; // "number"
75+
76+
})(1);
77+
78+
### У заключэнне
79+
80+
Аператар `delete` часта паводзіць сябе нечакана, таму адзінае надзейнае выкарыстанне
81+
`delete` — выдаленне яўна прызначаных уласцівасцяў.

doc/by/core/eval.md

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
## Чаму не варта выкарыстоўваць `eval`
2+
3+
Функцыя `eval` выконвае радок JavaScript коду ў лакальнай зоне бачнасці.
4+
5+
var number = 1;
6+
function test() {
7+
var number = 2;
8+
eval('number = 3');
9+
return number;
10+
}
11+
test(); // 3
12+
number; // 1
13+
14+
Тым не менш, `eval` выконваецца ў лакальнай прасторы імён толькі ў тым выпадку, калі
15+
яна была выклікана наўпрост *і* імя выкліканай функцыі — `eval`.
16+
17+
var number = 1;
18+
function test() {
19+
var number = 2;
20+
var copyOfEval = eval;
21+
copyOfEval('number = 3');
22+
return number;
23+
}
24+
test(); // 2
25+
number; // 3
26+
27+
Лепш пазбягаць выкарыстоўвання `eval`. 99,9% яе «выкарыстанняў» можа быць дасягнута
28+
**без** яе.
29+
30+
### Схаваны `eval`
31+
32+
Абедзве [функцыі тайм-аўты](#other.timeouts) `setTimeout` і `setInterval` могуць
33+
прымаць радок у якасці першага аргумента. Гэты радок будзе **заўсёды** выконвацца
34+
ў глабальнай прасторы імёнаў, бо `eval` не выклікаецца наўпрост у дадзеным выпадку.
35+
36+
### Праблемы з бяспекаю
37+
38+
Таксама `eval` мае праблемы з бяспекаю, бо ён выконвае **любы** перададзены код.
39+
Таму яе **ніколі** не варта выкарыстоўваць з радкамі, што паходзяць з ненадзейных
40+
крыніцаў.
41+
42+
### Заключэнне
43+
44+
Лепш ніколі не выкарыстоўваць `eval`. Любы код, што выкарыстоўвае яе, спрэчны ў
45+
плане якасці, карэктнасці, прадукцыйнасці і бяспекі. Калі для таго, каб нешта
46+
працавала, патрэбны `eval`, **не** трэба прымаць гэта рашэнне ў першую чаргу.
47+
*Лепшым рашэннем* будзе тое, што не будзе выкарыстоўваць `eval`.

doc/by/core/semicolon.md

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
## Аўтаматычная ўстаўка кропкі з коскай
2+
3+
Хаця JavaScript мае C-падобны сінтакс, ён **не** прымушае выкарыстоўваць кропку
4+
з коскай у кодзе, таму ёсць магчымасць прапускаць іх.
5+
6+
Але JavaScript — не мова без кропак з коскай. Насамрэч яны патрэбны ёй, каб разумець
7+
зыходны код. Таму парсер JavaScript **аўтаматычна** ўстаўляе іх паўсюль, дзе
8+
сустракае памылку адсутнасці кропкі з коскай.
9+
10+
var foo = function() {
11+
} // памылка разбора, парсер чакаў кропку з коскай
12+
test()
13+
14+
Адбываецца ўстаўка, парсер спрабуе зноў.
15+
16+
var foo = function() {
17+
}; // памылкі няма, парсер працягвае
18+
test()
19+
20+
Аўтаматычная ўстаўка кропкі з коскай лічыцца адной з **найвялікшых** архітэктурных
21+
памылак у мове, бо *можа* змяніць паводзіны кода.
22+
23+
### Як яно працуе
24+
25+
Ніжэйпрыведзены код не мае кропак з коскай, таму парсер вырашае дзе іх уставіць.
26+
27+
(function(window, undefined) {
28+
function test(options) {
29+
log('testing!')
30+
31+
(options.list || []).forEach(function(i) {
32+
33+
})
34+
35+
options.value.test(
36+
'long string to pass here',
37+
'and another long string to pass'
38+
)
39+
40+
return
41+
{
42+
foo: function() {}
43+
}
44+
}
45+
window.test = test
46+
47+
})(window)
48+
49+
(function(window) {
50+
window.someLibrary = {}
51+
52+
})(window)
53+
54+
Ніжэй — вынік гульні парсера ў адгадванне.
55+
56+
(function(window, undefined) {
57+
function test(options) {
58+
59+
// Не ўстаўлена, радкі былі аб'яднаныя
60+
log('testing!')(options.list || []).forEach(function(i) {
61+
62+
}); // <- устаўлена
63+
64+
options.value.test(
65+
'long string to pass here',
66+
'and another long string to pass'
67+
); // <- устаўлена
68+
69+
return; // <- устаўлена, разбіў аператар return на два блока
70+
{ // парсер лічыць гэты блок асобным
71+
foo: function() {}
72+
}; // <- устаўлена
73+
}
74+
window.test = test; // <- устаўлена
75+
76+
// Радкі зноў аб'ядналіся
77+
})(window)(function(window) {
78+
window.someLibrary = {}; // <- устаўлена
79+
80+
})(window); //<- устаўлена
81+
82+
> **Заўвага:** Парсер JavaScript не апрацоўвае "карэктна" аператар return, калі
83+
> пасля яго пачынаецца новы радок. Магчыма прычына і не ў аўтаматычнай устаўцы
84+
> кропак з коскай, але гэта, тым не менш, непажаданы эфект.
85+
86+
Парсер кардынальна памяняў паводзіны кода. У пэўных выпадках ён прымае **памылковыя
87+
рашэнні**.
88+
89+
### Вядучыя дужкі
90+
91+
У выпадку вядучай дужкі парсер **не** уставіць кропку з коскай.
92+
93+
log('testing!')
94+
(options.list || []).forEach(function(i) {})
95+
96+
Гэты код ператворыцца ў радок.
97+
98+
log('testing!')(options.list || []).forEach(function(i) {})
99+
100+
**Вельмі** верагодна, што `log` **не** вяртае функцыю; Таму вышэйпрыведзены
101+
код справакуе `TypeError` з заявай, што `undefined` не з'яўляецца функцыяй.
102+
103+
### Заключэнне
104+
105+
Крайне рэкамендуецца **ніколі** не прапускаць кропку з коскай. Таксама заўсёды
106+
рэкамендуецца ставіць дужкі на той жа лініі, што і адпаведныя канструкцыі, і ніколі
107+
не прапускаць іх у аднарадковых канструкцыях `if` / `else`. Гэтыя меры не толькі
108+
павысяць кансістэнтнасць кода, але таксама прадухіляць ад таго, што парсер
109+
JavaScript зменіць паводзіны кода.

0 commit comments

Comments
 (0)