Javascript Object.keys(x)`会扔吗?
我怎么能确定Javascript Object.keys(x)`会扔吗?,javascript,node.js,Javascript,Node.js,我怎么能确定 Object.keys(x)是否会抛出错误 其中x是任何东西。根据文档 在ES5中,如果此方法的参数不是对象(原语), 那么它将导致一个类型错误。在ES2015中,将使用非对象参数 被强迫成为一个对象 我最终决定添加我自己的答案,因为人们在这里没有给你最简单、最完整的答案: Object.keys(x)会抛出吗 是,它可以抛出。在ES5中,如果x不是对象,它将抛出。您可以在IE11或任何较早的浏览器中自己验证这一点 在ES2015中,如果x是undefined或null,它将抛出。
Object.keys(x)
是否会抛出错误
其中x是任何东西。根据文档
在ES5中,如果此方法的参数不是对象(原语),
那么它将导致一个类型错误。在ES2015中,将使用非对象参数
被强迫成为一个对象
我最终决定添加我自己的答案,因为人们在这里没有给你最简单、最完整的答案:
Object.keys(x)
会抛出吗
是,它可以抛出。在ES5中,如果x
不是对象,它将抛出。您可以在IE11或任何较早的浏览器中自己验证这一点
在ES2015中,如果x
是undefined
或null
,它将抛出。其他非对象值(如数字、字符串或布尔值)将强制为对象,然后返回空数组(因为强制对象没有可枚举属性)
要求将x强制为对象(如果可能)。这意味着它将成功地将一些东西强制为对象,例如数字、布尔值、字符串,但不会null
或undefined
,因此即使在ES2015中,object.keys(null)
和object.keys(undefined)
仍将抛出Chrome v62中测试的结果
所以,如果你真的想安全,你可以在你的代码周围放一个
try/catch
,或者测试一下x!==调用object.keys()
之前,null&&typeof x==“object”
或者,使用try/catch
:
function safeKeys(val) {
try {
return Object.keys(val);
} catch(e) {
return [];
}
}
try/catch
可能最终会更安全,以防不完美的实现在您意想不到的情况下抛出
如何确定
Object.keys(x)
是否会抛出错误
您可以阅读相关规范,了解应该执行哪些实现。而且,您可以测试相关的实现,以了解它们实际上做了什么。如果你真的想知道,你必须测试具体的实现。在一个不完美的世界里,如果你想知道这样一件事,绝对肯定有点偏离常规,你必须自己测试一下,看看它们是如何表现的
在这个例子中,一个简单的测试用例需要大约2分钟的时间来编写代码并在一些相关的环境中运行。这个案例比平常稍微复杂一些,因为规范和实现随着时间的推移而改变(不同于ES5到ES2015)
但是,实际上讲,如果您知道可能会得到一个非对象,那么只进行防御性编码可能更简单,在这种特殊情况下,因为您有一个规范和实现的移动目标,建议您只进行防御性编码,而不管实现的这一方面如何。然后,您不必确定在给定坏数据时底层平台的行为。只需预先过滤掉坏数据,使其具有您希望在这种情况下具有的行为。
Object.keys(null)代码>或对象键(未定义)代码>您尝试过随机类型吗?请阅读文档!您可以在Object()中包装x,例如:Object.keys(Object(x))代码>如果x未定义或为null或其他任何值,它不会抛出错误。我用对象验证了这一点。键(5)
IE11将抛出,当前的Chrome v61将强制一个对象,从而返回一个空数组。我没有ES5版本的Chrome、Firefox或Safari来尝试这一点。”…如果你真的想知道,你必须测试。”确保测试所有平台上所有浏览器所有版本的所有次要版本,用于所有可能的用途。如果你能在2分钟内完成,我会很感动的。或者像大多数生产环境那样,依靠最好的可用数据,在极为罕见的未知实现错误情况下进行处理。现实世界。@rockstar-OP问“我如何确定?”所以我回答这个问题。是的,在使用它们之前测试所有可能的特性是不实际的,但是如果您不打算防御性地编写代码,因此您的代码需要知道,那么您必须进行测试,以知道您是否可以不防御性地编写代码。对我来说,如果根据以前的经验我还不确定,那么我会防御性地编写代码。坦率地说,它比测试所有相关环境要快得多。我更新了我的答案,添加了这方面的信息。你的第一个safeKeys
并没有防御性地修改你向我提出质疑的bug或未来的规范更改。现在你在含糊其辞了。如果根据以前的经验还不能确定,您可以说您编写了防御代码。你以前的经验是一个任意的指标,本质上就是我建议的。我有一种感觉,你实际上是在我一直描述的现实中运作的,但对StackOverflow来说是学究式的。不管怎样“如果你的结论是对的,那么这只是一场毫无意义的辩论。”@rockstar-对不起,但我不知道如何编写代码来防御未来所有可能的规范更改,我并没有试图这么做。第一个safeKeys()
只是确保传递的是一个非空对象,这就是object。keys()
一直被设计用于操作和做一些有用的事情。它试图完全避免Object.keys()
在给定非对象时的行为。这是为这个函数编写防御代码的一种非常合理的方法。防御措施是针对当给定一个非对象时它的行为。@rockstar-至于“你在哪里”,你的回答没有提供关于如何在这里编写解决方案的建议,所以我不知道你是如何说我达到了与你相同的点。答案中根本没有定义编码解决方案的“您在哪里”。阅读我们的两个答案的人也不会认为他们说的是几乎相同的东西。
function safeKeys(val) {
try {
return Object.keys(val);
} catch(e) {
return [];
}
}