1. typeof:判断基本数据类型
console.log(typeof('123'));console.log(typeof(123));console.log(typeof(true));console.log(typeof(undefined));console.log(typeof([1, 2, 3]));console.log(typeof({a:1}));

2. constructor
const arr = [1, 2, 3];// constructor 指向当前这个原型是那个构造函数的原型console.log(arr.__proto__.constructor) ;// constructor指向当前这个原型是那个构造函数的原型console.log(arr.constructor); console.log(arr.constructor === Array); // trueconsole.log(arr.constructor === Function); // false

const arr = [1, 2, 3];console.log(arr); // 数组console.log(arr.__proto__); // 自己构造函数的原型对象console.log(Array.prototype); // 构造函数Array的原型对象console.log(Array.prototype.constructor); // 构造函数Array的原型对象

2.1 问题1
//undefined内部没有constructor,所以我么不能这样去判断console.log(undefined.constructor); //报错// null内部没有constructor 所以我们不用这样去判断console.log(null.constructor); //报错
2.2 问题2
- 能够判断引用数据类型,但是这个属性其实就是对象内的一个属性, 我们可以拿到这个对象, 然后修改他的属性值
const arr = [1, 2, 3];console.log(arr); Array.prototype.constructor = { a: 1 };console.log(Array.prototype.constructor);console.log(arr.__proto__.constructor === Array);

3. instanceof
- 可以判断 左边的构造函数是否等于右边的构造函数
- 语法: 检测的数据instanceof构造函数
- 问题: 不能判断undefined和null
const arr = [1,2,3,4]const obj = {a:1,b:2}console.log(arr instanceof Array);console.log(arr instanceof Object); console.log(undefined instanceof undefined); //报错console.log(null instanceof null); //报错

4. Object.prototype.toString.call(要判断的数据结构)
- Object 这个构造函数的原型内部 有一个toString的方法
- 这个方法能够帮我们将数据结构转为字符串的形式,‘[object 数据结构]’
- 我们在使用的时候 如果需要判断其他数据类型, 需要使用.call这个方法改变内部this指向
- 这个方法任何数据类型都能准确判断(推荐使用)
console.log(Object.prototype.toString.call(123));console.log(Object.prototype.toString.call(undefined));console.log(Object.prototype.toString.call(null));console.log(Object.prototype.toString.call(function(){}));console.log(Object.prototype.toString.call([]));
