字符串上的JavaScript身份运算符

时间:2009-10-21 21:12:54

标签: javascript

我正在尝试编写一个原型来确定字符串是否为空。它真的只是玩JS和原型,没什么重要的。这是我的代码:

String.prototype.IsEmpty = function() {
  return (this === "");
}

注意我使用===身份比较而不是==相等。当我使用上面的定义运行函数时:

"".IsEmpty(); // false

如果我认为定义使用==为:

String.prototype.IsEmpty = function() {
  return (this == "");
}

新的def'n将会:

"".IsEmpty(); // true

我不明白为什么===不起作用,因为""""相同

2 个答案:

答案 0 :(得分:10)

这是因为""是一个字符串原语,但当你调用.IsEmpty()时,它会隐式转换为String个对象。

您需要在其上调用.toString():

String.prototype.IsEmpty = function() {
  return (this.toString() === "");
}

有趣的是,这是特定于浏览器的 - Chrome中的typeof thisstring

正如@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节讨论了===运算符算法