函数如何在Javascript / Node.js中内部表示?

时间:2018-11-23 20:59:27

标签: javascript node.js json

我最近发现JSON值只能存储字符串,数字,对象,数组,true,false或null。但是据我了解,JSON是Javascript在内部表示其对象的方式。如果大多数对象都具有方法(即函数),我不明白如何将Javascript对象存储为JSON。函数不是对象吗?我的JavaScript解释器(Node.js)认为函数到底是什么?它如何表示它们?谢谢!

1 个答案:

答案 0 :(得分:3)

JSON是字符串交换格式。它代表 JavaScript对象符号。它是在Javascript发明很久之后才发明的,与Javascript在内部存储数据的方式完全无关。

JSON通常用作交换格式或存储格式。一个人将获取一些Javascript数据,将其序列化为JSON格式,并获取结果字符串,并将其发送到另一进程或计算机,或将其保存在某种存储中。

然后,JSON的接收者可以将其解析回其本地数据。 JSON甚至用于将数据从Javascript程序发送到以另一种语言(Python,Ruby,C ++等)编写的程序。

函数与JSON完全没有连接。它们不存储在JSON中。它们在JS解释器内部的内部存储格式特定于任何解释器实现,并且外界无法访问或不受任何标准约束。这是任何Javascript引擎的实现细节,他们可以按自己的意愿进行操作,并且每个解释器都有自己的实现或变体。我不知道这对您的Javascript代码有什么影响。

  

我最近发现JSON值只能存储字符串,数字,对象,数组,true,false或null。但是据我了解,JSON是Javascript在内部表示其对象的方式。

那是不正确的。 JSON不是Java语言解释器内部用于其对象的东西。内部对象格式专用于特定的Java解释器,Java语言代码不可访问内部对象格式,在编写代码时也是如此。

  

如果大多数对象都有方法(即函数),我不明白如何将Javascript对象存储为JSON?

Javascript不使用JSON进行内部存储,因此与Javascript数据类型的内部实现完全无关。

  

不是对象吗?

是的,但是它们与JSON无关。

  

我的JavaScript解释器(Node.js)认为函数到底是什么,它如何表示它们?

每个JS解释器都有自己的内部函数实现/存储。它不受任何标准的约束,并且与您用Java编写代码的方式基本无关。


如果您出于某种原因想知道特定的Javascript实现如何在内部存储其变量,则必须查看源代码。来自Google的V8实现(用于Chrome和node.js)和来自Mozilla的Firefox实现都是开源的,您可以深入研究该代码(主要是C ++代码)。

这会变得非常复杂,因为某些数据类型(例如数组)会根据数组的结构以各种不同的格式存储。我相信V8至少有三种阵列存储格式,具体取决于阵列是压缩的还是稀疏的,还取决于阵列的整体大小。这是为了优化内存消耗和运行时性能。

与任意程序生成的属性相比,如果解释器从代码中获得有关正在使用的内容和未使用的内容的高级信息,则可以以高度优化的存储格式排列对象的类似属性。

仅供参考,您可以在https://chromium.googlesource.com/v8/v8.git处找到Google存储库,在https://hg.mozilla.org/处找到Mozilla代码。