Сначала поговорим про || (логическое ИЛИ). Буквально он возвращает false только когда обе стороны false; в противном случае он возвращает true.

alert(true||false);       // true
alert(false||true);       // true
alert(true||true);        // true
alert(false||false);      // false

Однако в более глубоком смысле всё иначе. Попробуйте следующий код:

alert(0||1);

Очевидно, мы знаем, что предшествующее значение 0 означает false, а последующее значение 1 означает true, поэтому приведённый выше результат должен быть true, но фактически возвращается 1. Посмотрите код ниже:

alert(2||1);

Мы знаем, что предшествующее значение 2 истинно, а последующее значение 1 тоже истинно. Так каков возвращаемый результат? Результат теста — 2. Продолжаем:

alert('a'||1);

Аналогично, предшествующее значение 'a' истинно, а последующее значение 1 тоже истинно; результат теста — 'a'. Ниже:

alert(''||1);

Из вышесказанного мы знаем, что предшествующее '' является ложным, а следующее 1 — истинным, и возвращаемый результат равен 1. Смотрите ниже:

alert('a'||0);

Предшествующее 'a' истинно, тогда как следующее 0 ложно, поэтому возвращаемый результат — 'a'. Продолжаем ниже:

alert('a'||'b');

Предшествующее 'a' истинно, а следующее 'b' ложно, поэтому возвращаемый результат — 'a'. Продолжаем ниже:

alert(''||0);

Предшествующее '' ложно, и следующее 0 также ложно, поэтому возвращаемый результат равен 0.

alert(0||'');

Предшествующее значение 0 ложно, а следующее значение '' ложно, поэтому возвращаемый результат — ''.

Это означает:

  • 1. Если значение перед || ложно, независимо от того, истинно или ложно значение после ||, возвращается значение после ||.
  • 2. Если значение перед || истинно, независимо от того, истинно или ложно значение после ||, возвращается значение перед ||.

Во-вторых, поговорим о && (логическое И). Буквально, он возвращает истину только тогда, когда обе стороны истинны; в противном случае он возвращает ложь.

alert(true&&false);      // false
alert(true&&true);       // true
alert(false&&false);     // false
alert(false&&true);      // false

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

alert(''&&1);

Возвращается ''. Значение перед && — '' (ложно), а значение после — 1 (истинно).

alert(''&&0);

Возвращается ''. Значение перед && — '' (ложно), а значение после — 0 (также ложно).

alert('a'&&1);

Возвращается 1. Значение перед && — 'a' (истинно), а значение после — 1 (также истинно).

alert('a'&&0);

Результат возвращает 0. Значение перед && — 'a' (true), а значение после — 0 (false).

alert('a'&&'');

Результат возвращает ''. Значение перед && — 'a' (true), а значение после — '' (false).

alert(0&&'a');

Результат возвращает 0. Значение перед && — 0 (false), а значение после — 'a' (true).

alert(0&&'');

Результат возвращает 0. Значение перед && — 0 (false), а значение после — '' (тоже false).

Это означает:

  • 1. Если значение перед && равно false, независимо от того, равно ли значение после && true или false, результат вернёт значение перед &&.
  • 2. Если значение перед && равно true, независимо от того, равно ли значение после && true или false, результат вернёт значение после &&.

Подведём итог:

  • 1. Если значение перед || равно false, независимо от того, равно ли значение после || true или false, результат возвращает значение после ||.
  • 2. Если значение перед || равно true, независимо от того, равно ли значение после || true или false, результат возвращает значение перед ||.
  • 3. Если значение перед && равно false, независимо от того, равно ли значение после && true или false, результат вернёт значение перед &&.
  • 4. Если значение перед && равно true, независимо от того, равно ли значение после && true или false, результат вернёт значение после &&.

Из двух приведённых выше тестов следует, что логические операторы || и && оба подчиняются принципу короткого замыкания. Если истинность значения перед символом определена, можно определить возвращаемое значение.

Следует отметить, что && имеет более высокий приоритет, чем ||. Тест ниже:

alert(1||'a'&&2);

Возвращаемый результат равен 1.

Согласно принципу доказательства от противного, предположим, что приоритет || не ниже && (причина использования "не ниже" здесь в том, чтобы также доказать случай, когда они имеют одинаковый приоритет).

Согласно выводу (1), полученному выше, (1 || 'a') вернёт предыдущее значение 1; согласно выводу (4), (1 && 2) должно вернуть следующее значение 2. Это, очевидно, неверно. Из этого видно, что && имеет более высокий приоритет, чем ||.

Источник URL: http://www.cnblogs.com/pigtail/archive/2012/03/09/2387486.html