我想通过for...in
循环传递一些数据。我需要检查data
的数据类型(在运行时之前是未知的)是否有意义,首先运行该循环。所有的Array
,Object
和String
都是有效的,但是如果data instanceof String
,那么data[i]
仍然是有效的,并且返回data
中位置i
的字符。我只想得到整个值(即其他标量和对象),而不是字符串的一部分。我不确定是否有Array
和Object
以外的数据类型可以包含多个值,因此有意义的循环。
对于这样一个对象,什么是好的测试?这是我目前得到的,但我不知道它是否涵盖了所有情况。
if (typeof data === "object" && (data instanceof Array || data instanceof Object)) {
for (let i in data) {
// ...
}
}
我也看过可迭代的,但Object
s不是可迭代的,只有Array
s。
if (typeof data === "object")
这涵盖了你可能要处理的任何潜在的秘密可迭代结构,并排除了所有的数字,字符串,未定义的等列表
给定对象。Keys函数可以安全地传递任何数据类型
Object.keys(1) // []
Object.keys('f') // ['0']
Object.keys(false) // []
Object.keys(new Date()) // []
Object.keys(BigInt("123456789012345678901234567890")) // []
Object.keys({foo: 1}) // ['foo']
Object.keys(['foo', 'bar']) // ['0', '1']
和MDN声明对象。Keys的意思是在…在没有测试的情况下,你应该安全地尝试迭代任何对象,不合格的数据类型将导致noop场景。
现在,对您的需求进行更明确的检查如下:
if (typeof data !== "string" || !(data instanceof String)){ ... }
此检查将允许除字符串类型和string对象实例以外的所有值进入for循环。
它更可读,因为它说明了for…在您想要排除的类型候选中。这应该可以解决您对迭代中for..中哪些数据类型是有效候选的猜测。