前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JS中的NaN和isNaN,简直是双重人格?

JS中的NaN和isNaN,简直是双重人格?

作者头像
TimothyJia
发布2019-11-12 12:41:15
1.4K0
发布2019-11-12 12:41:15
举报

number数字类型

  包括数字和NaN,NaN:not a number 但是它是数字类型的

isNaN的用法:检测当前值是否不是有效数字,返回true代表不是有效数字,返回false是有效数字

代码语言:javascript
复制
//=>语法:isNaN([value])
var num=12;
isNaN(num); //->检测num变量存储的值是否为非有效数字 false

isNaN('13') =>false
isNaN('你好呀') =>true
isNaN(true) =>false
isNaN(false) =>false
isNaN(null) =>false
isNaN(undefined) =>true
isNaN({age:9}) =>true
isNaN([12,23]) =>true
isNaN([12]) =>false
isNaN(/^$/) =>true
isNaN(function(){}) =>true

1、isNaN检测的机制:首先验证当前要检测的值是否为数字类型的,如果不是,浏览器会默认的把值转换为数字类型

  把非数字类型的值转换为数字

  其它基本类型转换为数字:直接使用Number这个方法转换的

[字符串转数字]

代码语言:javascript
复制
Number('13') ->13
Number('13px') ->NaN 如果当前字符串中出现任意一个非有效数字字符,结果则为NaN
Number('13.5') ->13.5 可以识别小数

[布尔转数字]

代码语言:javascript
复制
Number(true) ->1
Number(false) ->0

[其它]

代码语言:javascript
复制
Number(null) ->0
Number(undefined) ->NaN

把引用数据类型值转换为数字:先把引用值调取toString转换为字符串,然后再把字符串调取Number转换为数字

[对象]

代码语言:javascript
复制
({}).toString() ->'[object Object]' ->NaN

[数组]

代码语言:javascript
复制
[12,23].toString() ->'12,23' ->NaN
[12].toString() ->'12' ->12

[正则]

代码语言:javascript
复制
/^$/.toString() ->'/^$/' ->NaN

[其他]

代码语言:javascript
复制
Number('') ->0
[].toString() -> ''
=> isNaN([]):false

2、当前检测的值已经是数字类型,是有效数字返回false,不是返回true(数字类型中只有NaN不是有效数字,其余都是有效数字)

parseInt / parseFloat,等同于Number,也是为了把其它类型的值转换为数字类型

  和Number的区别在于字符串转换分析上

  Number:出现任意非有效数字字符,结果就是NaN

  parseInt:把一个字符串中的整数部分解析出来,parseFloat是把一个字符串中小数(浮点数)部分解析出来  

代码语言:javascript
复制
parseInt('13.5px') =>13
parseFloat('13.5px') =>13.5
parseInt('width:13.5px') =>NaN 从字符串最左边字符开始查找有效数字字符,并且转换为数字,但是一但遇到一个非有效数字字符,查找结束

3. NaN的比较

  NaN==NaN:false NaN和谁都不相等,包括自己

代码语言:javascript
复制
if(Number(num)==NaN){
  alert('num不是有效数字!');
 }
NaN和谁都不相等,条件永远不成立(即使num确实不是有效数字,转换的结果确实是NaN,但是NaN!=NaN的)

if(isNaN(num)){
  //=>检测是否为有效数字,只有这一种方案
  alert('num不是有效数字!')
}

【布尔 boolean】

只有两个值:true / false,把其它数据类型的值转换为布尔类型:除了“NaN/0/''/null/undefined”这五个值会转换为false,其余的都会转换为true

  哪些情况需要把其它类型值转换为布尔呢?

代码语言:javascript
复制
// [手动自己转]
Boolean(0) => false
Boolean([]) => true
[]==false => true   // 都转换为数字 0==0
![]==false => true  // 先算![],把数组转换为布尔取反=>false =>false==false

  除了Boolean可把其他类型转化为数字类型外,!和双!!也是把其他类型转化成布尔类型,项目中一般用!!转换(逼格高~)

  !0 =>true 叹号在这里是取反的意思(先转化为布尔类型然后再取反)

  !!0 =>false 两个叹号只剩下转换为布尔类型了,等价于Boolean

代码语言:javascript
复制
// [程序自己需要转换 =>一般都是条件判断的时候],if内的值会默认转换成布尔类型,如果为真执行,为false则不执行
if(1){
   //=>如果条件成立,执行大括号中的代码
   //=>浏览器会把1作为条件:把它转换为布尔的TRUE,条件成立
}

特殊情况:数学运算和字符串拼接 “+”

当表达式中出现字符串,就是字符串拼接,否则就是数学运算

代码语言:javascript
复制
1+true =>2  //数学运算
'1'+true =>'1true'   //字符串拼接
[12]+10 =>'1210'     //虽然现在没看见字符串,但是引用类型转换为数字,首先会转换为字符串,所以变为了字符串拼接
({})+10 =>"[object Object]10"
[]+10 =>"10"

  {}+10 =>10 结果为10,但是这个和以上说的没有半毛钱关系,因为它根本就不是数学运算,也不是字符串拼接,它是两部分代码

  {} 代表一个代码块(块级作用域) +10 才是我们的操作 严格写法:{}; +10;

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-06-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档