Javascript数据类型注意问题

我们知道Java里面有很严格的数据类型,包括基本数据类型和引用数据类型。而javascript作为一个弱类型的语言,不像java那样有很强制的数据类型要求,但是有时候一不注意就会采坑。

当然,可以看看mdn,它已经说得非常详细了。

简单的说下,最新的数据类型包括

  • 原始类型【primitive value】

    • Boolean
    • String
    • Number
    • Null
    • Undefined
    • Symbol (ES6)
  • 引用类型

    • Object

ok,我们可以讨论下跟数据类型有关的几个方法,typeof、instanceof等等。

###1、第一个问题

var a = 1;
console.log(typeof a);
console.log(a instanceof Number);

我们发现得到的结果是

var a = 1;
console.log(typeof a); // number
console.log(a instanceof Number); //false

typeof a得到number,这个能解释得通;不过a instanceof Number为什么是false呢?
其实我们可以看看『这篇doc』,另,有篇文章很详细的解释了这个问题,『click me』。纠其原因,其实是因为a是原始类型,没有contructor,更没有prototype。

###2、第一个问题

var b = new Number(1);
console.log(typeof b);
console.log(b instanceof Number);

我们发现得到的结果是

var b = new Number(1); 
console.log(typeof b); // object
console.log(b instanceof Number); //true

根据我们上面的解释,这下b instanceof Number得到true就很好解释了。但是为什么typeof b得到的是object而不是number呢? Ok,我们可以移步『这篇doc』。这里已经解释的很清楚了,b不属于原始类型,因此它属于『任何其他对象』,因此typeof b就是object了。

这样就引申出一个问题,我们究竟该如何拿到一个对象的真实类型呢?

直接给答案:

function getType(o){
    return Object.prototype.toString.call(o).slice(8,-1);
}