У меня есть раскрывающийся список, который позволяет пользователю выбирать значение. Когда выбранный элемент изменяется, он вызывает функцию в моем компоненте (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>
Метод 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'));
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
.
When the value of id is "Please select an option", isNaN returns false. Why?
ну, это немного круговая логика, но ... этоfalse
потому что строка"Please select an option"
не является значениемNaN
. Это в значительной степени описывает себя там.