2015-08-12 4 views
-1
x = 1 || 2; 
alert(x); 
x = undefined || 2; 
alert(x); 

По-видимому x в приведенном выше коде не возвращает логическое значение. Он возвращает первое действительное значение, которое равно 1 в первом случае и 2 во втором случае.Логические операторы и назначение Javascript?

Есть ли какая-нибудь другая странность, как это я должен следить?

+0

этот вопрос слишком широк, поскольку JavaScript полон интересного поведения из-за его системы типов и других принципов проектирования. Например, попробуйте добавить два целых числа, которые хранятся в строках var '' 'a =" 1 "' '' и '' 'var b =" 2 "' ''. '' 'var c = a + b' '' будет '' '' 12 "' '', а не '' '3''' – luksch

+0

, когда вы помещаете выражения js в if (выражение), это оценивается как если бы !! двойной нет. Все значения в if/while будут давать вам логическое выражение, если (1 || 2)> true и x = 1 || 2 будет хранить x = 1, – joyBlanks

+2

Поведение логического оператора OR не является «странностью», это [хорошо документально] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators#Description) ... – Teemu

ответ

2

Оператор || в Javascript как в x || y будет оценивать первые операнды, если он правдивый или второй операнд, если первый не является правдивым. Это documented on MDN here.

truthy в Javascript описан here on MDN. Это в принципе, ничего, кроме одного из falsey значений, которые являются:

false 
null 
undefined 
0 
NaN 
"" 

Таким образом, вы должны думать о || оператора, как то, что дело в truthy/falsey, а не в чистом Booleans.

Оператор работает так, как было указано, и сотни тысяч разработчиков научились этому и успешно его использовали. Это не чистый булев оператор. Он не обязательно возвращает логическое значение. Это отличается от некоторых других языков. Если вы хотите называть разные «странные», вы можете по-вашему. Но это то, что есть, и это всегда было в Javascript.

Легко узнать, что он делает и использовать для этого. При понимании намерений дизайна нет реальной странности или непредсказуемости ее спецификации или реализации.

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

+0

Хорошо, а что относительно && оценивает объединение двух правных значений? т.е. [1, 2, 3] и [2, 3] == [2, 3]? – veta

+0

@veta - '&&' объясняется [здесь, по MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators#Description). Цитата из этого: * Возвращает expr1, если он может быть преобразован в false; в противном случае возвращает expr2. Таким образом, при использовании с булевыми значениями && возвращает true, если оба операнда истинны; в противном случае возвращает false. * – jfriend00

Смежные вопросы