typeof和instanceof

 

1
2
3
4
5
6
7
8
9
function A() {}
var a = new A();
console.log(a instanceof Object); // true
 
var str = new String('hello');
console.log(str instanceof Object); // true
 
var num = new Number(1);
console.log(num instanceof Object); // true

依然席卷构造器本人

instanceof 运算符 在采用 typeof
运算符时选择引用类型存款和储蓄值会并发一个题材,无论引用的是何等类型的指标,它都回去
“object”。ECMAScript 引进了另多少个 Java 运算符 instanceof
来缓解这几个题材。

上述肆点总括为一句话:倘若某实例是透过某类或其子类的创造的,那么instanceof就再次回到true。也许说某构造函数的原型
存在与指标obj的个中原型链上,那么再次回到true。即instanceof的结果与构造器自己并无一向关联。那在无数语言中都以通用的。

instanceof 运算符与 typeof 运算符相似,用于识别正在处理的靶子的档次。与
typeof 方法不一致的是,instanceof
方法须要开发者显明地承认对象为某一定类型。例如:

 

对此字符串类型, typeof 重临的值是
string。比如typeof(“1二三”)重临的值是string。 
三、对于布尔类型, typeof 重临的值是 boolean
。比如typeof(true)重回的值是boolean。
4、对于指标、数组、null 重回的值是 object
。比如typeof(window),typeof(document),typeof(null)重回的值都以object。
5、对于函数类型,重返的值是
function。比如:typeof(eval),typeof(Date)再次回到的值都以function。
六、如若运算数是不曾定义的(比如说不设有的变量、函数大概undefined),将再次来到undefined。比如:typeof(sss)、typeof(undefined)都重临undefined。( 注意:未初叶化和未注脚 typoef会重临undefined)

typeof

二、要是存在继续关系,那么 子类实例 instanceof 父类 也会再次回到true

1、对象obj是通过new Constructor创建的,那么 obj instanceof
Constructor 
为true

它再次回到值是3个字符串,该字符串表达运算数的品类。typeof
1般只可以回去如下多少个结果:

1
2
3
4
5
6
function A(){}
function B(){}
B.prototype = new A(); // B继承于A
 
var b = new B();
console.log(b instanceof A); // true

 

// 定义两个构造器
function A(){}
function B(){}
A.prototype = B.prototype = {a: 1};
 
// 分别创建两个不同构造器的实例
var a = new A();
var b = new B();
console.log(a instanceof B); // true
console.log(b instanceof A); // true

 

typeof
是叁个1元运算,放在一个运算数此前,运算数能够是即兴档次。

JavaScript 中 typeof 和 instanceof
常用来判断2个变量是不是为空,或许是何等类型的。但它们之间只怕有分别的:

 

 

我们看到a, b分别是用A和B创设的,但a instanceof B和 b instanceof
A
都以true。即a即使不是用构造器B创制的,但照样重返true。因为B.prototype存在于a的里边原型链上。

1
2
3
4
function A() {}
console.log(A instanceof Object); // true
console.log(String instanceof Object); // true
console.log(Number instanceof Object); // true

 

若果大家期待收获2个目的是或不是是数组,或判断有个别变量是或不是是有个别对象的实例则要选用选用instanceof。

number,boolean,string,function,object,undefined。大家得以选用typeof 来赢得四个变量是还是不是存在,如 if(typeof
a!=”undefined”){alert(“ok”)},而并非去行使 if(a) 因为若是 a
不设有(未表明)则会出错,对于 Array,Null 等尤其指标使用 typeof 1律重返object,这正是 typeof 的局限性。

是因为JS的动态语言特征,能够在运营时修改原型,由此下边重返false也相差为奇了。因为A.prototype已经不在a的里边原型链中,链条被打断了。

4、不无结构器 instanceof Function 返回true

1
2
3
4
function A(){}
var a = new A();
A.prototype = {}; // 动态修改原型,注意必须在创建a后
console.log(a instanceof A); // false
1
2
3
4
5
6
function Person(n, a) {
    this.name = n;
    this.age = a;
}
var p = new Person('John Backus', 82);
console.log(p instanceof Person); // true

叁、由于Object是根类,全部别的自定义类都一而再于它,因而 任意构造器的实例
instanceof Object
 都返回true

1
2
3
4
function A() {}
console.log(A instanceof Function); // true
console.log(String instanceof Function); // true
console.log(Number instanceof Function); // true

var oStringObject = new String(“hello world”);
alert(oStringObject instanceof String); //输出 “true”
那段代码问的是“变量 oStringObject 是不是为 String
对象的实例?”oStringObject 的确是 String 对象的实例,因而结果是
“true”。即使不像 typeof 方法这样灵活,不过在 typeof 方法重回 “object”
的状态下,instanceof 方法还是很有用的。