Интересно, что ни один из ответов на этой странице не упоминает два крайних случая, надеюсь, никто не возражает, если я их добавлю:
Родовые словари в .NET не являются потокобезопасными, а иногда могут бросать NullReference
или даже (чаще) a KeyNotFoundException
при попытке получить доступ к ключу из двух параллельных потоков. Исключение в этом случае является довольно ошибочным.
Если код NullReferenceException
задан кодом unsafe
, вы можете посмотреть на переменные указателя , и проверьте их на IntPtr.Zero
или что-то в этом роде. Это одно и то же («исключение нулевого указателя»), но в небезопасном коде переменные часто переводятся в типы значений / массивы и т. Д., И вы ударяете головой о стену, задаваясь вопросом, как тип значения может исключение.
(Еще одна причина для небезопасного использования небезопасного кода, если вам это нужно)
Одна или обе переменные являются строкой вместо числа. Это делает +
выполнение конкатенации строки.
'2' + 2 === '22'; // true
2 + 2 === 4; // true
Другие арифметические операторы / * -
будут выполнять преобразование toNumber
в строке (строках).
'3' * '5' === 15; // true
Быстрый способ преобразования строки в число - использовать унарный оператор +
.
+'2' + 2 === 4; // true
... или с вашими переменными:
+x + +y
В Javascript оператор + может выполнять сложение или конкатенацию в зависимости от типа своих операндов. Когда числа используются с +, он использует сложение, но когда строки используются с +, он объединяет (присоединяет строки) вместо
Оператор сложения работает следующим образом: 1) Если хотя бы один операнд является строкой, другой преобразуется в строку и выполняется конкатенация
1 + "2" // "12"
"2" + "3" // "23"
"2" + null // "2null", null is converted to "null"
2) В других случаях оба операнда преобразуются в числа:
1 + null // 2, null is converted to 0
1 + undefined // NaN, undefined is converted to NaN
Для получения дополнительной информации см. сообщение оператора сложения JavaScript для демистификации .
Унарный плюс должен работать:
var totalVal = (+2) + (+2);
alert(totalVal);
// result 4
+
имеет два применения. Одним из них является добавление, другое - конкатенация строк. Если одна или обе ваши переменные являются строкой, то +
объединяет их.
Вам нужно будет использовать parseInt
или parseFloat
, чтобы превратить строку в число.
Если числа, которые вы пытаетесь добавить, равны 10 и 12, если их итоговая сумма должна быть 22, то вы должны, вероятно, сделать это как
+10 + +12
. И результатом может быть строка типа 1012, если одно или оба числа являются строкой.