# 问题
var a = 1
console.log(a instanceof Object); // false;
console.log([] instanceof Object) // true
instaceof 不能用作基本类型
# typeof
typeof 其实就是判断参数是什么类型的实例,就一个参数,用例:typeof A
返回值: "number"、『string』、「boolean」、'object'、'function'、undefined
typeof 123; // number;
typeof 'jartto'; // string;
typeof !!'0'; // boolean
typeof new Function(); // function
typeof name; // undefined
这里我们扩展一下,加入我们要判断某个变量是否存在
if(!a) {console.log('error')}
这时候控制台就会报错
Uncaught ReferenceError: a is not defined
所以我们可以使用typeof 来判断
if(typeof a === 'undefined') {
console.log('error')
}
这样,就能避免代码异常,是一种比较严谨的处理方式
ES6中let和const会形成「暂时性死区」也意味着typeof 不再是一个百分之百安全的操作
typeof x; // ReferenceError
let x;
上面代码中,变量 x 使用 let 命令声明,所以在声明之前,都属于 x 的「死区」,只要用到该变量就会报错。因此,typeof 运行时就会抛出一个 ReferenceError。
如果用 typeof 来判断引用类型,会有怎样的结果?
let arr = [1,2,3];
let obj = {name: 'jartto'};
let obj1 = null;
typeof arr; // object
typeof obj; // object
typeof obj1; // object
如上所示,引用类型的数据,都返回了 object,我们无法做到精确判断。我们来总结一下:
- 对于基本类型,除 null 以外,均可以返回正确的结果。
- 对于引用类型,除 function 以外,一律返回 object 类型。
- 对于 null ,返回 object 类型。
- 对于 function 返回 function 类型。
这就需要用到 instanceof 来检测某个对象是不是另一个对象的实例。
# instanceof
instanceof 是用来判断A是否为B的实例,表达式为:A instanceof B,如果A是B的实例,则返回True,否则返回false
[] instanceof Array; //true
({}) instanceof Object;//true
new Date() instanceof Date;//true
js 中万物皆对象的思想
[] instanceof Object // true;
function Person(){};
new Person() instanceof Person; // true
new Person instanceof Object; // true
// 例二
function Parent(){};
function Child(){};
function Other(){};
Child.prototype = new Parent();
let child = new Child();
child instanceof Child; // true
child instanceof Parent; // true
child instanceof Object; // true
child instanceof Other; // false
很简单,我们只需要理解下面这行代码就可以了:
Parent.prototype.__proto__ === Object.prototype;
# 扩展
我们来分析一下 []、Array、Object 三者之间的关系:
从 instanceof 能够判断出 [].proto 指向 Array.prototype,而 Array.prototype.proto 又指向了Object.prototype,最终 Object.prototype.proto 指向了 null,标志着原型链的结束。
因此,[]、Array、Object 就在内部形成了一条原型链:

依次类推,类似的 new Date()、new Parent() 也会形成一条对应的原型链 。
instanceof 只能用来判断两个对象是否属于实例关系,而不能判断一个对象具体属于哪种类型
# 巩固只是
如何判断一个变量是否为数组
[] instanceof Array Array.isArray([])下面函数输出什么
var name = 'World!'; (function () { if (typeof name === 'undefined') { var name = 'Jartto'; console.log('Hi~ ' + name); } else { console.log('Hello ' + name); } })();这里需要注意变量声明提升,所以上面代码等效于
var name = 'World!'; (function () { var name; if (typeof name === 'undefined') { var name = 'Jartto'; console.log('Hi~ ' + name); } else { console.log('Hello ' + name); } })();