renovations

This commit is contained in:
Ilya Kantor 2015-02-19 23:57:02 +03:00
parent e706693c7e
commit 24171550ae
23 changed files with 196 additions and 76 deletions

View file

@ -30,4 +30,4 @@ alert( [1,[0],2][1] );
Квадратные скобки после массива/объекта обозначают не другой массив, а взятие элемента.
</li>
<li>Каждый объект преобразуется к примитиву. У встроенных объектов `Object` нет подходящего `valueOf`, поэтому используется `toString`, так что складываются в итоге строковые представления объектов.</li>
</ol>
</ol>

View file

@ -234,5 +234,29 @@ if ( value ) {
Полный алгоритм преобразований есть в спецификации EcmaScript, смотрите пункты [11.8.5](http://es5.github.com/x11.html#x11.8.5), [11.9.3](http://es5.github.com/x11.html#x11.9.3), а также [9.1](http://es5.github.com/x9.html#x9.1) и [9.3](http://es5.github.com/x9.html#x9.3).
Заметим, для полноты картины, что некоторые тесты знаний в интернет предлагают вопросы типа:
```js
{}[0] // чему равно?
{} + {} // а так?
```
Если вы запустите эти выражения в консоли, то результат может показаться странным. Подвох здесь в том, что если фигурные скобки `{...}` идут не в выражении, а в основном потоке кода, то JavaScript считает, что это не объект, а "блок кода" (как `if`, `for`, но без оператора, просто группировка команд вместе, используется редко).
Вот блок кода с командой:
```js
//+run
{
alert("Блок")
}
```
А если команду изъять, то будет пустой блок `{}`, который ничего не делает. Два примера выше как раз содержат пустой блок в начале, который ничего не делает. Иначе говоря:
```js
{}[0] // то же что и: [0]
{} + {} // то же что и: + {}
```
То есть, такие вопросы -- не на преобразование типов, а на понимание, что если `{ ... }` находится вне выражений, то это не объект, а блок.