JavaScript Добавление булевых

console.log(true+true); //2
console.log(typeof(true+true)); //number
console.log(isNaN(true+true)); //false

Почему добавляется 2 булевых типа, дающих число? Я понимаю, что если они не равны (1/0 (двоичный?)), Было бы неудобно пытаться выполнить арифметику по булевскому типу, но я не могу найти аргументацию этой логики.

Ответ 1

Это работает так, потому что это то, как оно указано для работы.

Стандарт EcmaScript указывает, что если ни один из аргументов не является строкой, предполагается, что оператор + означает числовое сложение, а не конкатенацию строк. В явном виде упоминается преобразование в числовые значения:

Верните результат применения операции добавления в ToNumber (lprim) и ToNumber (rprim).

(где lprim и rprim - примитивные формы левого и правого аргументов соответственно)

EcmaScript также четко определяет преобразование To Number для булевых:

Результат равен 1, если аргумент равен true. Результат равен +0, если аргумент ложный.

Следовательно, true + true эффективно означает 1 + 1 или 2.

Ответ 2

Javascript - это динамически типизированный язык, потому что вам не нужно указывать, какой тип есть, когда вы начинаете, например bool x или int i. Когда он видит операцию, которая не может быть действительно выполнена, она преобразует операнды во все, что им нужно, чтобы они могли выполнить эту операцию на них. Это известно как принуждение типа. Вы не можете добавить логические значения, поэтому Javascript будет переводить булевы на что-то, что он может добавить, что-то вроде строки или числа. В этом случае имеет смысл отнести его к числу, поскольку 1 часто используется для представления true и 0 для false. Поэтому Javascript будет отбрасывать true до 1 s и добавлять их вместе

Ответ 3

Javascript свободно набирается, и он автоматически преобразует вещи в другие вещи, чтобы соответствовать ситуации. Вот почему вы можете сделать var x без определения его как int или bool

http://msdn.microsoft.com/en-us/library/6974wx4d(v=vs.94).aspx