先来看一段代码
var a = [1];
var b = [1];
console.log( b - a );
if(isNaN(b - a)){
console.log('a');
}
先想一下这样能得出什么结论,反正我觉得两个数组直接相减,肯定应该返回一个NaN啊,所以if条件判断isNaN(b - a)肯定应该返回一个true,然后控制台打印出一个"a",皆大欢喜。
。
。
。
。
。
。
浏览器里面竟然显示结果:
啥也没有!也就是说isNaN(b - a)返回了一个false,也就是说 b - a 得到了一个数字,也就是0,两个数组直接相减了,好吧,这样也行,那我们试一下数组里面两个元素呢?于是乎
var a = [2,1];
var b = [4,3];
console.log( b - a );
if(isNaN(b - a)){
console.log('a');
}
这里浏览器直接返回了一个"a",跟之前预想的结果一样,两个数组直接相减返回一个NaN,所以条件判断成立就在控制台打印出了一个"a"。
这就让人很疑惑了,为什么数组里面就一个元素的时候可以直接相减,而两个或者多个就不行了呢??
查阅相关资料之后发现,问题不是出在数组身上,而是出在操作符"-"身上。
原来,减号会把两边的数字自动尝试转换成数字再进行运算,所以当数组a和数组b只有一个元素时,执行相减之前,[1] - [1] 就已经被转换成 1 - 1 了,如此得到的结果自然是一个number类型的值。
当数组中的成员变成两个甚至更多时,执行数组直接相减依然会尝试转换数据类型,为了看清楚我们拆分一下他的转换过程:
这下,终于弄明白了为什么会出现上面的结果了,原来是数据类型的转换。
关于js的数据类型,我们可以整理一下。
在JavaScript中,一共有六种数据类型: Object, Number, String, Boolean, Null, 以及 Undefined.
对象(Objects)类型包含了数组(arrays), 函数(functions),以及其他的一般对象.
数字(Numbers)类型可以是整型(integers)或者浮点数(floating point)类型以及特殊值NaN和Infinity.
字符串(Strings)类型包含了空字符串, “”.
布尔值(Booleans)类型只有两个值:true和false.
最后两个基本数据类型有点特殊: Null 类型只有一个值:null, Undefined 类型只有一个值:undefined.
所有Object除外的类型都称之为“原始值(primitive)”.
相关文章推荐: