JSON.stringify(2) == "2" 可能返回 false 是不是正确?
Posted
技术标签:
【中文标题】JSON.stringify(2) == "2" 可能返回 false 是不是正确?【英文标题】:Is it correct that JSON.stringify(2) == "2" may return false?JSON.stringify(2) == "2" 可能返回 false 是否正确? 【发布时间】:2011-10-26 20:29:23 【问题描述】:我在 Opera 11.50 上发现了这个表达式
JSON.stringify(2)
返回一个对象
typeof
返回"string"
constructor.name
是 String
charCodeAt(0)
是 50
length
是 1
但还是
alert(JSON.stringify(2) == "2")
在 Opera 中显示“false”(使用 ===
也会出现同样的情况)。
这是一个错误还是什么?
我发现让它比较等于“2”的唯一方法是调用.substr(0)
(例如,即使添加一个空字符串仍然比较不同)。
【问题讨论】:
如果是这样,那么它是一个错误。可以肯定地说,尝试的简约样本会有所帮助。 有趣,== 2
产生 true
...
如果使用 x === "2" 是否也会返回 false ?
另一个有趣的事情是,错误发生在并且只有数字0
到9
。
多么有趣,我并不感到惊讶。歌剧疯了!
【参考方案1】:
这绝对看起来像一个错误。
来自 ECMAScript 5.1 规范:
JSON.parse 和 JSON.stringify 的符合要求的实现必须支持本规范中描述的确切交换格式,不得对该格式进行任何删除或扩展。这与 RFC 4627 不同,后者允许 JSON 解析器接受非 JSON 形式和扩展。
还有:
JSON.stringify 生成一个符合以下 JSON 语法的字符串。 JSON.parse 接受符合 JSON 语法的 String
可能是它以某种方式将字符串包装在“JSONText”类型对象中,该对象仍然具有string
的typeof
,但这看起来很奇怪。
我肯定认为在这种情况下以下实现是正确的:
JSON.stringify(2) == "2" && JSON.stringify(2) === "2" && JSON.stringify(2) == 2 && JSON.stringify(2) !== 2;
true
根据@6502(见评论)这是true
in:
铬合金;火狐; IE9; iPad的Safari; OsX Safari; N1安卓浏览器
ECMAScript 5.1 规范文档:http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
【讨论】:
实际上它可以在 chrome、firefox、IE9、iPad 和 OsX 版本的 Safari 甚至 N1 android 浏览器上正常运行。这只发生在个位数数字上的事实让我想知道这是否是因为某种优化技巧...... 你发帖a bug report了吗?我假设 stringify 算法的某个循环中存在错误,而不是优化技巧,但我们永远不会知道,因为 Opera 的源代码不公开。 是的,我们不能只查看代码,这很烦人。虽然我无论如何也不能打扰。我没有提交错误报告,因为我不使用opera,也没有自己观察到错误。我认为 OP 应该这样做。 我提交了一次关于渲染问题的报告(顺便说一下,看起来像是缓冲区溢出:我确信在这种情况下这是一个错误,因为渲染错误的是字母“m”和不是我自己画的东西)。我从来没有得到任何回复或信息请求(甚至没有“死掉”),所以我决定不再和他们浪费更多时间。我没有使用 Opera 进行浏览,我只是用它来检查我写的内容是否也可以在那里工作。在这种情况下我不确定,因为 js 通常很不合逻辑......(我最初认为这可能是与污染有关的问题)。 @6502:错误 ID 只是间接给出,作为提供后续信息的一种方式,这实际上只是凭借 JIRA 的工作方式。授予对单个错误的访问权限将有效地公开我们几乎所有的错误,我们已决定不这样做。但很多内部人士(包括我自己)反对它是私有的,这并不是什么秘密......以上是关于JSON.stringify(2) == "2" 可能返回 false 是不是正确?的主要内容,如果未能解决你的问题,请参考以下文章
JSON.stringify(2) == "2" 可能返回 false 是不是正确?