Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JSON.parse、JS类型转换和恢复程序_Javascript_Json_Casting - Fatal编程技术网

Javascript JSON.parse、JS类型转换和恢复程序

Javascript JSON.parse、JS类型转换和恢复程序,javascript,json,casting,Javascript,Json,Casting,抱歉,如果这是一个愚蠢的问题,这是我的第一个JS项目 我正在尝试使用JSON反序列化JS中的自定义对象。问题是,JSON.parse()不会将对象作为其原始类型返回。由于直接将返回的对象强制转换为所需的类型似乎是不可能的,这就给我留下了“恢复器”选项 我是不是遗漏了什么?JSON的全部目的不是为了避免编写自定义方法来序列化和反序列化对象吗?如果我必须编写自己的方法“恢复”我的对象,那么使用JSON有什么意义呢?JSON是一种原始数据格式。它非常原始。它支持字典(aka.javascript对象、

抱歉,如果这是一个愚蠢的问题,这是我的第一个JS项目

我正在尝试使用JSON反序列化JS中的自定义对象。问题是,JSON.parse()不会将对象作为其原始类型返回。由于直接将返回的对象强制转换为所需的类型似乎是不可能的,这就给我留下了“恢复器”选项


我是不是遗漏了什么?JSON的全部目的不是为了避免编写自定义方法来序列化和反序列化对象吗?如果我必须编写自己的方法“恢复”我的对象,那么使用JSON有什么意义呢?

JSON是一种原始数据格式。它非常原始。它支持字典(aka.javascript对象、哈希、关联数组)、数组、字符串、数字、布尔值和null。就这样。它没有做更多工作的原因是这些原语与语言无关,几乎所有编程语言都内置了处理这些类型数据的工具

如果你有其他的符号,比如“类”,那么突然之间,它就和特定的语言或代码绑定在一起,失去了它的广泛性和通用性

因此,将JSON视为简单的原始数据。JSON不是实例编组或完整的对象序列化。因此,如果您打算序列化从构造函数实例化的JS对象,那么您需要编写“恢复器”

这是一种方法:

只需将普通数据对象(JSON.parse()的结果)传递给所选构造函数的调用。从那里你可以做很多事情把它的值读入你的新对象

Javascript没有像在ruby中那样使用
Marhsal.dump(obj)
来编组整个对象的标准方法


编辑:最后一个要点

Javascript对象没有您在其他语言中想象的“类型”。Javascript对象只是键/值对的字典。当您执行类似于
newsomeclass()
的操作时,您会得到一个新对象,该对象具有一个特殊的
prototype
属性,该属性指向
SomeClass
函数对象的
prototype
属性。一个对象是否是某个类的实例,并不像你乍一看所想的那样是一个明确的问题

相反,您可能会问“什么是我的构造函数对象?”或“我的原型链中有哪些对象?”

所以,如果您想在JSON中传递“type”,它存储为字符串,那么您将如何存储对原型对象的引用?也许原型对象根本不在全局范围内命名,并且只能通过闭包使用?然后,当您将其写入字符串时,您根本无法再引用该原型对象


关键是javascripts是对象实例化的典型方法,结合了它基于闭包的词法作用域,以及对象的值更像C指针而不是文字值这一事实,使将对象完全序列化到VM外部的位置变得非常困难。

+1对于这个有趣的问题有一个清晰而简单的答案。清晰而简单,直到我用我的编辑解释javascript“键入”为止:)请参阅我关于使用
恢复器的答案。
[此处][1]。[1]:
new Book({
  title: "One Thousand and One Nights",
  author: "Scheherazade"
});