我正在尝试编写一个原型来确定字符串是否为空。它真的只是玩JS和原型,没什么重要的。这是我的代码:
String.prototype.IsEmpty = function() {
return (this === "");
}
注意我使用===
身份比较而不是==
相等。当我使用上面的定义运行函数时:
"".IsEmpty(); // false
如果我认为定义使用==
为:
String.prototype.IsEmpty = function() {
return (this == "");
}
新的def'n将会:
"".IsEmpty(); // true
我不明白为什么===
不起作用,因为""
与""
相同
答案 0 :(得分:10)
这是因为""
是一个字符串原语,但当你调用.IsEmpty()
时,它会隐式转换为String
个对象。
您需要在其上调用.toString():
String.prototype.IsEmpty = function() {
return (this.toString() === "");
}
有趣的是,这是特定于浏览器的 - Chrome中的typeof this
为string
。
正如@pst指出的那样,如果你要转换另一种方式并比较this === new String("");
它仍然无效,因为它们是不同的实例。
答案 1 :(得分:9)
===是身份(同一个对象; x是x **)。 ==是相等(相同的值; x看起来像y)。
让我们玩一些(Rhino / JS 1.8):
{} === {} // false
new String("") === new String("") // false
typeof new String("") // object
"" === "" // true
typeof "" // string
f = function () { return "f" };
"foo" === f() + "oo" // true
String.prototype.foo = function () { return this; };
typeof "hello".foo() // object -- uh, oh! it was lifted
那么,刚刚发生了什么?
String对象和字符串之间的区别。当然,应该使用相等比较(或.length)。
proof in the pudding,第11.9.6节讨论了===运算符算法