JavaScript (strict) 相等性检查新建的字符串对象 "a"

3

ECMAScript语言规范11.9.1 等于操作符(==)中有如下说明:

注3:等于操作符并非总是具有传递性。例如,可能存在两个不同的字符串对象,它们各自代表相同的字符串值;每个字符串对象都会被等于操作符视为等于该字符串值,但这两个字符串对象彼此之间却不相等。例如:

  • new String("a") == "a""a" == new String("a") 都是true
  • new String("a") == new String("a")false

但在11.9.6 严格等式比较算法中:

7. 如果 xy 引用同一对象,则返回true。否则,返回false

但是,在jsc中不是这样的。

new String("a")===new String("a")

这是真的。

那是一个jsc.exe错误吗?还是它们是同一个对象?为什么?


3
好的,似乎jsc存在问题。也许它像Java一样进行了某种字符串池化操作。不过不确定您期望什么样的答案。您最好向这个工具的维护者报告。 - Felix Kling
1
我猜测jsc.exe是微软的编译器,显然在编译可执行文件时它并不遵循标准,所以正如Felix所说,我们对此无能为力,你将不得不报告它。 - adeneo
或许有一个清晰的解释,我没有看到。 - Aaaaaaaa
1
你们说得对。我用jsfiddler试了一下,确实是错误的。谢谢! - Aaaaaaaa
1
jsc编译器相当原始,不应使用(内部使用各种反射,不利用DLR,不能使用泛型且未得到维护)。您可以尝试其他在.NET上实现的JS,如Jurassic或Jint。此外,您可以使用JavaScript.NET与V8进行交互。 - aikeru
显示剩余2条评论
1个回答

0

在 JavaScript 中,运算符 === 如果类型和值相等则返回 true。所以它返回 true 是正确的,因为它们都是 String 对象,并且它们的值都是 "a"。

请查看文档http://www.w3schools.com/js/js_comparisons.asp


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接