为啥必须扩展一个对象才能删除它的成员?
Posted
技术标签:
【中文标题】为啥必须扩展一个对象才能删除它的成员?【英文标题】:Why must you extend an object in order to delete a member of it?为什么必须扩展一个对象才能删除它的成员? 【发布时间】:2017-03-04 03:05:44 【问题描述】:我遇到了一个问题,JSON.stringify
没有保留我添加到使用 $("#myForm").serializeArray();
创建的对象的属性。
我发现了这个 SO 线程:JSON.stringify is ignoring object properties
该解决方案对我有用——我创建了一个扩展我的mySerializedFormArray
对象的新对象,然后我可以调用delete newObj.toJSON
。
如果我只是简单地调用delete mySerializedFormArray.toJSON;
,我添加的新属性在字符串化过程中仍然会被删除。
为什么当我扩展对象时它会起作用?
编辑:
var DynExport = $('#frmDynExport').serializeArray();
DynExport.IsFooEnabled = $("#hdnFooFlag").val();
var newObj = $.extend(, DynExport);
delete newObj.toJSON;
var someOtherVar = JSON.stringify(newObj);
DynExport = JSON.stringify(DynExport);
someOtherVar
将包括 IsFooEnabled
,DynExport
不包括。
【问题讨论】:
您应该发布所涉及的实际代码。 @Pointy 完成。我想,因为我只是在我链接的线程中使用了确切的代码,所以并不需要它。 可以通过 Object.freeze 冻结您要删除的对象吗?这在这里很有意义,将所有内容复制到一个新的(非冻结)对象中就可以了。.toJSON
是怎么回事? jQuery 的.serializeArray()
的返回值不会有toJSON
方法,因此您传递给$.extend()
的对象也不会。
【参考方案1】:
.serializeArray()
方法返回一个数组(这可能并不奇怪)。当一个数组被序列化为 JSON 时,它最终看起来像这样:
[ value, value, value, ... ]
属性名称是数组中值的数字索引,它们是隐式:第一个值对应元素0,第二个值对应元素1,依此类推。 p>
那么,在这种表示方案中,没有地方可以放置没有数字名称的属性;也就是说,不属于“真实”数组的属性。这些属性在 javascript 中当然可以正常工作,但根本无法用 JSON 来表示它们。
通过使用$.exend()
将数组属性(连同您的“IsFooEnabled”属性)复制到一个新的普通对象,您可以解决这个问题,因为普通对象的 JSON 序列化方案明确包括所有属性名称。
【讨论】:
以上是关于为啥必须扩展一个对象才能删除它的成员?的主要内容,如果未能解决你的问题,请参考以下文章