hasOwnProperty不是Node.js中的函数吗?

时间:2018-12-30 13:37:51

标签: javascript node.js

我要测试'session'属性是否存在:

console.log(queryData)
console.log(typeof queryData)
if ('session' in queryData) {
  console.log('in')
}
else {
  console.log('not in')
}
if (queryData.hasOwnProperty('session')) {
  console.log('has own propety')
}

其结果是:

[Object: null prototype] { session: '0geBdiCsfczLQiT47dd45kWVN2Yp' }
object
in
/home/ubuntu/22.enmsg/cli/main.js:72
  if (queryData.hasOwnProperty('session')) {
                ^

TypeError: queryData.hasOwnProperty is not a function

hasOwnProperty为什么不起作用?

3 个答案:

答案 0 :(得分:1)

javascript中的大多数对象都是从Object继承的;可以有意地创建不继承任何内容的对象(即null),因此它们将不会具有您期望在该对象上生活的任何典型方法。

您通常会知道您的代码是否正在执行此操作,因此该对象可能是从另一个库传递给您的东西。

解决该错误的方法是显式调用Object上的hasOwnProperty并将其绑定到该对象,如下所示:

// Calls "hasOwnProperty" on queryData, even if queryData has
// no prototype:
console.log(Object.hasOwnProperty.bind(queryData)('session'));

编辑:只需进行编辑即可添加意见,这就是简单的真实检查if (queryData.session) {,这对您来说是更好的选择。当您要问的是“会话是否通过?”时,此检查的模糊性是强度。 -如果session为null,undefined,false,空字符串,或者键完全丢失,则答案显然是“ no”。

答案 1 :(得分:1)

https://stackoverflow.com/a/56488323/3121906中那样解析对象在技术上是可行的,但对于大型对象而言将是昂贵的。

https://stackoverflow.com/a/53978289/3121906很好,但是为什么不只使用call

Object.prototype.hasOwnProperty.call(queryData, 'session')

答案 2 :(得分:0)

最简单的解决方案是将null原型对象转换为标准javascript对象。您可以通过以下方式实现:

OBJjavascript = JSON.parse(JSON.stringify(objNullPrototype));