无法将 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。我如何将脚本排入队列?

无法将javascript添加到wordpress中的divi页脚

无法将 javascript 文件作为电子邮件附件发送

Javascript 无法将现有函数应用于 onkeyup