Skip to content

Commit 2d6c991

Browse files
committed
types/typeof
1 parent 7d6087a commit 2d6c991

File tree

2 files changed

+23
-46
lines changed

2 files changed

+23
-46
lines changed

doc/ru/appendix/fromtranslators.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
Относитесь с **мудростью** к тому, что вы пишете — *важно* знать как работает именно ваш код и как это соответствует приведённым в статье тезисам — и уже из этого вы сможете делать вывод, подходит ли вам тот или иной подход или нет. *Важно* знать как работает [прототипное наследование](#object.prototype), но это не так необходимо, если вы используете функциональный подход или пользуетесь какой-либо сторонней библиотекой. Важно помнить о том, что у вас недостаёт какого-либо конкретного знания и что пробел следует заполнить, но если вы не используете в работе эту часть, вы всё равно можете писать хороший код — ну, если у вас есть талант.
66

7-
К примеру, в статье про [сравнение объектов](#types.equality) авторы рекомендуют использовать только оператор строгого неравенства `===`. Но мы считаем, если вы уверены и осознали, что оба сравниваемых операнда имеют один тип, вы имеете право опустить последний символ `=`. Вы вольны применять строгое неравенство только если вы не уверены в типах операндов (`=== undefined` — это полезный приём). Так в вашем коде будут опасные и безопасные области, но при этом по коду будет явно видно, где вы рассчитываете на переменные одинаковых типов, а где позволяете пользователю вольности.
7+
К примеру, в статье про [сравнение объектов](#types.equality) авторы рекомендуют использовать только оператор строгого неравенства `===`. Но мы считаем, если вы уверены и осознали, что оба сравниваемых операнда имеют один тип, вы имеете право опустить последний символ `=`. Вы вольны применять строгое неравенство только если вы не уверены в типах операндов (`!== undefined` — это полезный приём). Так в вашем коде будут опасные и безопасные области, но при этом по коду будет явно видно, где вы рассчитываете на переменные одинаковых типов, а где позволяете пользователю вольности.
88

99
Гонка за оптимизацией — это драматично и правильно, но лучше написать работающий и понятный вам код, а потом уже его оптимизировать и искать узкие места, при необходимости. Оптимизацию необходимо делать, если вы видите явные неудобства для пользователя в тех или иных браузерах или у вас есть супер-крупный проект, которым никогда мешает оптимизация, или вы работаете с какой-либо сверхтребовательной технологией типа WebGL. Данная документация очень поможет вам в определении этих узких мест.
1010

doc/ru/types/typeof.md

Lines changed: 22 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,14 @@
1-
## The `typeof` operator
1+
## Оператор `typeof`
22

3-
The `typeof` operator (together with
4-
[`instanceof`](#types.instanceof)) is probably the biggest
5-
design flaw of JavaScript, as it is near of being **completely broken**.
3+
Оператор `typeof` (вместе с [`instanceof`](#types.instanceof)) — это, вероятно, самая большая недоделка в JavaScript, поскольку, похоже, он **поломан более чем полностью**.
64

7-
Although `instanceof` still has its limited uses, `typeof` really has only one
8-
practical use case, which does **not** happen to be checking the type of an
9-
object.
5+
Хотя `instanceof` еще имеет ограниченное применение, `typeof` на самом деле имеет *только один* практический случай применения, который при этом **не** является проверкой типа объекта.
106

11-
> **Note:** While `typeof` can also be called with a function like syntax
12-
> i.e. `typeof(obj)`, this is not a function call. The two parenthesis will
13-
> behave like normal and the return value will be used as the operand of the
14-
> `typeof` operator. There is **no** `typeof` function.
7+
> **Замечаение:** Хотя для вызова `typeof` также можно использовать синтаксис функции, т.е. `typeof(obj)`, на самом деле это не функция. Двойные круглые скобки будут работать нормально и возвращаемое значение будет использоваться как операнд оператора `typeof`. Но функции `typeof`**нет**.
158
16-
### The JavaScript type table
9+
### Таблица типов JavaScript
1710

18-
Value Class Type
11+
Значение Класс Тип
1912
-------------------------------------
2013
"foo" String string
2114
new String("foo") String object
@@ -28,60 +21,44 @@ object.
2821
[1,2,3] Array object
2922
new Array(1, 2, 3) Array object
3023
new Function("") Function function
31-
/abc/g RegExp object (function in Nitro/V8)
32-
new RegExp("meow") RegExp object (function in Nitro/V8)
24+
/abc/g RegExp object (function в Nitro/V8)
25+
new RegExp("meow") RegExp object (function в Nitro/V8)
3326
{} Object object
3427
new Object() Object object
3528

36-
In the above table *Type* refers to the value, that the `typeof` operator returns.
37-
As can be clearly seen, this value is anything but consistent.
29+
В таблице выше *Тип* представляет собой значение, возвращаемое оператором `typeof`. Как хорошо видно, это значение может быть абсолютно любым, но не логичным.
3830

39-
The *Class* refers to the value of the internal `[[Class]]` property of an object.
31+
*Класс* представляет собой значение внутреннего свойства `[[Class]]` объекта.
4032

41-
> **From the Specification:** The value of `[[Class]]` can be one of the
42-
> following strings. `Arguments`, `Array`, `Boolean`, `Date`, `Error`,
43-
> `Function`, `JSON`, `Math`, `Number`, `Object`, `RegExp`, `String`.
33+
> **Из спецификации:** Значением `[[Class]]` может быть одна из следующих строк: `Arguments`, `Array`, `Boolean`, `Date`, `Error`, `Function`, `JSON`, `Math`, `Number`, `Object`, `RegExp`, `String`.
4434
45-
In order to retrieve the value of `[[Class]]` one has to make use of the
46-
`toString` method of `Object.prototype`.
35+
Для того, чтобы получить значение `[[Class]]` необходимо вызвать метод `toString` у `Object.prototype`.
4736

48-
### The Class of an object
37+
### Класс объекта
4938

50-
The specification gives exactly one way of accessing the `[[Class]]` value,
51-
with the use of `Object.prototype.toString`.
39+
Спецификация предоставляет только один способ доступа к значению `[[Class]]` — с использованием `Object.prototype.toString`.
5240

5341
function is(type, obj) {
5442
var clas = Object.prototype.toString.call(obj).slice(8, -1);
5543
return obj !== undefined && obj !== null && clas === type;
5644
}
57-
45+
5846
is('String', 'test'); // true
5947
is('String', new String('test')); // true
6048

61-
In the above example, `Object.prototype.toString` gets called with the value of
62-
[this](#function.this) being set to the object whose `[[Class]]` value should be
63-
retrieved.
49+
В примере выше `Object.prototype.toString` вызывается со значением [this](#function.this), являющимся объектом, значение [[Class]] которого нужно получить.
6450

65-
> **ES5 Note:** For convenience the return value of `Object.prototype.toString`
66-
> for both `null` and `undefined` was **changed** from `Object` to `Null` and
67-
> `Undefined` in ECMAScript 5.
51+
> **ES5 Замечание:** Для удобства в ECMAScript 5 возвращаемое значение `Object.prototype.toString `для `null` и `undefined` было изменено с `Object` на `Null` и `Undefined` соответственно.
6852
69-
### Testing for undefined variables
53+
### Проверка переменных на определённость
7054

7155
typeof foo !== 'undefined'
7256

73-
The above will check whether `foo` was actually declared or not; just
74-
referencing it would result in a `ReferenceError`. This is the only thing
75-
`typeof` is actually useful for.
76-
77-
### In conclusion
57+
Выше проверяется, было ли `foo` действительно объявлено или нет; просто обращение к переменной приведёт к `ReferenceError`. Это единственное, чем на самом деле полезен `typeof`.
7858

79-
In order to check the type of an object, it is highly recommended to use
80-
`Object.prototype.toString`; as this is the only reliable way of doing so.
81-
As shown in the above type table, some return values of `typeof` are not defined
82-
in the specification; thus, they can differ across various implementations.
59+
### Заключение
8360

84-
Unless checking whether a variable is defined, `typeof` should be avoided at
85-
**all costs**.
61+
Для проверки типа объекта настоятельно рекомендуется использовать` Object.prototype.toString` — это единственный надежный способ. Как показано выше в таблице типов, некоторые возвращаемые `typeof` значения не определены в спецификации: таким образом, они могут отличаться в различных реализациях.
8662

63+
Кроме проверки, была ли определена переменная, `typeof` следует избегать **во что бы то ни стало**.
8764

0 commit comments

Comments
 (0)