在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方法。