如何检查javascript中的Object键是否有从Object.prototype继承的对象

时间:2016-09-12 22:43:24

标签: javascript node.js

在节点6.x中,querystring模块将值解析为不从Object.prototype扩展的对象(虽然我不知道为什么要进行此更改)。

考虑到这一点,检查不包含值的查询参数的预期方法是什么,即有localhost:8080/some/path?keyonly名为express或koa的人,我想检查是否存在this.query.keyonly?我希望我能做this.query.hasOwnProperty('keyonly')这显然不起作用。有什么替代方案?

2 个答案:

答案 0 :(得分:1)

看起来您可以使用Object.hasOwnProperty.call( this.query, "keyonly" )。我设置了一些人为的测试用例,似乎有效:

const querystring = require("querystring");

const qs = "keyonly&keyvalue=valuekey";
const result = querystring.decode(url);

console.log(Object.hasOwnProperty.call( result, "keyonly" )); // true

&keyvalue=valuekey部分不是必须的,我只想验证它不会以某种方式干扰。

答案 1 :(得分:1)

有关更改背后的背景,请参阅原始PR here

一般情况下,您不应该依赖foo.hasOwnProperty(),因为hasOwnProperty可以轻松地重新分配给其他内容(因此querystring更改的原因 - 想象某人调用您的网络服务类似于http://example.org/foo?hasOwnProperty=hahacrashed)。

作为替代方案,您可以检查属性是否已定义,例如:

var qs = querystring.parse('foo=bar');
if (qs.foo !== undefined) {
  // ...
}

您还可以执行以下操作:

var qs = querystring.parse('foo=bar');
if (Object.hasOwnProperty.call(qs, 'foo')) {
  // ...
}

但这并不高效,因为hasOwnProperty()会执行额外的操作(现在querystring不需要)检查并使用效率较低的.call()