javascript数组直接相减的返回值

阅读数:2978 发布时间:2016-06-24 11:38:58

作者:mj001 标签: js 数组 数据类型 马骏001 预解析 预解释 hoisting

先来看一段代码

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类型的值。

当数组中的成员变成两个甚至更多时,执行数组直接相减依然会尝试转换数据类型,为了看清楚我们拆分一下他的转换过程:

  1. 首先在对象(我们这里的数组也是对象)上调用valueOf()方法,看看返回值是不是一个原始值,如果不是,就继续调用对象的toString()方法转换成string类型的值,然后再作比较
  2. a数组变成了"2,1",b数组变成了"4,3"
  3. 两个字符串相减,返回一个NaN

这下,终于弄明白了为什么会出现上面的结果了,原来是数据类型的转换。

补充:

关于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)”.

相关文章推荐: