2015-04-24 8 views
3

Обычно, когда я получаю значение ввода формы с помощью jQuery, я обязан преобразовать его в число перед выполнением любых математических операций. Например, используя унарный оператор плюс для преобразования, а затем увеличить:Почему приращение с использованием ++ работает со строками в javascript?

var x = +$(this).val(); 
x += 1; 

Но по какой-то причине ++ работы со строками и выполняет преобразование автоматически:

var x = $(this).val(); 
x++; 

http://jsfiddle.net/m4nka9d3/

Почему? Это всегда безопасно?

+0

Один из самых интересных вопросов, которые я видел за несколько недель. И который, как и большинство действительно хороших вопросов, научил меня чему-то в процессе ответа. –

ответ

5

Это работает так, потому что первое, что делает любой из операторов инкремента, - это принуждение его операнда к числу, это в §11.3.1 of the spec. И, находясь в спецификации, да, это то, на что вы можете положиться.

Пропустив некоторые spectalk, алгоритм:

  • Пусть oldValue быть ToNumber(GetValue(lhs)).
  • Позвольте newValue быть результатом добавления значения 1 в размере oldValue, используя те же правила, что и для оператора + (см. 11.6.3).
  • Звоните PutValue(lhs, newValue).
  • oldValue.

В то время, += определяется quite differently, не принуждающее на номер в качестве раннего этапа, и, таким образом, в конечном итоге применяя конкатенации, а не дополнение.

+1

Спасибо. У меня всегда создавалось впечатление, что 'x ++' и 'x + = 1' были одинаковыми, но, по-видимому, это важное различие. – billynoah

+0

@billynoah: Это очень, очень хорошее наблюдение. В большинстве языков с синтаксисом типа B (C, Java и т. Д.), '++ x' является по существу' x + = 1' (а не 'x ++', окончательное значение выражения отличается) будет точным утверждением , Но не JavaScript, с его свободной печатью. :-) –