Как сказал @Jaromanda ранее в комментариях, javascript - это нетипизированный язык или иногда может ссылаться на слабо типизированный (что не подходит, потому что JS сам вообще не имеет компилятора), что означает, что переменная JavaScript может содержать значение любого типа данных .
В чем проблема?
Обычно , когда вы определяете что-то вроде этого: let count;
, count
остается неинициализированным, пока вы не назначите ему что-то напрямую. Итак, в этом случае неназначенным типом элемента value является undefined
который имеет значение undefined
, то всякий раз, когда вы пытаетесь сделать console.log
такую вещь, она будет undefined, давайте посмотрим на этот пример.
let count;
console.log('count type is:', typeof count)
console.log('count value is:', count)
Вы можете увидеть, что тип и значение count
равны undefined
.
ПРИМЕЧАНИЕ: Вы можете прочитать this для получения дополнительной информации.
Давайте посмотрим на ваш конкретный пример
let count;
console.log('count type after declaration is:', typeof count);
console.log('count value after declaration is:', count);
let splitStory = ['a', 'b', 'c'];
let overusedWords = ['d', 'b', 'e'];
splitStory.forEach(function(element) {
if (overusedWords.includes(element)) {
count = count + 1;
}
})
console.log('count type at the end is:', typeof count);
console.log('count value at the end is:', count);
Итак, что здесь происходит?
Как ранее сказал @Patrick, undefined + 1
это NaN
, что это значит четный? NaN
(обозначает Not-A-Number) сам по себе является другим типом данных (который используется редко). Но почему результат undefined + 1
равен NaN
? Согласно MDN , всякий раз, когда ожидаемый результат должен быть числом, но из-за нескольких условий он терпит неудачу как Math.sqrt(-1)
, результат также будет NaN
. Итак, в этом случае ожидаемый результат count + 1
- это число , поскольку мы выполняем операцию arithmeti c и хотим увеличить count
значение на 1
, поэтому , поскольку само значение count
равно undefined
, операция увеличения невозможна (поскольку undefined
не настраивается), поэтому результат будет NaN
.
Давайте перейдем к вашему второму предложению.
let count = 'sample_string';
console.log('count type after declaration is:', typeof count);
console.log('count value after declaration is:', count);
let splitStory = ['a', 'b', 'c'];
let overusedWords = ['d', 'b', 'e'];
splitStory.forEach(function(element) {
if (overusedWords.includes(element)) {
count = count + 1;
}
})
console.log('count type at the end is:', typeof count);
console.log('count value at the end is:', count);
Что здесь происходит?
Результат: sample_string1
Но почему? Короткий ответ: они будут объединяться.
В JavaScript оператор +
используется как для сложения чисел c, так и для конкатенации строк. Когда вы «добавляете» число к строке, интерпретатор преобразует ваше число в строку и объединяет их вместе. Итак, поскольку тип count
равен string
, в этой операции count + 1
JS 1
также рассматривается как строка.
Что мы должны делать, чтобы предотвратить такие вещи?
Это просто, мы всегда должны помнить, когда мы определяем переменную, мы также должны укажите его тип, присвоив ему значение.