我怎么能确定是否
Object.keys(x)
会抛出错误吗?
其中x是任何东西。
答案 0 :(得分:3)
根据文件MDN
在ES5中,如果此方法的参数不是对象(基元), 那么它会导致TypeError。在ES2015中,非对象参数会 被强迫对象。
答案 1 :(得分:1)
我最后决定添加自己的答案,因为人们并没有在这里给出最简单,最完整的答案:
Object.keys(x)
会抛出吗?
是的,它可以抛出。在ES5中,如果x
不是对象,它将抛出。您可以在IE11或任何旧版浏览器中自行验证。
在ES2015中,如果x
为undefined
或null
,则会抛出。其他非对象值(如数字,字符串或布尔值)将被强制转换为对象,然后返回一个空数组(因为强制对象没有可枚举的属性)。
ES2015 specification要求将x强制转换为对象(如果可能)。这意味着它会成功地将某些内容强制转换为对象,例如数字,布尔值,字符串,但不能null
或undefined
,因此即使在ES2015中,Object.keys(null)
和{{1}也是如此仍然会在Chrome v62中测试。
所以,如果你真的想要安全,你可以在代码周围添加Object.keys(undefined)
,或者在调用try/catch
之前测试是否x !== null && typeof x === "object"
。
Object.keys()
或者,使用function safeKeys(val) {
// test to see if we have a valid non-null object
if (val && typeof val === "object") {
return Object.keys(val);
} else {
return [];
}
}
:
try/catch
function safeKeys(val) {
try {
return Object.keys(val);
} catch(e) {
return [];
}
}
可能最终会更加安全,以防在某些您不期待的情况下执行不完善。
我如何确定
try/catch
是否会抛出错误?
您可以阅读相关规范,了解哪些实施 应该 。而且,您可以测试相关的实施,以找出 他们实际做什么 。如果你想确切地知道,你必须测试具体的实现。在一个不完美的世界里,如果你想知道这样的东西是绝对确定的有点不受欢迎的道路,你必须亲自测试并看看它们的行为。
在此示例中,一个简单的测试用例大约需要2分钟来编写代码并在一些相关环境中运行。这个案例比平常稍微复杂一些,因为规范和实施随着时间的推移而变化(不同于ES5到ES2015)。
但是,实际上说,如果你知道你可能会在那里得到一个非对象,那么在防御性方面进行编码可能更简单,因为你有一个移动无论实施的这个方面如何,规范和实施的目标都是可靠的,只是防御性地进行编码。然后,您不必确定底层平台在给定错误数据时的行为方式。只需预先过滤掉坏数据,这样就可以在这种情况下拥有你想要的行为。