Вопрос о вводе Javascript (Int/String)

Я столкнулся с чем-то странным (вероятно, нет, скорее всего, я этого не понимаю) в 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".

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

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


person m90    schedule 29.08.2011    source источник


Ответы (7)


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

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

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

Вот почему у вас разное поведение.

person swordfish    schedule 29.08.2011

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

person Dennis    schedule 29.08.2011

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

В отличие от +, имеющего два значения (сложение для числа, конкатенация для строк), ++ не имеет двусмысленности — оно всегда означает «приращение».

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

var x = '1';
x++;
alert(typeof x); // "number"
person Matt    schedule 29.08.2011

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

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

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

person kemiller2002    schedule 29.08.2011

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

person Samuli Hakoniemi    schedule 29.08.2011

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

"1" + 2 + 3; // -> "123" 
4 + 3 + "2"; // -> "72" ; 4 + 3 = 7 ; 7 + "2" = "72"
person Alex    schedule 29.08.2011

Я ПРЕДПОЛАГАЮ, что когда вы делаете index++, это считается "int" и остается таким в первом примере, но когда вы делаете index + 1, оно считается строкой и остается таким в примере 2..

person Thor Jacobsen    schedule 29.08.2011