Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Object.keys(x)`会扔吗?_Javascript_Node.js - Fatal编程技术网

Javascript Object.keys(x)`会扔吗?

Javascript Object.keys(x)`会扔吗?,javascript,node.js,Javascript,Node.js,我怎么能确定 Object.keys(x)是否会抛出错误 其中x是任何东西。根据文档 在ES5中,如果此方法的参数不是对象(原语), 那么它将导致一个类型错误。在ES2015中,将使用非对象参数 被强迫成为一个对象 我最终决定添加我自己的答案,因为人们在这里没有给你最简单、最完整的答案: Object.keys(x)会抛出吗 是,它可以抛出。在ES5中,如果x不是对象,它将抛出。您可以在IE11或任何较早的浏览器中自己验证这一点 在ES2015中,如果x是undefined或null,它将抛出。

我怎么能确定

Object.keys(x)
是否会抛出错误

其中x是任何东西。

根据文档

在ES5中,如果此方法的参数不是对象(原语), 那么它将导致一个类型错误。在ES2015中,将使用非对象参数 被强迫成为一个对象


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

Object.keys(x)
会抛出吗

是,它可以抛出。在ES5中,如果
x
不是对象,它将抛出。您可以在IE11或任何较早的浏览器中自己验证这一点

在ES2015中,如果
x
undefined
null
,它将抛出。其他非对象值(如数字、字符串或布尔值)将强制为对象,然后返回空数组(因为强制对象没有可枚举属性)

要求将x强制为对象(如果可能)。这意味着它将成功地将一些东西强制为对象,例如数字、布尔值、字符串,但不会
null
undefined
,因此即使在ES2015中,
object.keys(null)
object.keys(undefined)
仍将抛出Chrome v62中测试的结果


所以,如果你真的想安全,你可以在你的代码周围放一个
try/catch
,或者测试一下
x!==调用
object.keys()
之前,null&&typeof x==“object”

或者,使用
try/catch

function safeKeys(val) {
    try {
        return Object.keys(val);
    } catch(e) {
        return [];
    }
}
try/catch
可能最终会更安全,以防不完美的实现在您意想不到的情况下抛出


如何确定
Object.keys(x)
是否会抛出错误

您可以阅读相关规范,了解应该执行哪些实现。而且,您可以测试相关的实现,以了解它们实际上做了什么。如果你真的想知道,你必须测试具体的实现。在一个不完美的世界里,如果你想知道这样一件事,绝对肯定有点偏离常规,你必须自己测试一下,看看它们是如何表现的

在这个例子中,一个简单的测试用例需要大约2分钟的时间来编写代码并在一些相关的环境中运行。这个案例比平常稍微复杂一些,因为规范和实现随着时间的推移而改变(不同于ES5到ES2015)



但是,实际上讲,如果您知道可能会得到一个非对象,那么只进行防御性编码可能更简单,在这种特殊情况下,因为您有一个规范和实现的移动目标,建议您只进行防御性编码,而不管实现的这一方面如何。然后,您不必确定在给定坏数据时底层平台的行为。只需预先过滤掉坏数据,使其具有您希望在这种情况下具有的行为。

Object.keys(null)
对象键(未定义)您尝试过随机类型吗?请阅读文档!您可以在Object()中包装x,例如:
Object.keys(Object(x))如果x未定义或为null或其他任何值,它不会抛出错误。我用
对象验证了这一点。键(5)
IE11将抛出,当前的Chrome v61将强制一个对象,从而返回一个空数组。我没有ES5版本的Chrome、Firefox或Safari来尝试这一点。”…如果你真的想知道,你必须测试。”确保测试所有平台上所有浏览器所有版本的所有次要版本,用于所有可能的用途。如果你能在2分钟内完成,我会很感动的。或者像大多数生产环境那样,依靠最好的可用数据,在极为罕见的未知实现错误情况下进行处理。现实世界。@rockstar-OP问“我如何确定?”所以我回答这个问题。是的,在使用它们之前测试所有可能的特性是不实际的,但是如果您不打算防御性地编写代码,因此您的代码需要知道,那么您必须进行测试,以知道您是否可以不防御性地编写代码。对我来说,如果根据以前的经验我还不确定,那么我会防御性地编写代码。坦率地说,它比测试所有相关环境要快得多。我更新了我的答案,添加了这方面的信息。你的第一个
safeKeys
并没有防御性地修改你向我提出质疑的bug或未来的规范更改。现在你在含糊其辞了。如果根据以前的经验还不能确定,您可以说您编写了防御代码。你以前的经验是一个任意的指标,本质上就是我建议的。我有一种感觉,你实际上是在我一直描述的现实中运作的,但对StackOverflow来说是学究式的。不管怎样“如果你的结论是对的,那么这只是一场毫无意义的辩论。”@rockstar-对不起,但我不知道如何编写代码来防御未来所有可能的规范更改,我并没有试图这么做。第一个
safeKeys()
只是确保传递的是一个非空对象,这就是
object。keys()
一直被设计用于操作和做一些有用的事情。它试图完全避免
Object.keys()
在给定非对象时的行为。这是为这个函数编写防御代码的一种非常合理的方法。防御措施是针对当给定一个非对象时它的行为。@rockstar-至于“你在哪里”,你的回答没有提供关于如何在这里编写解决方案的建议,所以我不知道你是如何说我达到了与你相同的点。答案中根本没有定义编码解决方案的“您在哪里”。阅读我们的两个答案的人也不会认为他们说的是几乎相同的东西。
function safeKeys(val) {
    try {
        return Object.keys(val);
    } catch(e) {
        return [];
    }
}