当前位置: 首页 > 面试题库 >

为什么JSON.stringify不能序列化不可枚举的属性?

松高爽
2023-03-14
问题内容

我正在使用JavaScript将对象序列化为JSON字符串,

我注意到只有可枚举的对象属性才被序列化:

var a = Object.create(null,{
  x: { writable:true, configurable:true, value: "hello",enumerable:false },
  y: { writable:true, configurable:true, value: "hello",enumerable:true }
});
document.write(JSON.stringify(a)); //result is {"y":"hello"}

[ 笔 ]

我想知道为什么会这样?我已经通过搜索MDN页面中,json2解析器文档。我找不到任何地方记录此行为。

我怀疑这是使用仅通过[[enumerable]]属性的for... in循环(至少在情况下)的结果。可以使用类似的方法同时返回可枚举和不可枚举的属性。不过,这可能会导致序列化(由于反序列化)。json2``Object.getOwnPropertyNames

tl; dr

  • 为什么JSON.stringify只序列化可枚举的属性?
  • 此行为记录在任何地方吗?
  • 我如何自己实现序列化不可枚举的属性?

问题答案:

它在ES5规范中指定。

如果Type(value)为Object,并且IsCallable(value)为false

If the [[Class]] internal property of value is "Array" then

    Return the result of calling the abstract operation JA with argument value.

Else, return the result of calling the abstract operation JO with argument value.

因此,让我们看一下JO。这是相关的部分:

令K为内部字符串列表,该字符串列表由 [[Enumerable]]属性为true的value所有自身属性
的名称组成。字符串的顺序应与Object.keys标准内置函数所使用的顺序相同。



 类似资料:
  • 问题内容: 最近,我一直在进行相当多的JSON解析,并在Node.js和浏览器中传递Javascript,并遇到了这个难题。 我使用构造函数创建的任何对象都无法通过JSON.stringify进行完全序列化,除非我单独初始化构造函数中的所有值!这意味着我的原型在设计这些类时实际上变得毫无用处。 有人可以阐明为什么以下内容没有按我期望的那样进行序列化吗? 怎么了: a_string == {“ in

  • 问题内容: 在Java 5及更高版本中,您具有foreach循环,该循环可以神奇地实现任何实现的对象: 但是,仍然没有实现,这意味着要迭代一个,您必须执行以下操作: 有谁知道为什么仍然不执行? 编辑: 为澄清起见,我不是在谈论枚举的语言概念,而是在Java API中称为“ 枚举 ” 的Java特定类。 问题答案: 枚举没有被修改为支持Iterable,因为它是一个接口,而不是一个具体的类(例如Ve

  • 问题内容: 我正在创建一个可能更改语言的简单程序,并且将字符串数组中的myBundle.properties文件中的属性列表转换为。 这是文件myBundle.properties: 这是Java代码: 但是,令人惊讶的是,当我执行程序时,它以随意的顺序返回了字符串。为什么枚举有这种奇怪的行为? 问题答案: 我不知道ResourceBundle类的确切详细信息,但是在查看您的代码示例时,似乎它具有

  • 问题内容: 我想知道为什么在Java语言中a 不能扩展。 我不是在谈论一个延伸的(这不能做,因为Java没有多重继承,而Š隐含延长),但一类的以只添加额外的方法,而不是额外的枚举值。 就像是: 要这样使用: 因此,有人可以对此限制提供理由(或将我指向正确的JLS部分)吗? 问题答案: 我认为 他们这样做 的答案来自以下问题: 在您的示例中,如何实例化MyClass?用户永远不会(通过)显式实例化枚

  • 问题内容: 可序列化属性定义为: 设置元素的属性时,它将反映在诸如的序列化查询中,并且您可以看到DOM Inspector中的更改。 当您获得元素的父节点的时,返回的html字符串将包含所有可序列化的属性,作为其对应的属性 我制作了一个页面,看起来好像它已经可靠地打印了Chrome和Firefox 中该元素的所有可序列化属性的表://jsfiddle.net/tEVLp/16/。自定义属性从不可序

  • 我正在编写一个简单的游戏,在其中我使用一个枚举,CommandManager,来存储关于可能的命令以及每个命令的作用的信息。此枚举的主要目的是能够打印出可用命令的菜单,以及用于检查输入并执行与该输入相关的操作。我的问题在于第二次使用,我使用switch语句根据用户的输入确定用户想要做什么。当尝试使用枚举的属性(通过getter方法)作为案例标签时,我遇到了一个编译错误。提供的错误消息是,大小写表达