目录:数组
变量和数据类型是学习JavaScript
最早接触到的东西,可是每每看起来最简单的东西每每还隐藏着不少你不了解、或者容易犯错的知识 ,好比下面几个问题:浏览器
若是你还不能很好的解答上面的问题,那说明你尚未彻底掌握这部分的知识,那么请好好阅读下面的文章吧。bash
本文将从一个问题入手,经过介绍JavaScript
中的变量和类型相关知识以及 isNaN 的检测机制。但愿你看完这篇文章,能够知道这个问题的答案。废话少说,进入正题。函数
变量: 它不是指具体的值,只是一个用来存储具体值的「容器」 或者「代名词」 ,由于它存储的值能够改变,因此称为变量。学习
那如何理解变量呢?举个简单的例子:ui
var num = 10;
num = 15;
console.log(num + 5);
// 在控制台打印出 20,这就体现到了 num 这个变量只是存储具体值而已,一开始 num 存储 10,以后赋值为 15,结果就是 20。简单来讲,变量就是常常变的,重点在 「变」 这个字上。
复制代码
下面只是简单说明建立变量的方式,暂时不深刻讲解,以后会往深里学,往深里讲。spa
注:变量的命名尽可能见名知意,语义化更强一些。prototype
在JS中用来检测数据类型的方式「此处简单介绍,不深刻」:指针
本部分重点关注 typeof 检测数据类型的细节点,暂时不去关注其余检测数据的方法,将从语法、返回值、发现点来说解 typeof 的使用与细节点。code
语法:typeof [value]
=> 检测value的数据类型
返回值:使用typeof检测出来的结果是一个字符串,字符串中包含着对应的数据类型,例如:"number"/"string"/"boolean"/"undefined"/"object"/"function"
发现点:
说到 isNaN 的做用,就不得不先说一下 NaN,首先从字面上理解为 not a number,可是「它是数字类型的」,NaN 和谁都不相等,包括本身。那么问题来了,如何检测某个变量是否是有效数字呢?终于进入正题了,那就是 isNaN的做用。
isNaN:检测当前值是否是有效数字,返回true,表明非有效数字,返回false,表明有效数字
重点是:调用 Number 这个方法,把非数字类型的值转换为数字,下面举例子,以便读者更好的理解 Number 这个方法。
其它基本类型转换为数字:直接使用Number
这个方法转换的
【字符串转数字】
Number('13') // => 13
Number('13px') // => NaN 若是当前字符串中出现任意一个非有效数字字符,结果则为NaN
Number('13.5') // => 13.5 能够识别小数
Number('13.5.0') // => NaN
复制代码
【布尔转数字】
Number(true) // => 1
Number(false) // => 0
复制代码
【其它转数字】
Number(null) // => 0
Number(undefined) // => NaN
复制代码
引用数据类型转换为数字:先把引用值调取 toString
转换为字符串,而后再把字符串调取 Number
转换为数字
【对象转数字】
({}).toString() // => '[object Object]' => NaN
复制代码
【数组转数字】
[12,23].toString() // => '12,23' => NaN
[12].toString() // => '12' => 12
[].toString() // => '' => 0
复制代码
【正则转数字】
/^$/.toString() // => "/^$/" => NaN
复制代码
若是你能快速地看出下面代码执行结果,而且彻底正确,就说明你已经彻底理解 isNaN 的检测机制。
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,13]); // => true
isNaN([12]); // => false
isNaN(/^$/); // => true
isNaN(function(){}); // => true
复制代码
下面是 num 这个变量是已经声明的,可是 num 变量存储的值不能肯定。
方案一:
if(Number(num) == NaN){
alert('num不是有效数字!')
}
复制代码
方案二:
if(isNaN(num)){
alert('num不是有效数字!')
}
复制代码
方案三:
if(typeof num === 'number' && isNaN(num)){
// => 检测是否为有效数字,只有这一种方案
alert('num不是有效数字!')
}
复制代码
看完整篇文章+我列出来的三个方案,我相信你心中已经有了明确的答案,我下面逐个方案进行分析:
方案一:假设 Number(num) 的结果是 NaN,可是代码执行的结果是不会出现弹窗,由于 NaN和谁都不相等,条件永远不成立(即便 num 确实不是有效数字,转换的结果确实是 NaN ,可是NaN!= NaN的)
方案二:这个方案看起来已是正确答案,可是忽略了 其余数据类型的值能够转为数字类型,例如,假设 num 的值为 '13',首先会调用 Number 将 '13' 变成 13,而后再使用 isNaN(13) 得出结果为 false,可是 '13' 并非一个有效的数字。
方案三:我我的认为这个方案是可以解决文章标题提出的问题,首先先判断 变量是否为 数字类型,而后再使用 isNaN 判断变量是否是有效数字?&& 运算符,须要两边同时成立的时候,结果才为 true,因此当 typeof num === 'number' 这个结果为 false 的话,就说整个判断条件的结果都为 false。