typeof 返回一个字符串,对 number、string、boolean、undefined、symbol、bigint 都准确,但有两个著名黑洞:typeof null === 'object'(历史遗留 bug),typeof 数组、对象、正则、日期统统返回 'object'。它的价值在于安全——对未声明变量调用 typeof 不报错,而直接访问会抛 ReferenceError。
instanceof 走原型链查找:a instanceof B 会沿 a 的原型链看是否有 B.prototype,因此能区分数组、Date、正则等引用类型。但它只适用于对象,原始值 instanceof 任何类型都是 false;并且跨 iframe / 跨窗口时原型不共享,判断会失效。日常推荐组合拳:原始类型用 typeof,引用类型用 instanceof 或 Object.prototype.toString.call。
console.log(typeof 42); // number console.log(typeof 'hi'); // string console.log(typeof undefined); // undefined console.log(typeof null); // object(历史 bug) const arr = [1, 2]; console.log(typeof arr); // object console.log(arr instanceof Array); // true console.log(arr instanceof Object); // true(原型链) class Animal {} class Dog extends Animal {} const d = new Dog(); console.log(d instanceof Dog); // true console.log(d instanceof Animal); // true // 原始值不能用 instanceof console.log('abc' instanceof String); // false // 最可靠的类型判断 function typeOf(x) { return Object.prototype.toString.call(x).slice(8, -1).toLowerCase(); } console.log(typeOf([])); // array console.log(typeOf(null)); // null console.log(typeOf(/a/)); // regexp