在javascript中,检查字符串之间是否相等的正确方法是什么?
- 有没有理由不使用==?
- @肯德里克——当然。它的类型强制系统可以是难以置信的非故意的,并且可以使错误很容易被忽略(看起来是对的,但可能是非常错误的)
- @肯德里克——例如,因为{} =="[object Object]"的计算结果为真。
- 有点恼人的是,String().equals()不是JS中的一种方法。
- @肯德里克:由于JS代码反射,$$=='function $$(selector, [startNode]) { [Command Line API] }'是正确的。
- @Alexandermills为什么?
alwaysuntil you fully understand the differences and implications of using the ==and ===operators,use the ===operator since it will save you from smokened(non obligent)bugs and wtfs.由于类型内部强制,"常规"==运算符可能会产生非常意外的结果,因此使用===始终是推荐的方法。
为了深入了解这一点,以及JavaScript的其他"好与坏"部分,请阅读Douglas Crockford先生及其著作。有一个伟大的谷歌技术讲座,他总结了很多好的信息:http://www.youtube.com/watch?V=HqvTijbZok
更新:
你不知道凯尔·辛普森的JS系列非常棒(而且可以免费在线阅读)。本系列文章深入到了人们普遍误解的语言领域,并解释了克罗克福德建议你避免的"坏部分"。通过理解它们,你可以正确地利用它们并避免这些陷阱。
"升级"本书包括一节关于平等的内容,其中特别总结了何时使用松散(==和严格(===运算符:
To boil down a whole lot of details to a few simple takeaways, and help you know whether to use == or === in various situations, here are my simple rules:
-
If either value (aka side) in a comparison could be the true or false value, avoid == and use ===.
-
If either value in a comparison could be of these specific values (0, "", or [] -- empty array), avoid == and use ===.
-
In all other cases, you're safe to use ==. Not only is it safe, but in many cases it simplifies your code in a way that improves readability.
我仍然向那些不想花时间真正理解javascript的开发人员推荐Crockford的演讲,这对于偶尔使用javascript的开发人员来说是个好建议。
- 当您确定两个操作数都是字符串时(例如,在使用if (typeof foo =="string")时),就不需要这样做。
- @马塞尔——你是对的,但最好总是使用===操作符,而不必担心"我真的,完全,100%确定==会表现得像我想的那样吗?"
- 在某些情况下,它总是一个字符串,这使得===及其(极小的)性能影响不必要。一个是typeof,它保证返回一个字符串。另一个让我头晕目眩的例子是,当你在一个对象中迭代一组键时——当然,这也关系到你将它与什么进行比较。这些情况下,你不必"思考",因为它是有保证的。我认为对于初学者来说,使用===并不是一个坏主意,但是如果你有经验并且很了解规格,你可以放弃使用===而不冒任何风险。
- 还有一些情况下类型强制是件好事。例如,将某个表单元素的用户输入与某个数字进行比较时,该表单元素始终以字符串形式检索。还有其他的。我认为把==和类型强制当作某种邪恶的bug来对待是不好的做法。
- @STW–Crockford不是javascript的alpha和omega的一个例子是,他建议不要使用一元递增/递减(++/--)。
- 不得使用++或--或单线if/else语句或continue或new运算符或克罗克福德认为"有害"的任何其他完全合法的代码实践。当然,即使他们的陷阱被很好地理解,也从来没有考虑过使用eval或with。你看到下一个版本的JS了吗?更严格的语法和一些助手函数,其中一些已经浮动多年,是我们在这段时间之后得到的所有东西。语法根本没有发展。如果克罗克福德是幕后黑手,那就是件坏事。
- 哦,是的,但这不依赖于堆栈溢出。但是你的修正改善了这个答案,所以+1。
- 克罗克福德对他的想法有着非常好的想法和合理的理由,但到了最后,你是程序员。从专家那里听取你的雪茄吸烟方法建议总是很好的,但别忘了为自己着想。如果这适合你的情况,向后抽。
- 我认为这对弦来说并非100%正确。我认为其中一个不区分大小写,而另一个…
- @Coffeeadedict——JSfiddle中的快速测试似乎不同意。它们都区分大小写:jsfiddle.net/st2eu
如果您知道它们是字符串,那么就不需要检查类型。
但是,请注意,字符串对象将不相等。
1
| new String("a") == new String("a") |
将返回false。
调用valueof()方法将其转换为字符串对象的基元,
1
| new String("a").valueOf() == new String("a").valueOf() |
将返回真
- 你是说new String("a") == new String("a")会返回假?那么new String("a") === new String("b")呢?
- 感谢JSS,两个字符串对象永远不会相等,除非它们是同一个对象,而不管值是多少。
- @JSS:另外,new String("a") =="a"是真的(但不适用于===),因为左侧将转换为原始字符串值。
- @JSS:new String("a") == new String("a")、new String("a") === new String("b")、new String("a") === new String("a")都将返回false,因为您处理的是对String类对象的引用,而不是String类型的原语。
- 只是为了让任何读过它的人明白这一点。new String(foo)创建一个字符串对象,String(foo)将foo转换为字符串原语。
- @Fakerainbrigand-像泥一样清澈,但这就是Javascripts的目的,不是吗?
只需在答案中添加一个:如果所有这些方法都返回false,即使字符串看起来是相等的,也可能在一个字符串的左右两侧都有空白。所以,只需在字符串的末尾放一个.trim(),然后比较:
1 2 3 4
| if(s1.trim() === s2.trim())
{
// your code
} |
我花了很多时间想弄清楚是怎么回事。希望这对某人有帮助!
- 谢谢。但这对我来说很奇怪,因为我确定左边或右边没有空格,但这仍然是解决我问题的唯一方法。可能与字符串的内部表示有关?
- 谢谢!!@niko,很可能是因为肉眼看不见的零宽度空格字符。参见en.wikipedia.org/wiki/zero-width_space。尽管这个角色有它的目的,但许多开发人员对它的存在感到不满!
- 谢谢,这让我很沮丧,因为我的if中的平等检查失败了,但是在调试时检查时没有看到空白。
是什么让我想到这个问题的,是padding和white-spaces。
检查我的情况
1 2
| if (title ==="LastName")
doSomething(); |
标题是" LastName"。
so maybe you have to use trim function like this
1
| var title = $(this).text().trim(); |
- 同样感谢,我在打字稿中使用了.toString().trim()。
除非你真的知道强制是如何工作的,否则你应该避免使用==,而是使用身份操作符===。但是你应该读这个来理解它是如何工作的。
如果您使用==,您可以让语言为您执行某种类型的强制,例如:
1 2 3
| "1" == 1 // true
"0" == false // true
[] == false // true |
正如道格拉斯·克罗克福德在书中所说:
It’s always better use the identity operator.
- 虽然这个链接可以回答问题,但最好在这里包含答案的基本部分并提供链接以供参考。如果链接页发生更改,则仅链接答案可能无效。
- {}==""给了我Unexpected token ==正确的方法是什么?
实际上有两种方法可以在javascript中生成字符串。
var str = 'Javascript';这将创建一个原始字符串值。
var obj = new String('Javascript');这将创建包装对象类型为String。
typeof str // stringtypeof obj // object
因此,检查相等性的最佳方法是使用===运算符,因为它检查两个操作数的值和类型。
如果您想检查两个对象之间是否相等,那么使用String.prototype.valueOf是正确的方法。
1
| new String('javascript').valueOf() == new String('javascript').valueOf() |
字符串Objects可以使用这个hack JSON.stringyfy()进行检查。
1 2 3 4
| var me = new String("me");
var you = new String("me");
var isEquel = JSON.stringify(me) === JSON.stringify(you);
console.log(isEquel); |
在测试期间,我想出了一个替代方案。您可以在字符串原型上使用函数。
1 2 3 4 5 6 7 8 9 10
| String.prototype.betwenStr = function(one){
return JSON.stringify(new String(this)) === JSON.stringify(new String(one));
}
//call it
"hello world".betweenStr("hello world"); //returns boolean
//value |
在Chrome浏览器中工作正常
- 问题是如何检查"hello world"="hello world",而不是如何检查"hello world"是否是字符串。
- 这太傻了。你已经创建了一个rube goldberg版本的==。