Почему JavaScript оценивает значение плюс с строкой и целыми значениями по-разному в зависимости от места строки?
Пример:
console.log("1" + 2 + 3);
console.log(2 + 5 + "8");
Первая строка печатает 123, а вторая - 78.
Почему JavaScript оценивает значение плюс с строкой и целыми значениями по-разному в зависимости от места строки?
Пример:
console.log("1" + 2 + 3);
console.log(2 + 5 + "8");
Первая строка печатает 123, а вторая - 78.
Выражение оценивается слева направо и поэтому:
"1" + 2 + 3 -> "12" + 3 -> "123"
2 + 5 + "8" -> 7 + "8" -> "78"
Преобразование типа JavaScript в тех случаях, когда вы указываете, что вы хотите преобразовать типы всех ваших аргументов в соответствие типу вашего первого аргумента оператору +
.
Вот почему в первом случае вы упоминаете, что начинается с строки "1"
, добавление преобразует другие аргументы в строки.
Во втором случае вы упомянули console.log(2 + 5 + "8")
. Первый аргумент для оператора +
- целое число, поэтому преобразование типа JavaScript предполагает, что вы хотите целое число.
Хорошо, потому что оператор +
перегружен.
Вот почему, когда вы делаете
console.log("1" + 2 + 3);
Он объединяет первый и второй операнды (так как первый является строкой), чтобы дать строку "12", и она снова объединяет ее с третьим операндом по той же причине.
Однако, когда вы делаете
console.log(2 + 5 + "8");
Он суммирует первый и второй операнды (оба являются числовыми), чтобы дать 7
и, наконец, объединяет его с третьим операндом по причинам, упомянутым выше.
Выражение выполняется слева направо.
Итак, если вы используете "1" + 2 + 3
, а типы операндов разные, он будет добавляться, иначе, если типы будут ints, он будет добавлять.
case "1" + 2 + 3
"1" +2 - different types- result - "12" string
"12" + 3 - different types- result - "123" string
case 2 + 5 + "8"
2 + 5 - same types- result - 7 int
7 + "8" - different types - result "78" string
Я думаю, что это называется утка. Если это выглядит как утка, а кряки, как утка, должно быть утка. Если он выглядит как строка "1" , то это, вероятно, строка.
JavaScript также, кажется, оценивает как слева направо, так и от конкретного (int) до общего (string).
В первом примере console.log( "1" + 2 + 3), он оценивает "1" как строку из-за кавычек и предполагает, что вы хотите объединить все, что следует за ней. В результате он пишет "123".
Во втором примере console.log(2 + 5 + "8" ), он принимает int и добавляет к другому int, создавая 7, затем встречает строку, поэтому предполагает, что вы хотите выполнить конкатенацию, чтобы она записывала "78" в виде строки. Если вы хотите оценить строго значения int, вы можете использовать parseInt ( "8" ), чтобы преобразовать ваш 8 обратно в int.