JSON.stringify(2)=="2"可能返回false是否正确?

650*_*502 27 javascript opera

我在Opera 11.50上发现了表达式

 JSON.stringify(2)
Run Code Online (Sandbox Code Playgroud)

返回一个对象

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

但仍然

alert(JSON.stringify(2) == "2")
Run Code Online (Sandbox Code Playgroud)

在Opera中显示"false"(使用时也是如此===).

这是一个错误还是什么?

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

Rob*_*low 7

这绝对看起来像一个bug.

从ECMAScript 5.1规范:

符合JSON.parse和JSON.stringify的实现必须支持本规范中描述的确切交换格式,而不对格式进行任何删除或扩展.这与RFC 4627不同,后者允许JSON解析器接受非JSON表单和扩展.

和:

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

这可能是因为它在某种程度上包装的字符串,其中还是有一个"JSONText"类型的对象typeofstring,但似乎很奇怪.

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

JSON.stringify(2) == "2" && JSON.stringify(2) === "2" && JSON.stringify(2) == 2 && JSON.stringify(2) !== 2;
true
Run Code Online (Sandbox Code Playgroud)

根据@ 6502(见评论),这是true在:
Chrome; Firefox的; IE9; iPad Safari; OsX Safari; N1 Android浏览器

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

  • 是的,我们不能只看代码,这很烦人.虽然我无论如何都不会被打扰.我没有提交错误报告,因为我不使用opera并且没有自己观察bug.我认为OP应该这样做. (2认同)