JavaScript';s`delete`运算符未按预期工作

JavaScript';s`delete`运算符未按预期工作,javascript,Javascript,我有一个对象如下: var doc = { local: { username: 'admin', status: true, password: '$2a$08$81Kq7/59ZASHl5k9n5cNvOUSl/HYgpLKZjs66P/OJV8vw.nHW60Ta', lastname: 'admin', firstname: 'admin', email: 'admin@gmail.com', datetime_modified

我有一个对象如下:

var doc = {
  local: {
    username: 'admin',
    status: true,
    password: '$2a$08$81Kq7/59ZASHl5k9n5cNvOUSl/HYgpLKZjs66P/OJV8vw.nHW60Ta',
    lastname: 'admin',
    firstname: 'admin',
    email: 'admin@gmail.com',
    datetime_modified: 'TueAug30201623: 10: 56GMT+0530(IST)',
    datetime_created: 'MonAug29201622: 34: 12GMT+0530(IST)'
  },
  roles: [
    'ADMIN',
    'HR'
  ],
  GridOrder: [
    {
      _id: '57e507fce94094be085425c9',
      domainName: 'items'
    }
  ],
  _id: '57c46b0c12907af910167ff5',
  __v: 9
}
delete doc.GridOrder
现在我想从“doc”中删除属性“GridOrder”。 我尝试使用“删除”,如下所示:

var doc = {
  local: {
    username: 'admin',
    status: true,
    password: '$2a$08$81Kq7/59ZASHl5k9n5cNvOUSl/HYgpLKZjs66P/OJV8vw.nHW60Ta',
    lastname: 'admin',
    firstname: 'admin',
    email: 'admin@gmail.com',
    datetime_modified: 'TueAug30201623: 10: 56GMT+0530(IST)',
    datetime_created: 'MonAug29201622: 34: 12GMT+0530(IST)'
  },
  roles: [
    'ADMIN',
    'HR'
  ],
  GridOrder: [
    {
      _id: '57e507fce94094be085425c9',
      domainName: 'items'
    }
  ],
  _id: '57c46b0c12907af910167ff5',
  __v: 9
}
delete doc.GridOrder
也如以下所示:

delete doc['GridOrder']
但什么都没有发生。我也没有得到任何错误


如何从“文档”中删除“GridOrder”。有什么想法吗?

确认您有权访问正确的
对象
,只需使用
删除

var doc={
本地:{
用户名:“admin”,
状态:正确,
密码:“$2a$08$81Kq7/59ZASHl5k9n5cNvOUSl/HYgpLKZjs66P/OJV8vw.nHW60Ta”,
lastname:'管理员',
名字:'管理员',
电邮:'admin@gmail.com',
修改日期时间:“TueAug30201623:10:56GMT+0530(IST)”,
datetime_created:'MonAug29201622:34:12GMT+0530(IST)'
},
角色:[
“管理员”,
“人力资源”
],
GridOrder:[
{
_id:'57e507fce94094be085425c9',
域名:'items'
}
],
_id:'57c46b0c12907af910167ff5',
__v:9
}
删除doc.GridOrder;
console.log('doc.GridOrder',doc.GridOrder)
console.log(doc)
使对象属性可配置 在使用上述代码时,您的最小示例可以按预期工作

根据您的评论,
GridOrder
实际上是用定义的,默认情况下,它会创建不可配置(读取:不可删除)的属性

定义属性时,只需将
configurable:true
传递给
Object.defineProperty

var doc={
本地:{
用户名:“admin”,
状态:正确,
密码:“$2a$08$81Kq7/59ZASHl5k9n5cNvOUSl/HYgpLKZjs66P/OJV8vw.nHW60Ta”,
lastname:'管理员',
名字:'管理员',
电邮:'admin@gmail.com',
修改日期时间:“TueAug30201623:10:56GMT+0530(IST)”,
datetime_created:'MonAug29201622:34:12GMT+0530(IST)'
},
角色:[
“管理员”,
“人力资源”
],
_id:'57c46b0c12907af910167ff5',
__v:9
}
//除非将“可配置”设置为“true”,否则无法删除以这种方式定义的对象`
Object.defineProperty(
博士,
“GridOrder”,
{
可配置:true,//默认为`false`
价值:[
{
_id:'57e507fce94094be085425c9',
域名:'items'
}
]
}
);
log('doc.GridOrder:',doc.GridOrder);
log('delete doc.GridOrder:',delete doc.GridOrder:');

log('doc.GridOrder:',doc.GridOrder)您应该在严格模式下运行代码,在这种情况下,删除失败将导致运行时错误,从而更容易发现:

未捕获的TypeError:无法删除#(…)的属性“foo”`

如果你真的想,那也可以
捕捉它

在sloppy模式下,
delete
操作符在失败时将返回false,因此您可以检查其值以帮助了解发生了什么。根据MDN文档:

true
对于所有情况,除非属性是自己的不可配置属性,在这种情况下,
false
以非严格模式返回

请注意,属性不存在是返回
false
或失败的原因

一位评论员声称:

是否也是对象的原型链上存在的属性?在这两种情况下,删除都将失败


否,原型上的属性将导致
删除失败。它将成功(意味着不抛出,也不返回
false
),但不执行任何操作。

delete doc.GridOrder
应该可以工作。js也将它们称为“对象”,而不是“hashmaps”。这在使用上述代码时可以正常工作。a)
GridOrder
是否可能是使用对象定义的。defineProperty()
或b)
GridOrder
也是对象原型链上存在的属性?在这两种情况下,
delete
都将失败*看:@gfullam我认为你在这个问题上是对的。它被定义为“a”。有没有关于如何删除它的建议?。你也可以把上面的评论作为一个答案吗?@ArunMohan不知道你是如何定义它的,你可以做一些类似于
Object.defineProperty(doc,'GridOrder',{configurable:true})
,这将使你能够以你试图做的方式删除它。查看更多信息information@gfullam我的意思是,他在哪里调用
defineProperty
他应该将其更新为如果可能的话,而不是将“正确”答案作为“编辑”,你应该用新答案替换你以前的答案。@torazaburo
value
默认为未定义。