我要测试'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为什么不起作用?
答案 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));