`Object.keys(x)`会抛出吗?

时间:2017-11-15 21:08:59

标签: javascript node.js

我怎么能确定是否

Object.keys(x)会抛出错误吗?

其中x是任何东西。

2 个答案:

答案 0 :(得分:3)

根据文件MDN

  

在ES5中,如果此方法的参数不是对象(基元),   那么它会导致TypeError。在ES2015中,非对象参数会   被强迫对象。

答案 1 :(得分:1)

我最后决定添加自己的答案,因为人们并没有在这里给出最简单,最完整的答案:

  

Object.keys(x)会抛出吗?

是的,它可以抛出。在ES5中,如果x不是对象,它将抛出。您可以在IE11或任何旧版浏览器中自行验证。

在ES2015中,如果xundefinednull,则会抛出。其他非对象值(如数字,字符串或布尔值)将被强制转换为对象,然后返回一个空数组(因为强制对象没有可枚举的属性)。

ES2015 specification要求将x强制转换为对象(如果可能)。这意味着它会成功地将某些内容强制转换为对象,例如数字,布尔值,字符串,但不能nullundefined,因此即使在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)。

但是,实际上说,如果你知道你可能会在那里得到一个非对象,那么在防御性方面进行编码可能更简单,因为你有一个移动无论实施的这个方面如何,规范和实施的目标都是可靠的,只是防御性地进行编码。然后,您不必确定底层平台在给定错误数据时的行为方式。只需预先过滤掉坏数据,这样就可以在这种情况下拥有你想要的行为。