Angular - 为什么Number.isNaN对于非空字符串返回false?

时间:2018-05-03 01:15:30

标签: javascript angular

我有一个下拉列表,允许用户选择一个值。当所选项目发生更改时,它会调用我的组件中的一个函数(onDropdownChange)。传递给onDropdownChange的值可以是字符串(“请选择一个选项”)或所选值的索引号。

这是我的TypeScript文件中的onDropdownChange:

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

当id的值为“请选择一个选项”时,isNaN会返回false。为什么呢?

当我使用'+'一元运算符在下面的代码中返回字符串的数字表示时,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>

2 个答案:

答案 0 :(得分:2)

Number.isNaN()

  

Number.isNaN()方法确定传递的值是否为NaN,其类型是否为Number。它是原始的全局isNaN()的一个更强大的版本。

如果id是字符串,那么它不是数字,因此Number.isNaN()返回false:

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

唯一一次使用Number.isNaN()的时候,您基本上要查看someVariable === NaN是否NaN !== NaN,因为isNaN而不能自行运作。

对于您的情况,只需使用普通console.log(isNaN('Please select an option')); console.log(isNaN('foo'));

&#13;
&#13;
axis.POSIXct(1, at=seq(as.Date("2010-01-01"), as.Date("2018-01-01"),length.out=10), 
             format="%Y-%m-%d", 
             las=2, 
             adj=1, 
             xpd=TRUE, 
             cex.axis = 1)
&#13;
&#13;
&#13;

答案 1 :(得分:2)

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

只有x的{​​{1}}值只有Number.isNaN(x)评估为真:NaN

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

这与全局isNaN函数形成对比,后者在将true强制转换为数字之后返回NaN的任何内容:

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

这两个函数都不是为了测试它们的参数是不是number。它们都用于测试他们的参数 数字NaN