typeof
typeof是一个一元运算符,放在其单个操作数据的前边,操作数据可以是任何类型。返回值是一个类型字符串。typeof运算符也可以加圆括号typeof(x)
这样的它更像是一个函数调用。
任意值在tyoeof运算后的返回值
x | tepeof x |
---|---|
undefined | “undefined” |
null | “object” |
ture/false | “boolean” |
任意数字或NaN | “number” |
任意字符串 | “string” |
任意函数 | “function” |
任意非函数的内置对象eg:Object,Array… | “obejct” |
typeof
运算符可以用来区分原始类型和对象,但是不能用于区分对象的类,是因为所有的对象和数组的typeof
运算结果是object
。如果想要区分对象的类则需要使用其他手段,例如下面的instanceof
运算符,或是class的特性,constructor属性等…
instanceof
作用
instanceof
运算符用来检测 构造函数 的 原型对象 是否存在于 参数 的 原型链上 。
语法
object instanceof constructor
它希望它的左边是一个对象,右边是一个类型。如果右边的类型的原型对象存在左边对象的原型链上,返回true,反之返回false。
function Student ( fname ){ this.sname = fname };
var LiMing = new Student("LiMing");
LiMing instanceof Student; //true 右边的Student类型的原型对象存在左边LiMing对象的原型链上
LiMing instanceof Object; //true Object的原型对象是Student原型对象的更上一级的父对象
Student.prototype = {};
LiMing instanceof Student; //false 此时Student的原型对象已经在上一步中被替换掉了,指向了一个空对象,这个空对象不在 LiMing 的原型链上
注意:
如果表达式
obj instanceof Foo
返回true
,则并不意味着该表达式会永远返回true
,因为Foo.prototype
属性的值有可能会改变,obj.__proto__
属性值也可能会改变,只要他们发生了变化整个表达式的结果就会发生变化。