typeof 可以判断除了 null 之外所有的基本类型,以及函数。返回值为 7 个字符串
string
boolean
number
symbol (ES2015 新增)
bigint (ES2020 新增)
undefined
function
基本类型中的 null 会被判断为 object :
typeof null === 'object'
Array.isArray()
Array.isArray() 用于确定传递的值是否是一个 Array 。这个方法是 Array 的静态方法,不能在实例上访问,只能通过 Array 进行调用。
const arr = [1, 2]
const obj = {a: 1}
Array.isArray(arr) // true
Array.isArray(obj) // false
使用instanceof判断Array和Object
instanceof用来判断一个变量是否为一个构造函数创建的实例,代码形式为obj1 instanceof obj2(obj1是否是obj2的实例)判断方法是根据对象的原型链依次向下查询,如果obj2的原型属性存在obj1的原型链上,(obj1 instanceof obj2)值为true。
注意:不管判断数组还是对象,都必须 xxx instanceof Array
arr = [1, 2, 3, 4, 5]
obj = {name: "dby", age: 23}
arr instanceof Array // true,即为数组
obj instanceof Array // false,即为对象
在 JS 中 Array 继承了 Object,所以数组也会被判断为对象,因此 xxx instanceof Object无法区分数组和对象
arr = [1, 2, 3, 4, 5]
obj = {name: "dby", age: 23}
Array instanceof Object // true,数组继承了Obejct的原型对象
arr instanceof Object // true,数组也会被判断为对象
obj instanceof Object // true
通过上面的分析,有的同学应该会发现,instanceof判断数组和对象其实还是有限制的,xxx instanceof Array其实只能区分数组,因为JS中有12种常见的内置对象Arguments, Boolean, Date, Error, Function, JSON, Math, Number, Array, Object, RegExp, String,这些对象全都继承了Object()的原型对象,而instanceof又会一直沿着原型链去查找,所以当xxx instanceof Array返回false的时候,只能确定不是数组,但无法确定是不是形如{name: "dby", age: 23}的对象。
String instanceof Object // true Function instanceof Object // true 1 2 这里再补充一下instanceof的原理,其实就是沿着原型链向上查找。
function new_instance_of(leftValue, rightValue) {
let rightProto = rightValue.protytype, // 获取构造函数原型对象
leftValue = leftValue__proto__; // 获取实例原型指针
while(leftValue !== null) {
if(leftValue === rightProto) {
return true; // 如果实例proto指向构造函数原型对象
}
leftValue = leftValue.__proto__; // 如果不是,就继续沿着原型链向上查找
}
return false; // 实例proto最终指向null,如果还是没有就返回false
}
————————————————
版权声明:本文为CSDN博主「天猫精灵998」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:blog.csdn.net/weixin_4348…