Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions 1-js/02-first-steps/06-type-conversions/2-WAT/solution.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
`[]` + `[]` === `""`

Плюс говорит о строковой операции, а для строковых операций вызывается метод `toString`, который переводит массив в пустую строку

`[]` + `{}` === `"[object Object]"`

тот же принцип, что и в первом примере — плюс переводит объекты в строку, поэтому на обоих операторах вызывается метод `toString`

`{}` + `[]` === `0`

пустые фигурные скобки трактуются как пустой блок кода, а не как объект, поэтому их можно отбросить. Остается `+[]`: приведение через унарный плюс массива в число. Пустой массив приводится в число как `0`

`{}` + `{}` === `"[object Object][object Object]"`

одни браузеры считают это сложением двух объектов, в то время как другие — опускают пустой блок кода, оставляя объект, переведённый в число унарным плюсом, что, логично, даёт `NaN`

`Array(3).join("wat" - 1)` === `"NaNNaN"`

метод `join` возвращает строку из элементов массива с разделителем, переданным параметром. `"wat" - 1` даст `NaN`, который переводится в строку как `NaN`

17 changes: 17 additions & 0 deletions 1-js/02-first-steps/06-type-conversions/2-WAT/task.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
importance: 5

---

# WAT

Если вы уже знаете, что такое массив и объект, попробуйте ответить, что выведут примеры ниже.

```js no-beautify
[] + []
[] + {}
{} + []
{} + {}
Array(3).join("wat" - 1)
```

Когда закончите – сверьтесь с решением.
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
```js no-beautify
'5' - 3 === 2 // (1)
'5' + 3 === '53' // (2)
'5' - '4' === 1 // (3)
'5' + + '5' === '55' // (4)
'foo' + + 'foo' === 'fooNaN' // (5)
'5' + - '2' === '5-2' // (6)
'5' + - + - - + - - + + - + - + - + - - - '-2' === '52' // (7)
let x = 3;
'5' + x - x === 50 // (8)
'5' - x + x === 5 // (9)
```

1. Оператор `-` является числовым, строка `'5'` переводится в число и получается `5 - 3`.
2. Оператор `+` используется для строковых и математических операций, он имеет левую ассоциативность, и из-за этого `3` становится строкой и получается `'5' + '3'`.
3. Оператор `-` является числовым, строки преобразуются в числа, и получается `5 - 4`.
4. Приоритет у операторов `+` одинаковый, из-за этого происходит следующее: берётся первая часть `'5' +` и ожидается результат вычисления `+ '5'` (перевод строки в число). Получается `'5' + 5`, что в итоге даёт `55`.
5. Идея такая же, как и в предыдущем выражении, но тут во второй части `+ 'foo'` происходит попытка преобразовать `'foo'` в число, что даёт `NaN`.
6. Всё тот же принцип, но в этом примере вторая часть `- '2'` преобразовывается в число `-2`. В итоге получается `'5' + -2 = '5-2'`.
7. Сначала идёт строка `'5'`, к которой добавляется результат вычисления следующего за ней выражения. В нём идут унарные операторы `+` и `-`. Унарный `+` просто приводит строку в число, а унарный `-` приводит строку в число и меняет знак на противоположный. То есть унарный `+` в данном выражении можно не учитывать, а просто посчитать количество `-` - выходит 11 знаков, что является нечётным числом и в конечном итоге даёт один `-` (если бы было чётное число, то был бы `+`). Далее вычисляем `- '-2'` и получаем в итоге `'5' + 2 = '52'`.
8. `'5' + 3 = '53'` строковое сложение, далее `'53' - 3`.
9. `'5' - 3 = 2` математическое вычитание, далее `2 + 3`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
importance: 5

---

# Продвинутое преобразование типов

Попробуйте ответить, что выведут примеры ниже.

```js no-beautify
'5' - 3
'5' + 3
'5' - '4'
'5' + + '5'
'foo' + + 'foo'
'5' + - '2'
'5' + - + - - + - - + + - + - + - + - - - '-2'
let x = 3;
'5' + x - x
'5' - x + x
```

Когда закончите – сверьтесь с решением.