typeof和instanceof

JavaScript 中 typeof 和 instanceof
常用来判定一个变量是否为空,或者是啊种的。但它们之间要出分别的:

typeof

typeof
是一个均等首批运算,放在一个运算数之前,运算数可以是任意档次。

她回到回值是一个字符串,该字符串说明运算数的门类。typeof
一般只能回到如下几个结果:

number,boolean,string,function,object,undefined。我们得下
typeof 来赢得一个变量是否是,如 if(typeof
a!=”undefined”){alert(“ok”)},而毫不失去用 if(a) 因为要 a
不存(未声明)则会拧,对于 Array,Null 等突出对象下 typeof 一律返回
object,这多亏 typeof 的局限性。

对于字符串类型, typeof 返回的价值是
string。比如typeof(“123”)返回的价是string。 
老三、对于布尔色, typeof 返回的价是 boolean
。比如typeof(true)返回的值是boolean。
季、对于目标、数组、null 返回的值是 object
。比如typeof(window),typeof(document),typeof(null)返回的价都是object。
五、对于函数类型,返回的价是
function。比如:typeof(eval),typeof(Date)返回的值都是function。
六、如果运算数是没概念之(比如说不在的变量、函数或者undefined),将返回undefined。比如:typeof(sss)、typeof(undefined)都返回undefined。( 注意:未初始化和不声明
 typoef会返回undefined)

 

一旦我们盼望获得一个对象是否是数组,或判断有变量是否是有对象的实例则要挑选使用instanceof。

instanceof 运算符 当利用 typeof
运算符时采用引用类型存储值会出现一个题目,无论引用的是呀项目的靶子,它还回去
“object”。ECMAScript 引入了另一个 Java 运算符 instanceof
来缓解此问题。

instanceof 运算符与 typeof 运算符相似,用于识别正在处理的对象的品类。与
typeof 方法不同之是,instanceof
方法要求开发者明确地承认对象为某某一定项目。例如:

var oStringObject = new String(“hello world”);
alert(oStringObject instanceof String); //输出 “true”
顿时段代码问的凡“变量 oStringObject 是否也 String
对象的实例?”oStringObject 的确是 String 对象的实例,因此结果是
“true”。尽管不像 typeof 方法那样灵活,但是以 typeof 方法返回 “object”
的动静下,instanceof 方法还是坏有因此底。

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

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

 

2、如果是继续关系,那么 子类实例 instanceof 父类 也会回到true

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

 

3、由于Object是根类,所有其他由定义类都延续给它们,因此 任意构造器的实例
instanceof Object
 都返回true

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

竟包括构造器自身

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

 

4、负有结构器 instanceof Function 返回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

 

如上四点总结也平句话:若是某个实例是经某类或者该子类的创的,那么instanceof就返回true。或者说有构造函数的原型
存在与目标obj的里原型链上,那么回true。即instanceof的结果及构造器自身并随便直接涉及。这在群言语中都是通用的。

 

// 定义两个构造器
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

咱看到a, b分别是用A和B创建的,但a instanceof B和 b instanceof
A
都是true。即a虽然未是用构造器B创建的,但照样返回true。因为B.prototype存在于a的其中原型链上。

 

是因为JS的动态语言特色,可以以运行时修改原型,因此下返回false也相差吗惊异了。因为A.prototype已经不在a的中原型链中,链条被于断了。

1
2
3
4
function A(){}
var a = new A();
A.prototype = {}; // 动态修改原型,注意必须在创建a后
console.log(a instanceof A); // false