JavaScript类型

540 阅读2分钟

在Javascript这种弱类型语言中,确定变量的类型始终不是一件那么方便的事情。确定变量的类型,在使用的过程中也会更加安全,避免抛出异常。

new运算符

new运算符通常作用于构造函数,构造函数只是我们自己用于区分函数功能的叫法。其本质上就是一个函数,所以在语法上,构造函数能像普通函数一样调用,但是这样不太符合构造函数本身的目的了,所以我们才称其为构造函数。

构造函数目的上是为了创建一个对象,并在对象上设置一系列的属性。如果非要与构造函数进行区分的话,普通函数更像是在已有的对象上进行一些逻辑的处理。

为了避免错误调用构造函数,我们可以像下面代码示例一样,加入检测机制,避免潜在的隐患。

构造函数

function Constructor(){
    if(!(this instanceof Contructor)){
        throw "should called by new"
    }
    this.value = 1;
}

instanceof运算符

instanceof运算符检测对象是够是某个构造函数的实例,即检测

ele.__proto__ === Constructor.prototype

// demo
var a = {};
function C(){}
a.__proto__ = C.prototype;
a instanceof C // true

扩展,JS类型检测

一般有两种方法用来对已经存在的对象进行类型检测

  • typeof
  • Object.prototype.toString.call

以下demo展示了二者对于Javascript中涉及的相关变量类型进行检测的结果,以及二者的区别

// "0", 0, null, undefined, {}, function(){}, [], false
var types = ["0", 0, null, undefined, {}, function(){}, [], false];
for(var i=0; i<types.length; i++){
	console.log(typeof types[i]);
    console.log(Object.prototype.toString.call(types[i]));
}

string 		[object String]
number 		[object Number]
object 		[object Null]
undefined 	[object Undefined]
object  	[object Object]
function 	[object Function]
object   	[object Array]
boolean  	[object Boolean]

区别统计:

类型 typeof Object.prototype.toString.call
null object [object Null]
{} object [object Object]
[] object [object Array]

从表格中可以看出,typeof本身无法区分null,{},[]这三种类型,如果需要具体区分这三种类型需要使用Object.prototype.toString.call方法。