检查JavaScript变量类型是否有键



我想通过for...in循环传递一些数据。我需要检查data的数据类型(在运行时之前是未知的)是否有意义,首先运行该循环。所有的Array,ObjectString都是有效的,但是如果data instanceof String,那么data[i]仍然是有效的,并且返回data中位置i的字符。我只想得到整个值(即其他标量和对象),而不是字符串的一部分。我不确定是否有ArrayObject以外的数据类型可以包含多个值,因此有意义的循环。

对于这样一个对象,什么是好的测试?这是我目前得到的,但我不知道它是否涵盖了所有情况。

if (typeof data === "object" && (data instanceof Array || data instanceof Object)) {
for (let i in data) {
// ...
}
}

我也看过可迭代的,但Objects不是可迭代的,只有Arrays。

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..中哪些数据类型是有效候选的猜测。

相关内容

  • 没有找到相关文章

最新更新