2011-08-14 32 views
27

我发现,在Opera 11.50表达JSON.stringify(2)==“2”可能返回false是否正确?

JSON.stringify(2) 

返回一个对象为其中

  • typeof返回"string"
  • constructor.nameString
  • charCodeAt(0)是50
  • length是1

但还是

alert(JSON.stringify(2) == "2") 

显示了歌剧 “假”(以及同样的情况,使用===)。

这是一个错误还是什么?

我发现使比较等于“2”的唯一方法是调用.substr(0)(例如,即使添加空字符串仍然会比较不同)。

+4

如果是这样的话它是一个错误。简单的样本尝试将有助于肯定地说。 –

+3

有趣的是,'== 2'产生'true' ... –

+0

确实看起来像一个bug,但是我发现这是真的:'JSON.stringify(2)== 2' – Sheepy

回答

7

这绝对看起来像一个错误。

从ECMAScript的5.1规范:

符合JSON.parse和JSON.stringify的实现必须支持无任何缺失或扩展的格式在本说明书中描述的确切交换格式。这与RFC 4627不同,后者允许JSON解析器接受非JSON格式和扩展。

和:

JSON.stringify产生符合以下JSON语法的String。 JSON.parse接受符合JSON语法的String

这可能是因为它在某种程度上包装的字符串,其中仍然有string一个typeof一个“JSONText”类型的对象,但似乎很奇怪。

我肯定会认为,在这种情况下,下面的实现是正确的:

JSON.stringify(2) == "2" && JSON.stringify(2) === "2" && JSON.stringify(2) == 2 && JSON.stringify(2) !== 2; 
true 

据@ 6502(见注释),这是在true
铬; Firefox的; IE9; iPad Safari; OsX Safari; N1的Android浏览器

ECMAScript的5.1规范文档:http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

+1

其实它可以在铬,Firefox,IE9,iPad和OsX版本的Safari甚至N1 Android浏览器上正常工作。这只发生在单位数字的事实让我怀疑是否是由于某种优化技巧... – 6502

+0

您是否发布了[错误报告](https://bugs.opera.com/wizarddesktop/)呢?我并不是一个优化技巧,而是假定stringify算法中的某个循环中存在一个错误,但是我们永远不会知道,因为Opera的源代码不是公开可用的。 – user123444555621

+2

是的,很烦人,我们不能只看代码。尽管我无论如何都不能打扰。我没有提交错误报告,因为我不使用歌剧,也没有亲自观察错误。我认为OP应该这样做。 –

相关问题