有人知道更改的原因吗?从将原语传递给Object.keys
时引发错误,到将原语强制转换为对象并返回结果都是如此?
我不确定是否有人会期望Object.keys('abc')
返回[0, 1, 2]
,而且这似乎违反了“不要破坏网络”的主要指示。如果某些网站有代码将try()中的对Object.keys
的调用包装起来,以处理错误地传递原语的调用者?
这就是为什么我觉得变革背后必须有强有力的理由。如果有任何人对此有任何信息,我将非常感兴趣。
答案 0 :(得分:1)
我在esdiscuss上找不到关于此决定的任何提及,因此我只能提供自己的观点。
正如评论员指出,这是ES 2015更大趋势的一部分,以允许更广泛地使用非对象。在ES 2015规范中,短语“在上一版本中,非对象参数总是导致抛出TypeError
”,它引用了Object
上的10种不同方法。
其中之一是,此更改使Object.keys
的行为与for-in
循环的行为保持一致,该循环一直能够对基元进行操作。考虑到规范已经要求在Object.keys
和for-in
之间进行匹配的顺序,并要求使用同一组有效操作数,这似乎不足为奇。
此更改似乎对现有代码几乎无害,同时大大降低了Object.keys
的脆弱性。即使在尝试捕获的情况下,也很难想象成功执行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
函数。