Skip to content

Commit 812a040

Browse files
committed
core translation
1 parent 9a3a1a3 commit 812a040

File tree

3 files changed

+98
-22
lines changed

3 files changed

+98
-22
lines changed

doc/ru/core/delete.md

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

doc/ru/core/semicolon.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
## Автоматическая вставка точек с запятой
22

3-
Хоть JavaScript и имеет синтаксис, подобный языкам семейства C, он при этом **не** принуждает вас ставить точки с запятой в исходном коде — вы всегда можете их опустить.
3+
Несмотря на то, что JavaScript имеет синтаксис, подобный языкам семейства C, он никоим образом **не принуждает** вас ставить точки с запятой в исходном коде — вы всегда вольны их опустить.
44

5-
При этом JavaScript — не язык без точек с запятой, они на самом деле нужны ему, чтобы он мог разобраться в вашем коде. Поэтому парсер JavaScript **автоматически** вставляет их в те места, где сталкивается с ошибкой парсинга из-за их отсутствия.
5+
При этом JavaScript — вовсе не язык с полным отсутствием точек с запятой: они на самом деле нужны ему для того, чтобы он мог разобраться в вашем коде. Поэтому парсер JavaScript **автоматически** вставляет их в те места, где сталкивается с ошибкой парсинга по причине их отсутствия.
66

77
var foo = function() {
88
} // ошибка разбора, ожидается точка с запятой
@@ -14,15 +14,15 @@
1414
}; // ошибки нет, парсер продолжает
1515
test()
1616

17-
Автоматическая вставка точек с запятой считается одним из **наибольших** упущений в проекте языка, поскольку она *может* изменить поведение кода.
17+
Автоматическая вставка точек с запятой считается одним из **наибольших** упущений в проекте языка, поскольку она *действительно может* влиять на поведение кода.
1818

1919
### Как это работает
2020

2121
Приведённый код не содержит точек с запятой, так что места для их вставки остаются на совести парсера:
2222

2323
(function(window, undefined) {
2424
function test(options) {
25-
log('тестируем!')
25+
log('проверяем!')
2626

2727
(options.list || []).forEach(function(i) {
2828

@@ -78,22 +78,22 @@
7878

7979
})(window); //<- вставлена
8080

81-
> **Замечание:** Парсер JavaScript некорректно обрабатывает оператор `return`, за которым следует новая строка; кстати, причина может быть и не в автоматической вставке точек с запятой, но это в любом случае нежелательный побочный эффект
81+
> **Замечание:** Парсер JavaScript некорректно обрабатывает оператор `return`, за которым следует новая строка; Причина может быть и не в автоматической вставке точек с запятой, но без сомнений, это нежелательный побочный эффект.
8282
83-
Парсер радикально подменил поведение изначального кода, а в определённых случаях он сделал **абсолютно неправильные выводы**.
83+
Парсер радикально поменял поведение изначального кода, а в определённых случаях он вообще сделал **абсолютно неправильные выводы**.
8484

8585
### «Висящие» скобки
8686

87-
Если парсер встречает «висящую» скобку, то он **не** вставляет точку с запятой.
87+
Если парсер встречает «висящую» открывающую скобку, то он **не** вставляет точку с запятой.
8888

8989
log('тестируем!')
9090
(options.list || []).forEach(function(i) {})
9191

92-
Такой код трасформируется в строку
92+
Такой код трасформируется в одну склеенную строку.
9393

9494
log('тестируем!')(options.list || []).forEach(function(i) {})
9595

96-
**Чрезвычайно** высоки шансы, что `log` возращает **не** функцию; таким образом, эта строка вызовет `TypeError` с сообщением о том, что `undefined не является функцией`.
96+
**Чрезвычайно** высоки шансы, что `log` **не** возращает *никаких* функций; таким образом, выполнение кода с такой строкой породит `TypeError` с сообщением о том, что `undefined не является функцией`.
9797

9898
### Заключение
9999

doc/ru/core/undefined.md

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,19 @@
1515
- При попытке доступа к глобальной переменной `undefined` (если она не была переопределена).
1616
- При попытке доступа к переменной, которая *ещё не была* инициализирована каким-либо значением.
1717
- Неявный возврат из функции при отсутствии в ней оператора `return`.
18-
- Из операторов `return`, которые не возвращают явных значений.
19-
- В результате поиска несуществующего свойства у объекта (и доступа к нему).
20-
- При доступе к аргументам функции, которые явно не были в неё переданы.
21-
- При доступе ко всему, чьим значением является `undefined`.
22-
- В результате вычисления любого выражения в форме `void(выражение)`.
18+
- Из оператора `return`, который не возвращает явного значения.
19+
- В результате поиска несуществующего свойства у объекта (и/или доступа к нему).
20+
- При попытке доступа к аргументу функции, который не был передан в неё явно.
21+
- При попытке доступа ко всему, чьим значением является `undefined`.
22+
- В результате вычисления любого выражения, соответствующего форме `void(выражение)`.
2323

24-
### Обработка изменений значения `undefined`
24+
### Защита от потенциальных изменений значения `undefined`
2525

26-
Поскольку глобальная переменная `undefined` содержит копию настоящего *значения* `undefined`, присвоение этой переменной нового значения **не** изменяет значения *типа* `undefined`.
26+
Поскольку глобальная переменная `undefined` содержит копию реального *значения* `undefined`, присвоение этой переменной нового значения **не** изменяет значения у *типа* `undefined`.
2727

28-
Но при этом, чтобы сравнить что-либо со *значением* `undefined` прежде нужно получить значение самой *переменной* `undefined`.
28+
Получается, чтобы проверить нечто с типом `undefined` на соответствие значению `undefined`, прежде нужно узнать изначальное значение переменной `undefined`.
2929

30-
Чтобы защитить код от переопределения переменной `undefined`, часто используется техника [анонимной обёртки](#function.scopes), которая использует отсутствующий аргумент.
30+
Чтобы защитить код от переопределения переменной `undefined`, часто используют технику [анонимной обёртки](#function.scopes), в которую добавляют аргумент и намеренно не передают его значение.
3131

3232
var undefined = 123;
3333
(function(something, foo, undefined) {
@@ -45,11 +45,11 @@
4545

4646
})('Hello World', 42);
4747

48-
Единственная разница между этими вариантами в том, что последняя версия будет больше на 4 байта при минификации, а в первом случае внутри анонимной обёртки нет дополнительного оператора `var`.
48+
Единственная разница между этими вариантами в том, что последняя версия будет больше на 4 байта при минификации, и в первом случае внутри анонимной обёртки нет дополнительного оператора `var`.
4949

50-
### Использование `null`
50+
### Применение `null`
5151

52-
Хотя `undefined` в контексте языка JavaScript чаще используется в качестве традиционного *null*, настоящий `null` (и тип и литерал) является в большей или меньшей степени просто другим типом данных.
52+
Хотя `undefined` в контексте языка JavaScript чаще используется в роли традиционного *null*, настоящий `null` (и тип и литерал) является, в некоторой степени, просто другим типом данных.
5353

54-
Он используется во внутренних механизмах JavaScript (например для определения конца цепочки прототипов засчёт присваивания `Foo.prototype = null`). Но в большинстве случаев тип `null` может быть заменён на `undefined`.
54+
Он используется во внутренних механизмах JavaScript (в случаях вроде установки конца цепочки прототипов через присваивание `Foo.prototype = null`). Но почти во всех случаях тип `null` может быть заменён на `undefined`.
5555

0 commit comments

Comments
 (0)