- js类型: 基本类型: number, string, boolean, null, underfined, symbol, bigInt(是一种内置对象,是处symbol外的第二个内置对象) 复杂数据类型: array, object, function, 和内置对象Date等
2.判断js类型: 2. 1 基本类型除了 typeof(null) // object
typeof 1 // "number"
typeof 'a' // "string"
typeof true // "boolean"
typeof undefined // "undefined"
typeof Symbol() // "symbol"
typeof 42n // "bigint"
typeof(NaN) // number
typeof({a:1}) // object
typeof(arr) // object
typeof(new Date()) // object
-
- object.prototype.toString.call() === '[object, 类型]'。在《那不知道的javascript》中讲到, 所有typeof返回值为‘object’的对象,都包含一个内部属性[[class]],我们可以把他看作一个内部的分类,而非传统意义上面向对象的类,这个属性无法访问,一般通过Object.prototype.toStirng()来查看,并且对于null, underfined, 这样没有原生构造函数,内部的class属性值仍然是null 和 underfied。 为什么不直接Object.prototype.toSring() 为什么要放在 call中 ?
两个 toSring()根本不是同个方法,object本身是一个构造函数,任意一个函数自身的toSring方法都继承自function构造函数,而object原型下面的构造函数是返回对象内部的class值,b.虽然Array也继承自object, 但js在 Array.prototype上重写了toString, 而我们通过toSting.call(arr)实际上是通过原型链调用了
-
- obj instanceof Object 只能用来判断复杂数据类型,instanceof 是用来检测构造函数的prototype属性是否出现在某个实例对象的原型链上,但这种方式,对number,string, boolean, 这三种基本数据类型,只有通过构造函数定义如 let num = new Number(1) 才能检测出
-
- constructor 判断
console.log('数据类型判断 - constructor');
let num = 23;
let date = new Date();
let str = "biu~";
let reg = new RegExp();
let bool = true;
let fn = function () {
console.log(886);
};
let udf = undefined;
let nul = null;
let array = [1, 2, 3];
console.log(num.constructor); // [Function: Number]
console.log(date.constructor); // [Function: Date]
console.log(str.constructor); // [Function: String]
console.log(bool.constructor); // [Function: Boolean]
console.log(fn.constructor); // [Function: Function]
console.log(reg.constructor); // [Function: RegExp]
console.log(array.constructor); // [Function: Array]
// 这种方式解决了instanceof的弊端,可以检测除了null和underfined 的9种类型,因为他两没有原生构造函数
console.log(udf.constructor);
//Cannot read property "constructor" of undefined
console.log(nul.constructor);
//Cannot read property "constructor" of null