为啥必须扩展一个对象才能删除它的成员?

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 将包括 IsFooEnabledDynExport 不包括。

【问题讨论】:

您应该发布所涉及的实际代码。 @Pointy 完成。我想,因为我只是在我链接的线程中使用了确切的代码,所以并不需要它。 可以通过 Object.freeze 冻结您要删除的对象吗?这在这里很有意义,将所有内容复制到一个新的(非冻结)对象中就可以了。 .toJSON 是怎么回事? jQuery 的.serializeArray() 的返回值不会有toJSON 方法,因此您传递给$.extend() 的对象也不会。 【参考方案1】:

.serializeArray() 方法返回一个数组(这可能并不奇怪)。当一个数组被序列化为 JSON 时,它最终看起来像这样:

[ value, value, value, ... ]

属性名称是数组中值的数字索引,它们是隐式:第一个值对应元素0,第二个值对应元素1,依此类推。 p>

那么,在这种表示方案中,没有地方可以放置没有数字名称的属性;也就是说,不属于“真实”数组的属性。这些属性在 javascript 中当然可以正常工作,但根本无法用 JSON 来表示它们。

通过使用$.exend() 将数组属性(连同您的“IsFooEnabled”属性)复制到一个新的普通对象,您可以解决这个问题,因为普通对象的 JSON 序列化方案明确包括所有属性名称。

【讨论】:

以上是关于为啥必须扩展一个对象才能删除它的成员?的主要内容,如果未能解决你的问题,请参考以下文章

为啥打字稿抱怨对象必须是扩展类型中的对象

python 为啥我修改列表一个元素会导致所有元素都被修改

为啥在删除引用指向它的对象后继续存在?

VSAN为啥声明磁盘选项,我的没有可用磁盘

为啥我们必须重载“<”运算符才能使用 is_permutation 并包含算法

为啥我不能只用前向声明 C++ 声明一个类的静态成员?