/**
 * 基本数据类型: number string boolean null undefined symbol(es6) bigInt(es10)
 * 复杂数据类型: array object function
 * 
 * 验证方法: 
 *         1. typeof
 *         2. instanceof
 *         3. constructor
 *         4. Object.prototype.toString.call()
 */

// 1. typeof 测试
console.log(typeof(1)); // number
console.log(typeof('str')); // string
console.log(typeof(false)); // boolean
console.log(typeof(null)); // object
console.log(typeof([])); // object
console.log(typeof({})); // object
console.log(typeof(undefined)); // undefined
console.log(typeof(function(){})); // function


// 2. instanceof 测试
console.log('1' instanceof String); // false - instanceof 不支持 基本数据类型的校验
console.log(1 instanceof Number); // false - instanceof 不支持 基本数据类型的校验
console.log(false instanceof Boolean); // false - instanceof 不支持 基本数据类型的校验

console.log([] instanceof Array); // true
console.log({} instanceof Object); // true
console.log(function() {} instanceof Function); // true

console.log(null instanceof null); // 无法验证
console.log(undefined instanceof undefined); // 无法验证


// 3. constructor 测试
console.log((1).constructor === Number); // true
console.log(('1').constructor === String); // true
console.log((false).constructor === Boolean); // true
console.log(([]).constructor === Array); // true
console.log(({}).constructor === Object); // true

console.log((null).constructor === null); // constructor 不支持 null的校验
console.log((undefined).constructor === undefined); // constructor 不支持 undefined的校验


// 4. Object.prototype.toString.call() 测试 - 我称它为 大BOSS
console.log(Object.prototype.toString.call(1)); // [object Number]
console.log(Object.prototype.toString.call('str')); // [object String]
console.log(Object.prototype.toString.call(false)); // [object Boolean]
console.log(Object.prototype.toString.call(null)); // [object Null]
console.log(Object.prototype.toString.call(undefined)); // [object Undefined]
console.log(Object.prototype.toString.call([])); // [object Array]
console.log(Object.prototype.toString.call({})); // [object Object]
console.log(Object.prototype.toString.call(function(){})); // [object Function]

// 封装方法: 与上等同
const getType = (val) => Object.prototype.toString.call(val).slice(8, -1).toLocaleLowerCase()
console.log(getType(1)); // number
console.log(getType('str')); // string
console.log(getType(false)); // boolean
console.log(getType(null)); // null
console.log(getType(undefined)); // undefined
console.log(getType([])); // array
console.log(getType({})); // object
console.log(getType(function(){})); // function

07-03 02:25