Статьи

Назначение внутри условия

В PHP очень часто можно увидеть код, написанный следующим образом:

if($summary = get_post_summary())
{
    return $summary;
}

Я имею в виду назначение внутри условия . Как ни странно, это может быть сделано и в JavaScript, хотя это гораздо реже:

 if(summary = document.getElementById("post-summary"))
{
    return summary.innerHTML;
}

На первый взгляд, вы будете прощены за то, что думаете, что это опечатка! Действительно, некоторые отладчики будут отмечать это предупреждением, спрашивая, имели ли вы в виду проверку на равенство ( ===

Но это не ошибка — ключ к пониманию состоит в том, чтобы понять две вещи :

Сначала присваивание возвращает значение (значение, которое вы присвоили). Второе и самое важное, возвращаемое значение оценивается как истинное или ложное и в конечном итоге определяет, выполняется ли условие.

Теперь, в мире оценки и обхода DOM , этот метод является безопасным и предсказуемым, потому что узлы DOM либо существуют, либо являются null—nullfalse . Таким образом, в приведенном выше примере кода условие будет иметь значение true"#post-summary"false

Точно так же вы можете использовать тот же трюк, чтобы перебрать неизвестную иерархию, проходя через последовательных родителей с помощью while() В этом примере создается массив каждого имени узла между целью события и #document

 var names = [], node = e ? e.target : event.srcElement;
do
{
    names.push(node.nodeName);
}
while(node = node.parentNode)

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

Например, положительные и отрицательные числа оцениваются как trueNaN . И как ни странно, objectBooleanвсегда оценивается как truenew Boolean(false)

Так что будьте осторожны! Такой синтаксис не для слабонервных; и при этом это не должно использоваться неосторожным способом, с чрезмерной уверенностью в преобразовании типов и приведении произвольных значений. Но при хорошем использовании в подходящих обстоятельствах он может упростить многие условия для создания более быстрого и экономичного кода.

Миниатюра кредит: sbwoodside