我想将window.screen
属性和值转换成一个字符串发送到后端。 (我可以提取每个属性的值,但很想知道为什么下面的失败)
不确定为什么 JSON.stringify(window.screen)
返回 "{}"
。
请注意,手动创建的对象 orientation_
似乎可以很好地将 JSON 转换为字符串。
- 进一步试验,我尝试复制对象,然后删除
__proto__
对象,认为这可能无法转换为字符串。但奇怪的是我无法删除任何键!
更新#1:
根据以下提示,循环引用可能是问题...
在这里我们看到变量 a
有一个对自身的循环引用。使用Flatted (循环 JSON 解析器)我们看到 a
被转换为 String 但 window.screen
仍然没有转换。
基于文档 JSON.stringify() , 函数被字符串化为 null
。所以函数不是问题。
所以仍然不清楚这种行为的原因。
JSON.stringify
要求对象属性可字符串化。乍一看,在控制台转储上展开 window.screen
的 __proto__
部分,可以注意到每个列出的属性实际上都是 getter 函数(如 get availHeight: ƒ availHeight ()
) 并像往常一样产生结果。但是 Object.keys(window.screen)
生成空数组,表明所有属性都不可枚举,因此它们无法通过 JSON.stringify
内省(introspection)对象找到。相比之下,您字符串化的 orientation
对象具有默认情况下可枚举的常规属性。
stringify window.screen
是一个属性很少的对象,最简单的方法是每次都调用 getter 创建它的副本,然后 stringify 复制:
var scr = {
width: window.screen.width,
height: window.screen.height //... }
JSON.stringify(scr); // --> "{"width":1600,"height":900, ...