检查是否为';迭代JavaScript变量是安全的
我有一个JavaScript函数,其中有人可以传入任何内容,我使用检查是否为';迭代JavaScript变量是安全的,javascript,Javascript,我有一个JavaScript函数,其中有人可以传入任何内容,我使用 for x in obj 语法。但是,如果传递原语(字符串或数字),则会导致错误;正确的行为是函数对那些对象的作用方式与对没有键的对象的作用方式相同 我可以做一个try..catchblock来解决这个问题,但是还有其他(更简洁的)方法吗 对象和数组也是如此(尽管您通常不希望使用for..in在数组上迭代) 编辑:修复,每厘米。有很多方法可以推断,这里有一个很好的方法: function isIterable(obj) {
for x in obj
语法。但是,如果传递原语(字符串或数字),则会导致错误;正确的行为是函数对那些对象的作用方式与对没有键的对象的作用方式相同
我可以做一个try..catch
block来解决这个问题,但是还有其他(更简洁的)方法吗
对象和数组也是如此(尽管您通常不希望使用for..in在数组上迭代)
编辑:修复,每厘米。有很多方法可以推断,这里有一个很好的方法:
function isIterable(obj) {
if (obj && obj.hasOwnProperty) {
return true;
}
return false;
}
你可以选择一些。很好的测试,我唯一可以添加的是,
typeof
是一个一元运算符,而不是一个函数,所以paren只是在x
周围创建一个表达式,然后应用该运算符。另外,虽然我很迂腐和愚蠢,因为typeof
总是返回一个字符串,=
操作符可能会快一秒。总而言之,这是完全正确的…唯一的问题可能是null
,是一个原始的typeof
是完全错误的:typeof null=='object'
Alex:为什么===
比=
更快?根据ECMAScript规范,在这种情况下,两种比较将执行完全相同的步骤。啊,非常优雅。我没有意识到typeof
为数组等返回了object
。谢谢@蒂姆:实际上我并不完全确定,在这种情况下,为什么三重相等需要更长的时间。我知道,一般来说,三重等于有时会更快,因为二重等于经常需要进行类型强制。不过,我所拥有的只是基准,我不能说我在这些方面是最好的,但它们是相当一致的。(如果你想要的数字在chrome中不是太接近/太小,那么你必须在迭代变量的末尾加上一个0)-double equals似乎每次都赢(即使你切换顺序)。希望有帮助:)
function isIterable(obj) {
if (obj && obj.hasOwnProperty) {
return true;
}
return false;
}