typeof
typeof运算符主要是返回运算数类型信息的字符串,可用于判断基本类型和引用类型
返回值有一下六种情况
运算数类型 | typeof(x)的返回值 |
---|---|
数字 | number |
字符串 | string |
布尔值 | boolean |
函数 | function |
对象,数组,正则和null | object |
未定义 | undefined |
用法示例:
typeof(123) = "number"
instanceof
instanceof的返回值只有两种情况,ture 或者 false
instanceof判断一个变量是不是某个对象的子类,会沿着原型链__proto__向上找,如果找到匹配的对象,就返回true,否则返回false。
到这里就要提到原型和原型链了。先了解部分概念:
-
构造函数:
所谓的构造函数其实就是一个普通的函数前面加了new运算符,其实质也是一个函数,所以构造函数都有函数的prototype属性。
构造函数的目的就是为了创建一个自定义类,并且创建这个类的实例( 实例就是通过构造函数创建出来的对象。),并且实例与实例之间相互独立,即实例识别。
构造函数和普通函数的区别:数名书写习惯不同 函数调用方式不同 函数 小驼峰命名 函数 大驼峰命名 //创建了一个自定义类,并且创建了这个类的实例 function Dog(name, age, gender){ this.name = name; this.age = age; this.gender = gender; this.sayName = function (){ console.log(this.name) } } var dog = new Dog("旺财",4,"雌") console.log(dog)
要记住两句话:dog是构造函数 Person 的实例,实例的构造函数属性(constructor)指向构造函数。
也就是说,通过这个构造函数去创建新的实例的时候,都会为这个实例创建一个sayName方法,消耗内存,而这个sayName方法是一模一样的,所以可以把这个方法单独放在一个地方供所有实例去访问,这就需要原型 -
原型
javascript中,每当定义一个函数的时候,都会天生自带一个__proto__属性,这个属性指向函数的原型对象
原型指的就是原型对象,至于是谁的原型对象,需要靠函数的prototype属性和实例的__proto__属性来区别。 -
原型链
指从一个实例对象开始往上找,这个实例对象的__proto__属性所指向的则是这个实例对象的原型对象,如果用obj表示这个实例,则原型对象表示为obj.proto。同时,这个原型对象顾名思义也是一个对象,而且它也有上一级的原型对象,相对于上一级原型对象而言,它也是一个实例对象,那么它也拥有__proto__属性,它的__proto__属性也指向它的原型对象,后面也以此类推,一直到Object.prototype这个原型为止,Object.prototype为原型链的末尾点。
js里完全依靠"原型链"(prototype chain)模式来实现继承
Object是作为众多new出来的实例的基类 function Object(){ [ native code ] }
Function是作为众多function出来的函数的基类 function Function(){ [ native code ] }
构造函数的proto(包括Function.prototype和Object.prototype)都指向Function.prototype
原型对象的proto都指向Object.prototype
Object.prototype.proto指向null参考:https://blog.csdn.net/yin_991/article/details/80954453