无法将 JavaScript window.screen 对象转换为字符串 [重复]
Posted
技术标签:
【中文标题】无法将 JavaScript window.screen 对象转换为字符串 [重复]【英文标题】:Unable to convert JavaScript window.screen object into string [duplicate] 【发布时间】:2019-11-04 22:20:42 【问题描述】:我想将window.screen
属性和值转换为字符串发送到后端。 (我可以提取每个属性的值,但很好奇为什么下面会失败)
不知道为什么JSON.stringify(window.screen)
返回""
。
请注意,手动创建的对象 orientation_
似乎可以将 JSON 转换为字符串。
进一步实验,我尝试复制对象,然后删除
__proto__
对象,认为这可能无法转换为字符串。但奇怪的是我无法删除任何键!
更新 #1:
根据以下提示,循环引用可能是问题所在...
在这里,我们看到变量a
具有对自身的循环引用。使用 Flatted(循环 JSON 解析器)我们看到 a
被转换为字符串,但 window.screen
仍然没有转换。
根据文档JSON.stringify(),函数被字符串化为null
。所以函数不是问题。
所以仍然不清楚这种行为的原因。
【问题讨论】:
【参考方案1】:JSON.stringify
要求对象属性是可字符串化的。乍一看,在控制台转储上展开window.screen
的一部分__proto__
,可以注意到每个列出的属性实际上都是getter 函数(如get availHeight: ƒ availHeight()
)并像往常一样产生结果。然而Object.keys(window.screen)
会生成空数组,这表明所有属性都不可枚举,因此无法通过JSON.stringify
找到内省对象。相比之下,您字符串化的 orientation
对象具有默认情况下可枚举的常规属性。
最简单的字符串化window.screen
,一个属性数量少的对象,就是制作它的副本,每次调用getter,然后字符串化副本:
var scr =
width: window.screen.width,
height: window.screen.height //...
JSON.stringify(scr); // --> ""width":1600,"height":900, ...
【讨论】:
其实函数不是问题,问题在于窗口对象的内部构造,在某些地方指的是自身(所谓的“循环结构”) @FlashThunder 同意,但是 OP 并没有尝试对具有自引用的window
对象进行字符串化,而是关于 window.screen
没有。
我猜 proto 也返回屏幕,它是屏幕对象的一部分。几年前我遇到过这个问题,找到了一个很好的解决方案,甚至可以对窗口对象进行字符串化,但是,现在找不到,也不记得解决方案了。
是的,可以使用 stringify 的替换函数来完成,该函数收集访问过的引用以避免再次循环,例如 this
谢谢@andy。我肯定会使用它作为一种解决方法,但仍然希望了解这种行为的原因。我用一个例子更新了我的问题,以表明循环引用不是导致这种行为的原因,并且函数字符串化为 null以上是关于无法将 JavaScript window.screen 对象转换为字符串 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
我无法将 javascript 文件应用到 Wordpress。我如何将脚本排入队列?