2015-11-03 20 views
0

我遇到了一个非常奇怪的问题,与我最新的JS项目。我通常使用===来比较字符串,但是当比较两个不同对象的字符串属性时,即使它们是完全相同的字符串,我也会得到假。我在Node.js的翻译测试了这通过执行以下操作:用localeCompare比较字符串vs ===?

> x = {str: 'hello'} 
{ str: 'hello' } 
> y = {str: 'hello'} 
{ str: 'hello' } 
> y.str === x.str 
true 

所以我不能弄清楚,为什么我的代码wasnt工作。但是当我从使用===切换到str1.localeCompare BOOM时,它可以工作。两者有什么区别?

+1

'localeCompare'将当前的语言环境考虑在内。 '==='将原始字节考虑在内。 –

+2

该图片没有显示问题。 – James

+2

如果'==='不起作用,但'.localeCompare()'* does *工作,那么你的字符串并不是真正的“完全相同的字符串”。 – Pointy

回答

6

===在字符串中查找完全相同的字节。

.localeCompare()允许您忽略字符串中的某些差异(例如puncutation或diacriticals或case),并仍然允许它们进行比较,或者在决定哪个字符串之前要忽略某些差异另一个。而且,它提供了很多选项来控制哪些比较功能被使用或不被使用。

如果您阅读string.prototype.localeCompare()MDN documentation,您可以看到大量的选项可用来控制比较的工作方式。在一个没有特殊字符的普通ASCII字符串中,这些字符串都是相同的情况,您不太可能会看到区别,但是开始陷入区别性或案例问题并且localCompare()同时具有更多功能和更多选项来控制比较。

一些选项可用于控制比较:

  1. 数字核对
  2. 变音灵敏度
  3. 忽略标点符号
  4. 情况下第一
  5. 控制能力是否大写或小写第一比较

此外,localeCompare()返回一个值(负值,0或正值),该值与.sort()回调完全对齐。