let a = {} let b = [] typeof a // returns an object typeof b // returns an object a === {} // false b === [] // false a === b // false
那么我怎么知道它是数组还是对象呢?我尝试验证用户输入,其中它可以是数组或对象,但在这两种情况下,我都不希望值为空
soat7uwm1#
这真的是几个问题合二为一。首先,对于许多人来说,typeof []是'object'是违反直觉的。这仅仅是因为Array是一个引用类型(null,Date示例,以及任何其他对象引用也有object的typeof)。值得庆幸的是,要知道一个对象是否是Array的示例,现在可以使用方便的Array.isArray(...)函数,或者,可以对任何类型的对象使用该函数,可以执行类似b instanceof Array的操作。要知道其中一个是否为 empty,可以通过检查Object.keys(a).length === 0来完成,尽管对于Arrays,检查b.length === 0更自然。用===检查任意两个对象变量(包括Arrays),只会告诉你这两个变量是否引用了内存中的同一个对象,而不会告诉你它们的 * 内容 * 是否相等。
typeof []
'object'
null
Date
object
typeof
Array
Array.isArray(...)
b instanceof Array
Object.keys(a).length === 0
b.length === 0
===
zd287kbt2#
由于数组和对象共享相同的类型,因此您可以检查以下示例:
if (b instanceof Array) { }
ryevplcw3#
if (Array.isArray(a) && a.length === 0) { // a is an array and an empty one }
afdcj2ne4#
实际上,Object和Arrays都使用typeof会返回Object,JS中有一些方法可以检查变量是否为数组。1.* 数组.isArray(变量名)*1.* 数组的变量名示例 *1.* 变量名.构造函数===数组 *如果变量是数组,则所有这些方法将返回true,否则将返回false。
4条答案
按热度按时间soat7uwm1#
这真的是几个问题合二为一。首先,对于许多人来说,
typeof []
是'object'
是违反直觉的。这仅仅是因为Array是一个引用类型(null
,Date
示例,以及任何其他对象引用也有object
的typeof
)。值得庆幸的是,要知道一个对象是否是
Array
的示例,现在可以使用方便的Array.isArray(...)
函数,或者,可以对任何类型的对象使用该函数,可以执行类似b instanceof Array
的操作。要知道其中一个是否为 empty,可以通过检查
Object.keys(a).length === 0
来完成,尽管对于Arrays,检查b.length === 0
更自然。用
===
检查任意两个对象变量(包括Arrays),只会告诉你这两个变量是否引用了内存中的同一个对象,而不会告诉你它们的 * 内容 * 是否相等。zd287kbt2#
由于数组和对象共享相同的类型,因此您可以检查以下示例:
ryevplcw3#
afdcj2ne4#
实际上,Object和Arrays都使用typeof会返回Object,JS中有一些方法可以检查变量是否为数组。
1.* 数组.isArray(变量名)*
1.* 数组的变量名示例 *
1.* 变量名.构造函数===数组 *
如果变量是数组,则所有这些方法将返回true,否则将返回false。