首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么在ES2015中将Object.keys更改为强制将原语转换为对象?

为什么在ES2015中将Object.keys更改为强制将原语转换为对象?
EN

Stack Overflow用户
提问于 2019-06-05 02:29:10
回答 1查看 91关注 0票数 6

有人知道从将原语传递给Object.keys时抛出错误到静默地将原语强制到对象并返回结果的变化背后的原因吗?

我不确定是否有人会期望Object.keys('abc')返回[0, 1, 2],而且它似乎违反了“不要破坏网络”的首要指令。如果某些网站的代码将对Object.keys的调用包装在try/catch中,以处理调用者错误地传递原语,该怎么办?

这就是为什么我觉得这种变化背后一定有很强的理由。如果有人有关于这方面的信息,我会非常感兴趣。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-06 02:01:48

我找不到任何关于这个决定的内容,所以我只能提供我自己的观点。

正如一位评论员指出的那样,这是ES 2015更大趋势的一部分,允许更广泛的非对象输入。在ES 2015规范中,短语“在以前的版本中,非对象参数总是导致抛出TypeError”出现在Object上的10个不同的方法中。

首先,此更改使Object.keys的行为与for-in循环的行为一致,后者始终能够对原语进行操作。考虑到规范已经要求Object.keysfor-in之间的顺序匹配,因此要求相同的有效操作数集似乎并不奇怪。

这种改变看起来几乎和对现有代码一样无害,同时大大降低了Object.keys的脆弱性。即使在使用try-catch的情况下,也很难想象成功执行Object.keys会导致实际问题。我可以很容易地想象这样的代码:

代码语言:javascript
运行
复制
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代码过时。

当然,在某些地方可能存在这样的代码:

代码语言:javascript
运行
复制
try {
    var keys = Object.keys(input);
} catch {
    // oops, input was a primitive; that unlocks the secret prize
    giveUserAFreePuppy();
}

基本上,通过一个非常愚蠢的例子,我想说的是,对于某些代码的操作来说,跳过catch块确实有问题的情况看起来是如此牵强,以至于为了获得一个不那么脆弱的Object.keys函数,破坏这些代码似乎是一个很小的代价。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56449448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档