Angular - Почему Number.isNaN возвращает false для непустой строки?

1

У меня есть раскрывающийся список, который позволяет пользователю выбирать значение. Когда выбранный элемент изменяется, он вызывает функцию в моем компоненте (onDropdownChange). Значение, переданное onDropdownChange может быть строкой ("Выберите вариант") или номером индекса выбранного значения.

Здесь onDropdownChange в моем файле TypeScript:

onDropdownChange(id: any) {
  if(Number.isNaN(id)){
    this.selectedIndex = null;
    this.isItemSelected = false;
  }
  else{
    this.selectedIndex  = id;
    this.isItemSelected = true;
  }
}

Когда значением id является "Please select a option", isNaN возвращает false. Зачем?

Когда я использую "+" унарный оператор, чтобы вернуть isNan представление строки в приведенном ниже коде, isNan правильно возвращает true. Зачем?

onDropdownChange(id: any) {
  // convert id to a number representation using '+'
  if(Number.isNaN(+id)){
    this.selectedIndex = null;
    this.isItemSelected = false;
  }
  else{
    this.selectedIndex  = id;
    this.isItemSelected = true;
  }
}

Вот соответствующий код в моем html-шаблоне:

            <select class="form-control" (change)="onItemChange($event.target.value)">
              <option> Please select </option>
              <option *ngFor="let item of items; let i=index" [value]="i" [selected]="i === selectedIndex"> Item {{i+1}}</option>
            </select>
  • 1
    Лучший способ ответить на ваши вопросы о таких вещах - это всегда сначала обращаться к документации. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
  • 0
    When the value of id is "Please select an option", isNaN returns false. Why? ну, это немного круговая логика, но ... это false потому что строка "Please select an option" не является значением NaN . Это в значительной степени описывает себя там.
Теги:
angular

2 ответа

2
Лучший ответ

Number.isNaN()

Метод Number.isNaN() определяет, является ли переданное значение NaN, а его тип - Number. Это более надежная версия исходного, глобального isNaN().

Если id является строкой, то это не число, поэтому Number.isNaN() возвращает false:

console.log(Number.isNaN('Please select an option'));
console.log(Number.isNaN('foo'));

Единственный раз, когда нужно использовать Number.isNaN() - это когда вы захотите, по существу, проверить, есть ли someVariable === NaN, который не работает сам по себе, потому что NaN !== NaN.

Для вашего случая просто используйте isNaN:

console.log(isNaN('Please select an option'));
console.log(isNaN('foo'));
2

isNaN(id) === Number.isNaN(+id)

Существует только одно значение x для которого Number.isNaN(x) имеет значение true: NaN:

console.log( Number.isNaN( NaN ) );
console.log( Number.isNaN( 'foo' ) );
console.log( Number.isNaN( {} ) );
console.log( isNaN( '5' ) );
console.log( Number.isNaN( 0 ) );

Это контрастирует с глобальной функцией isNaN, которая возвращает true для всего, что является NaN после принуждения его к числу:

console.log( isNaN( NaN ) );
console.log( isNaN( 'foo' ) );
console.log( isNaN( {} ) );
console.log( isNaN( '5' ) );
console.log( Number.isNaN( 0 ) );

Ни одна из этих функций не предназначена для проверки, если их аргумент не является number. Они оба предназначены для тестирования, если их аргументом является число NaN.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню