typeof和instaceof在前端编程中使用比较频繁,这里我对他们的区分做一个整理,希望对大家有帮助。
一、参数数量的区分
1.1 typeof是一元运算符,即参数只有一个
使用形式如下两种方式,operand是表达式(括号可选可不选)
typeof operand
or
typeof (operand)
1.2 instanceof 是二元元素符
object instanceof constructor
例:
var a = [];
a instanceof Array
二、返回值的区分
2.1 typeof 的返回值是String类型,有以下6种(报错除外)
- string
- boolean
- number
- undefined
- object
- function
其中需要注意一下几点
1.返回值均为小写,不要当成大写数据类型了
2.typeof的优先级高于+、-、*、/,但低于括号,具体请参考js运算符的优先级,所以上文演示才会报错相当于
(typeof a) = 1;
"string" = 1;
赋值运算属于LHS,因为不能对常量字符串赋值,所以报了LHS的错误。
思考题1(答案在结尾)
这里也给大家留一个思考题,typeof 1==1,输出是什么(结尾奉上)
2.2 instanceof 的返回值是bool类型
看这里之前,建议大家先看这一篇文章原型规则——javascript学习
先上代码看看
看到这个运行结果,就纳闷了,为什么String instanceof String 是false,我们先看instance的实现原理(搬砖的这篇JavaScript instanceof 运算符深入剖析)
function instance_of(L, R) {//L 表示左表达式,R 表示右表达式
var O = R.prototype;// 取 R 的显示原型
L = L.__proto__;// 取 L 的隐式原型
while (true) {
if (L === null)
return false;
if (O === L)// 这里重点:当 O 严格等于 L 时,返回 true
return true;
L = L.__proto__;
}
}
看完上篇原型规则总结一句话就是,只有当object的隐式原型等于后者的显示原型时才返回true,根据原型链一直向上寻找,直至找到为止。这里分析一下Object、Number和Function instanceof自身的情况(关于显示原型和隐式原型这里不再多做解释):
1.Object instanceof Object
右侧:Object.prototype是Object.prototype
左侧 :Object.__proto__是Function.prototype
接着向上:Function.prototype.__proto__是Object.prototype
左侧等于右侧 返回true
2.Number instanceof Number
右侧:Number.prototype是Number.prototype
左侧 :Number.__proto__是Function.prototype
接着向上:Function.prototype.__proto__是Object.prototype
左侧不等于右侧 返回false
3.Function instanceof Function
右侧:Function.prototype是Function.prototype
左侧 :Function.__proto__是Function.prototype
左侧等于右侧 返回true
思考题2(答案见尾部)
Object instanceof Function 是true还是false?
三、使用场景
3.1 typeof主要用来返回目标表达式的的数据类型
3.2 instanceof 主要用于判断一个对象是否是一个实例的原型。
四、解答
思考题1)typeof 1==1,输出是什么
//等价于
let a = typeof 1;//a="number";
a ==1;//false
思考题2)Object instanceof Function 是true还是false?
Object instanceof Function
右侧:Function.prototype是Function.prototype
左侧 :Object.__proto__是Function.prototype
左侧等于右侧 返回true
就这么多啦,如有问题,欢迎指正。