JavaScript. Подробное руководство, 6-е издание, стр. 42

// Скопировать свойства объекта о в объект р и вернуть р

<b>function сору(о, р) {</b>

<b>  р = р || {}; // Если объект р не был передан, создать новый объект.</b>

<b>  // реализация тела функции</b>

<b>}</b>

4.10.3. Логическое НЕ (!)

Оператор

<b>!</b>
является унарным оператором, помещаемым перед одиночным операндом. Он используется для инверсии логического значения своего операнда. Например, если переменная х имеет истинное значение, то выражение
<b>!х</b>
возвращает значение
<b>false</b>
. Если х имеет ложное значение, то выражение
<b>!х</b>
возвращает значение
<b>false</b>
. (true - вообще-то)

В отличие от операторов

<b>&amp;&amp;</b>
и
<b>||</b>
, оператор
<b>!</b>
преобразует свой операнд в логическое значение (используя правила, описанные в главе 3) перед тем, как инвертировать его. Это означает, что оператор ! всегда возвращает
<b>true</b>
или
<b>false</b>
что всегда можно преобразовать любое значение х в его логический эквивалент, дважды применив этот оператор:
<b>!!х</b>
(раздел 3.8.2).

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

<b>р &amp;&amp; q</b>
, необходимо будет использовать круглые скобки:
<b>! (р &amp;&amp; q).</b>
В булевой алгебре есть две теоремы, которые можно выразить на языке JavaScript:

// Следующие две проверки на идентичность дают положительный результат

// при любых значениях р и q

!(р && q) === !р || !q !(р || q) === !р && !q

4.11. Выражения присваивания

Для присваивания значения переменной или свойству в языке JavaScript используется оператор

<b>=</b>
. Например:

<b>і = 0 // Присвоит переменной і значение 0.</b>

<b>о.х = 1 // Присвоит свойству х объекта о значение 1.</b>

Левым операндом оператора = должно быть левостороннее выражение: переменная, элемент массива или свойство объекта. Правым операндом может быть любое значение любого типа. Значением оператора присваивания является значение правого операнда. Побочный эффект оператора = заключается в присваивании значения правого операнда переменной или свойству, указанному слева, так что при последующих обращениях к переменной или свойству будет получено это значение.

Чаще всего выражения присваивания используются как самостоятельные инструкции; тем не менее иногда можно увидеть, как выражение присваивания включается в более сложные выражения. Например, в одном выражении можно совместить операции присваивания и проверки значения:

<b>(а = b) == 0</b>

обычно бывает необходимо использовать круглые скобки, если выражение присваивания используется в составе более сложного выражения.

Оператор присваивания имеет ассоциативность справа налево, поэтому при наличии в выражении нескольких операторов присваивания они вычисляются справа налево. Благодаря этому можно написать код, присваивающий одно значение нескольким переменным, например:

<b>i = j = к = 0; // Инициализировать 3 переменные значением 0</b>

4.11.1. Присваивание с операцией

Помимо обычного оператора присваивания = в языке JavaScript поддерживается несколько других операторов, объединяющих присваивание с некоторой другой операцией. Например, оператор += выполняет сложение и присваивание. Следующее выражение:

<b>total += sales_tax</b>

эквивалентно выражению:

<b>total = total + sales_tax</b>

Как можно было ожидать, оператор += работает и с числами, и со строками. Для числовых операндов он выполняет сложение и присваивание, а для строковых -конкатенацию и присваивание.

Из подобных ему операторов можно назвать -=, *=, &= и др. Все операторы присваивания с операцией перечислены в табл. 4.2.

JavaScript. Подробное руководство, 6-е издание - i_007.jpg

В большинстве случаев выражение:

<b>а ор= b</b>

где ор означает оператор, эквивалентно выражению:

<b>а = a op b</b>

В первой строке выражение а вычисляется только один раз. Во второй - дважды. Эти выражения отличаются, только если подвыражение а содержит операции, имеющие побочные эффекты, такие как вызов функции или оператор инкремента. Например, следующие два выражения присваивания неэквивалентны:

<b>data[i++] *= 2; </b>

<b>data[i++] = data[i++] * 2;</b>

4.12. Вычисление выражений

Подобно многим интерпретирующим языкам, JavaScript поддерживает возможность интерпретации строк с программным кодом на языке JavaScript, выполняя их, чтобы получить некоторое значение. В JavaScript эта операция выполняется с помощью глобальной функции eval():

<b>eval(&quot;3+2&quot;) // =&gt; 5</b>

Динамическое выполнение строк с программным кодом является мощной особенностью языка, которая практически никогда не требуется на практике. Если у вас появится желание использовать функцию

<b>eval(),</b>
задумайтесь - действительно ли это необходимо.

В подразделах ниже описываются основы использования функции

<b>eval()</b>
и затем рассказывается о двух ее ограниченных версиях, которые оказывают меньше влияния на оптимизатор.

eval() - функция или оператор?

<b>eval()</b>
является функцией, но знакомство с ней включено в главу, описывающую операторы, потому что в действительности она должна была бы быть оператором. В самых ранних версиях языка
<b>eval()</b>
определялась как функция, но с тех пор проектировщики языка и разработчики интерпретаторов наложили на нее столько ограничений, что она стала больше похожа на оператор. Современные интерпретаторы JavaScript детально анализируют программный код и выполняют множество оптимизаций. Проблема функции
<b>eval()</b>
заключается в том, что программный код, который она выполняет, в целом не доступен для анализа. Вообще говоря, если функция вызывает
<b>eval()</b>
, интерпретатор не может оптимизировать эту функцию. Проблема с определением
<b>eval()</b>
как функции заключается в том, что ей можно присвоить другие имена: