其中基本数据类型包括:Number,String,Boolean,undefined,null等
基本数据类型是存储在栈中。
其中包括Object,Function,Array等。
引用数据类型是存储在堆中。
注意:Function,Array也是一种Object。算是特殊的对象。
首先定义好所有的数据类型:
let a = 1;
let b = '1';
let c = undefined
let d = true
let f = null
let obj = Object.create({})
let obj1 = {};
let arr = new Array();
let arr1 = [1];
let fun = function () {
console.log("dd");
}
let sym = Symbol('您好');
let bgin = 100n;
*typeof() **实现原理:利用计算机二进制值来进行检测,检测速度很快
判断不出null、obj和数组类型,均返回object
console.log(typeof (a)); //number
console.log(typeof (b)); //string
console.log(typeof (c));//undefined
console.log(typeof (d));//boolean
console.log(typeof (f));//object
console.log(typeof (obj));//object
console.log(typeof (obj1));//object
console.log(typeof (arr));//object
console.log(typeof (fun));//function
console.log(typeof (sym));//symbol
console.log(typeof (bgin));//bigint
//判断不出null、obj和数组类型,均返回object
*instanceof 判断数据类型 **按照原型链进行查找检测的「如果当前类的原型对象,出现在检测值的原型链上,则结果是true」
(1).检测对象是否为Object实例,结果都是true,所以无法验证是否为标准普通对象
(2).instanceof无法处理原始值类型的检测的,检测结果都是false
console.log(a instanceof Number); //false
console.log(new Number() instanceof Number); //true
console.log(b instanceof String);//false
console.log(f instanceof Object);//false
console.log(obj instanceof Object);//true
console.log(arr1 instanceof Object);//true
console.log(arr instanceof Array);//true
console.log(fun instanceof Function); //true
// console.log(sym instanceof Object);//true
// console.log(bgin instanceof BigInt); //true
constructor 原理是找该变量得原型对象上得构造函数,从而判读数据类型
因为constructor很容易被修改,所以检测的结果“仅供参考”
undefined和null值均判断不了,因为会报错,没有constructor属性
console.log(a.__proto__); //Number
console.log(sym.constructor);//ƒ Symbol() { [native code] }
console.log(a.constructor == Number); //true
console.log(b.constructor == String); //true
console.log(d.constructor == Boolean); //true
console.log(obj.constructor == Object);//true
obj.constructor = Function;
console.log("修改构造函数");
//注意这里修改了obj的构造函数,指向了function,在次进行obj.constructor == Object 时返回false
console.log(obj.constructor == Object);//false
console.log(arr.constructor == Array);//true
console.log(fun.constructor == Function);//true
console.log(sym.constructor == Symbol);//true
console.log(bgin.constructor == BigInt);//true
object.prototype.toString.call() 原理是修改对象上得this指向到该变量,然后toString输出出来
所有数据类型均可以精准判断出来
const toString = Object.prototype.toString;
console.log(Object.prototype.toString(d));
//[object Object] 这里展示了正常object的tostring方法是输出自己的构造函数
console.log(toString.call(a)); //[object Number]
console.log(toString.call(b));//[object String]
console.log(toString.call(c));//[object Undefined]
console.log(toString.call(d));//[object Boolean]
console.log(toString.call(f)); //[object Null]
console.log(toString.call(obj));//[object Object]
console.log(toString.call(arr));//[object Array]
console.log(toString.call(fun));//[object Function]
console.log(toString.call(sym));//[object Symbol]
console.log(toString.call(bgin));//[object BigInt]