Какой тип данных по умолчанию используется для переменных в Javascript? - PullRequest
0 голосов
/ 05 мая 2020

Я работаю над небольшой проблемой, чтобы изучить Javascrcipt в прикладном смысле, а не просто изучать его «теорию».

Часть кода, который я пишу, выглядит следующим образом:

let count;
splitStory.forEach(function(element) {
  if (overusedWords.includes(element)) {
     count = count + 1;
  }
})
console.log(count);

Когда я запускаю функцию, она выводит NaN в консоль. Однако, когда я меняю let count; на let count = 0, он регистрирует правильный номер, который должен быть записан в консоль. Как я узнал, использование объявления let для переменной допустимо, но в этом случае, похоже, есть проблема. Если бы я заменил count = count + 1; на count = 'sample_string', он работал бы и выводил 'sample_string' на консоль. Это приводит к моему вопросу, является ли тип данных по умолчанию для переменной строкой, если иное не указано в объявлении?

Ответы [ 3 ]

0 голосов
/ 05 мая 2020

Значение по умолчанию для переменной, объявленной с помощью var или let, равно undefined , ЕСЛИ вы не инициализируете его значением, и в этом случае он получает тип значения. Если вы не инициализируете его, он не получит тип, пока ему не будет присвоено определенное значение.

См. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let

и https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var

0 голосов
/ 05 мая 2020

Как сказал @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 также рассматривается как строка.


Что мы должны делать, чтобы предотвратить такие вещи?

Это просто, мы всегда должны помнить, когда мы определяем переменную, мы также должны укажите его тип, присвоив ему значение.

0 голосов
/ 05 мая 2020

JavaScript поддерживает ввод переменных . Он изменяет тип данных переменной в соответствии с ее значением во время выполнения.

Например, если вы инициализировали переменную некоторым строковым значением, например -

let count = 'someString';   //data type would be string

И позже, если вы снова назначите какое-то числовое значение, например -

count = 23        // data type of count becomes number

Однако, если вы не присваиваете никакого значения и просто объявляете переменную, ее тип данных будет "undefined".

Так что в вашем случае, когда вы пишете: let count;
Это равно:

let count = undefined;

Надеюсь, это проясняет ваши сомнения.

...