有人知道从将原语传递给Object.keys
时抛出错误到静默地将原语强制到对象并返回结果的变化背后的原因吗?
我不确定是否有人会期望Object.keys('abc')
返回[0, 1, 2]
,而且它似乎违反了“不要破坏网络”的首要指令。如果某些网站的代码将对Object.keys
的调用包装在try/catch中,以处理调用者错误地传递原语,该怎么办?
这就是为什么我觉得这种变化背后一定有很强的理由。如果有人有关于这方面的信息,我会非常感兴趣。
发布于 2019-06-05 18:01:48
我找不到任何关于这个决定的内容,所以我只能提供我自己的观点。
正如一位评论员指出的那样,这是ES 2015更大趋势的一部分,允许更广泛的非对象输入。在ES 2015规范中,短语“在以前的版本中,非对象参数总是导致抛出TypeError
”出现在Object
上的10个不同的方法中。
首先,此更改使Object.keys
的行为与for-in
循环的行为一致,后者始终能够对原语进行操作。考虑到规范已经要求Object.keys
和for-in
之间的顺序匹配,因此要求相同的有效操作数集似乎并不奇怪。
这种改变看起来几乎和对现有代码一样无害,同时大大降低了Object.keys
的脆弱性。即使在使用try-catch的情况下,也很难想象成功执行Object.keys
会导致实际问题。我可以很容易地想象这样的代码:
try {
var keys = Object.keys(input);
} catch {
// oops, input was a primitive; call `new [Constructor]` to wrap it
var keys = Object.keys(
new input.constructor(input)
);
}
但是,当Object.keys
没有出错时,这并不会中断;成功的Object.keys
调用会使catch
代码过时。
当然,在某些地方可能存在这样的代码:
try {
var keys = Object.keys(input);
} catch {
// oops, input was a primitive; that unlocks the secret prize
giveUserAFreePuppy();
}
基本上,通过一个非常愚蠢的例子,我想说的是,对于某些代码的操作来说,跳过catch
块确实有问题的情况看起来是如此牵强,以至于为了获得一个不那么脆弱的Object.keys
函数,破坏这些代码似乎是一个很小的代价。
https://stackoverflow.com/questions/56449448
复制相似问题