用来返回表达式的类型
typeof (unary expression)
可返回类型见规范: https://www.ecma-international.org/ecma-262/6.0/#sec-typeof-operator
其中需注意的是 typeof null === 'object'
;
实现了 [[call]] 的 object 返回 function
- Null
- Undefined
- Number
- String
- Boolean
- Symbol
- Object
用来检查 A 的原型链 中是否存在 B.prototype;
A instanceof B
其本质是循环获取 A.prototype 来与 B.prototype 做比较
参看规范: https://www.ecma-international.org/ecma-262/6.0/#sec-instanceofoperator
step 6 即循环获取步骤, 直到到达 最原始的Object
Object.getPrototypeOf(A) === B.prototype ?
Object.getPrototypeOf(Object.getPrototypeOf(A)) === B.prototype ?
...
注意点: 不同环境中的原型并不相同,比如两个 iframe 中,在 iframeA 的环境中去判断 iframeB 中的值。
比如在 iframeA 中做这样的操作 an array in iframeB instanceof Array in iframeA
,虽然的确是数组,但依旧返回 false
Object.getPrototypeOf
方法用来获取指定对象的 prototype
A.isPrototypeOf(B)
检查 A 是否在 B 的原型链上,
因此
A.prototype.isPrototypeOf(B)
可以检查 A.prototype 是否存在 B 的原型链上,与 instanceof 正好相反
class A {}
class AA extends A {}
const aa = new AA();
aa instanceof AA === true;
aa instanceof A === true;
Object.getPrototypeOf(aa) === AA.prototype;
Object.getPrototypeOf(aa) !== A.prototype;
Object.getPrototypeOf(Object.getPrototypeOf(aa)) === A.prototype; // 感受一下
AA.prototype.isPrototypeOf(aa) === true; // 与 aa instanceof AA 相反
A.prototype.isPrototypeOf(aa) === true; // 与 aa instanceof A
A.isPrototypeOf(AA) === true;