typeof
目前能返回以下8种判断类型
值类型
- string
- number
- boolean
- symbol
- bigint(es10新增)
- undefined
引用类型
- object
- function
console.log(typeof '嚣张') // string
console.log(typeof 18) // number
console.log(typeof true) // boolean
console.log(typeof undefined) // undefined
const s1 = Symbol('s')
const s2 = Symbol('s')
console.log(s1); // Symbol(s)
console.log(s1 == s2); // false
console.log(typeof 1234567891011121314n); //bigint
console.log(typeof null) // object
console.log(typeof {}) // object
console.log(typeof []) // object
console.log(typeof function() {}) //; function
从上述案例就可以看出来其缺点是什么
值类型可以分辨清楚, 但是对于引用类型,只返回object
/function
, 不知道他返回的是数组, 日期还是对象
instanceof
instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
详见instanceof
// 定义构造函数
function A() {}
function B() {}
// A的实例对象
const a = new A();
console.log(A.prototype);
console.log(Object.getPrototypeOf(a)); //返回指定对象的原型
console.log(a instanceof A) //true 因为 Object.getPrototypeOf(a) === A.prototype
console.log(a instanceof B) // false 因为B.prototype不在a的原型链上;
// isPrototypeOf() 方法用于测试一个对象是否存在于另一个对象的原型链上。
console.log(Object.prototype.isPrototypeOf(a)); //true
console.log(a instanceof Object) // 因为上面为true, 所以该值也为true
console.log(a.prototype instanceof Object) //true 同上;
A.prototype = {};
const a2 = new A();
console.log(a2 instanceof A); //true
console.log(a instanceof A); // false A.prototype指向一个空对象, 这个空对象不在a的原型链上
B.prototype = new A() // 继承
// B的实例对象
const b = new B();
console.log(b instanceof B); // true
console.log(b instanceof A); // true 因为A.prototype现在在b的原型链上
以上是为了让你更加料及instanceof 真正的 判断数据类型在下面
const b = new B()
console.log(b instanceof B) // true
console.log(b instanceof A) // true 因为A.prototype现在在b的原型链上
function Fn() {}
const fn = new Fn()
const num = new Number()
console.log(fn instanceof Fn) // true
console.log(num instanceof Fn) // false
console.log(num instanceof Number) // true
console.log('嚣张' instanceof String); // false
console.log(18 instanceof Number); //false
console.log(true instanceof Boolean); // false
console.log([] instanceof Array); // false
console.log({} instanceof Object); // false
看到上面运行结果会发出一个疑问, 为什么下面几个的结果是false, 因为像 ‘嚣张’ , 18, true, [], {} 等不是对象实例
此类方法只能检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
constructor
所有对象都会从它的原型上继承一个 constructor 属性
看上去constructor是最好的选择 , 但是官网给出了例子, 我们可以改变对象的 constructor,
只有 ‘嚣张’, 18, true 不受影响, 因为创建他们的是只读的原生构造函数(native constructors)。这个例子也说明了依赖一个对象的 constructor 属性并不安全。
Object.prototype.toString
toString() 方法返回一个表示该对象的字符串
看到toString方法 我们首先会想到, 咦 这不就是转换成字符串类型的方法吗
这是各数据类型调用toString()的返回值, 可以看出他们都有toString()方法
接下来再看一个例子
可以发现两者 Object.toString输出的是function Object() { [native code] }
而object的原型上的toString输出的是[object Object]
mdn
给出的解释是
每个对象都有一个 toString() 方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString() 方法被每个 Object 对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 “[object type]”,其中 type 是对象的类型
eg:
var o = new Object();
console.log(o.toString()); // [object Object]
从结果可以看出来, 每个数据类型都显示出来了, 此方法是最常用,最精准的