Javascript типирования (Int / String) вопрос - PullRequest
2 голосов
/ 29 августа 2011

Я столкнулся с чем-то странным (вероятно, нет, скорее всего, я его не понимаю) в JavaScript, и мне было бы любопытно узнать, почему вещи ведут себя так, как они.

Когда ясделайте:

var index = '1';
index++;
alert(index);
index = index + 1;
alert(index);
index = true ? index + 1 : 0;
alert(index);

, как в http://jsfiddle.net/5mdmJ/, оповещения перейдут на «2», «3», «4»

Когда я переверну заказ и сделаю это (http://jsfiddle.net/5mdmJ/1/):

var index = '1';
index = true ? index + 1 : 0;
alert(index);
index = index + 1;
alert(index);
index++;
alert(index);

У меня будет "11", "111" и "112".

Я знаю, что это что-то с индексом, являющимся строкой, но я действительно не понимаюпочему он вводится целым образом в примере 1 и строковым вводом в примере 2. Я знаю, что это, вероятно, будет очень просто, но я не мог найти ничего, что действительно прояснит мне логику того, что происходит.Меняется ли тип? Почему и когда это происходит?

Спасибо за любую подсказку, статью или что-то еще!

Ответы [ 7 ]

3 голосов
/ 29 августа 2011

, но я не совсем понимаю, почему он вводится через int в примере 1

В отличие от +, который имеет два значения (сложение для числа, объединение дляstrings), ++ не имеет двусмысленности - это всегда означает «приращение»

Так что, когда вы запускаете ++ для строки, она конвертирует ее в число.Поскольку в примере № 2 этого не происходит, все операции + являются конкатенацией.

var x = '1';
x++;
alert(typeof x); // "number"
3 голосов
/ 29 августа 2011

Оператор с одним плюсом перегружен для строк и целых чисел. В первом примере оператор ++ определен только для int с, поэтому индекс преобразуется в число, а затем увеличивается.После этого оператор плюс указывает добавление.Поскольку индекс - это строка во втором примере, оператор плюс указывает на конкатенацию.

1 голос
/ 29 августа 2011

Это из-за приоритета типа при объединении строк или переменных.

"1" + 2 + 3; // -> "123" 
4 + 3 + "2"; // -> "72" ; 4 + 3 = 7 ; 7 + "2" = "72"
1 голос
/ 29 августа 2011

Ответ заключается в том, что, поскольку js введен свободно, он начинается с первой выполняемой вами операции.

В вашем примере 1 первая операция является исключительной арифметической операцией, и js правильно интерпретирует ее и считает INT полностью

В вашем примере 2 первая операция является операцией сравнения, и js интерпретирует ее как логическое значение, а затем немедленно закрывает строку свойства.

Вот почему вы ведете себя по-разному.

1 голос
/ 29 августа 2011

Причина в том, что переменная ++ будет сначала преобразовывать переменную в число, а затем увеличивать ее на единицу.В то время как переменная + 1 только добавит 1 к переменной, но не преобразует ее.

1 голос
/ 29 августа 2011

Это: index++; является числовой функцией.Обратите внимание, что я не сказал целое число.В JavaScript нет такого понятия, как целое число.Все числа являются числами с плавающей запятой.

Это: index = true ? index + 1 : 0; - это конкатенация строк, потому что index - это строка.Если index - это число, то они сложили бы их вместе.

Итак, оператор ++ преобразовывает строку в число и добавляет значения.Во втором - преобразование числа в строку и добавление двух строк вместе для формирования новой строки (помните, что в JavaScript строки неизменяемы).

0 голосов
/ 29 августа 2011

Моя догадка в том, что когда вы делаете index++, он считается "int" и остается таким же в первом примере, но когда вы делаете index + 1, он считается строкой и остается таким же в примере 2..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...