总是直到你完全理解的差异和使用的影响==
和===
运营商,使用===
运营商,因为它可以使你免于晦涩(非显而易见性)的错误和 WTFs。由于内部存在类型强制,“常规” ==
运算符可能会产生非常意外的结果,因此始终建议使用===
。
为了了解这一点以及 Javascript 的其他 “好与坏” 部分,请阅读 Douglas Crockford 先生及其工作。在 Google 技术讲座中,他总结了很多很好的信息: http : //www.youtube.com/watch?v=hQVTIJBZook
更新:
凯尔 · 辛普森(Kyle Simpson) 撰写的 “ 您不知道 JS”系列非常出色(可在线免费阅读)。该系列文章深入介绍了该语言中经常被误解的部分,并解释了克罗克福德建议您避免的 “不良部分”。通过了解它们,您可以正确使用它们并避免陷阱。
“ 前进与前进 ” 一书包括有关平等的部分,其中简要说明了何时使用松散( ==
)与严格( ===
)运算符:
要将大量细节归结为一些简单的要点,并帮助您知道在各种情况下是使用
==
还是===
,这是我的简单规则:
- 如果比较中的任何一个值(又称正值)可以是
true
或false
,请避免==
并使用===
。- 如果比较中的任何一个值都可以是这些特定值(
0
,""
或[]
- 空数组),请避免==
并使用===
。- 在所有其他情况下,您可以放心使用
==
。它不仅安全,而且在许多情况下以提高可读性的方式简化了代码。
对于那些不想花时间真正理解 Javascript 的开发人员,我仍然推荐 Crockford 的演讲。对于偶尔仅使用 Javascript 的开发人员来说,这是一个很好的建议。
如果您知道它们是字符串,则无需检查类型。
"a" == "b"
但是,请注意,字符串对象将不相等。
new String("a") == new String("a")
将返回 false。
调用 valueOf()方法将其转换为 String 对象的基元,
new String("a").valueOf() == new String("a").valueOf()
将返回 true
答案的唯一补充:如果所有这些方法都返回 false,即使字符串看起来相等,一个字符串的左侧和 / 或右侧也可能存在空格。因此,只需在比较之前将.trim()
放在字符串的末尾即可:
if(s1.trim() === s2.trim())
{
// your code
}
我已经花了很多时间试图找出问题所在。希望这对某人有帮助!
除非您真的知道强制的工作方式,否则应避免==
而应使用标识运算符===
。但是您应该阅读此书以了解其工作原理 。
如果使用==
,则可以让语言为您执行某种类型的强制转换,例如:
"1" == 1 // true
"0" == false // true
[] == false // true
正如道格拉斯 · 克罗克福德(Douglas Crockford)在他的书中所说:
始终最好使用身份运算符。
实际上,可以使用两种方法在 javascript 中创建字符串。
var str = 'Javascript';
这将创建一个原始字符串值。
var obj = new String('Javascript');
这将创建String
类型的包装对象。
typeof str // string
typeof obj // object
因此,检查相等性的最佳方法是使用===
运算符,因为它会同时检查两个操作数的值和类型。
如果要检查两个对象之间是否相等,则使用String.prototype.valueOf
是正确的方法。
new String('javascript').valueOf() == new String('javascript').valueOf()
可以使用JSON.stringyfy()
技巧检查 String Objects
。
var me = new String("me");
var you = new String("me");
var isEquel = JSON.stringify(me) === JSON.stringify(you);
console.log(isEquel);
我在测试过程中提出了一个替代解决方案。您可以在字符串原型上使用 function。
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 浏览器中正常工作