我有2个字符串:
cities
但是当我比较它们时:
var a = 'António'
var b = 'António'
他们并不平等。如何才能做到这一点?
答案 0 :(得分:1)
您可以使用localeCompare()方法。
string_a.localeCompare(string_b);
/ *预期回报:
0:完全匹配
-1:string_a< string_b
1:string_a> string_b
* /
答案 1 :(得分:0)
您的问题发生的原因可能是您的equals
字符的表达方式不同。
您可以通过以下方式获得相同的字形:
使用Unicode字符
equals
使用Unicode代码点
'ó'
使用组合标记('o'+''')
var a = 'António'
最后一个结合'o'(拉丁小写字母o)和'''(精确重音)。
现在,如果你var b = 'Ant\u00F3nio'
,你将获得var c = 'Anto\u0301nio'
。因为在这种情况下我使用Unicode字符并将其与其代码点进行比较,这是相同的事情。
现在,如果你a === b
,你将获得true
。因为第一个是一个Unicode字符,第二个是将Unicode字符与组合标记组合,获得相同的字形。
现在,如果我在控制台中粘贴a === c
和false
输出,然后将它们粘贴到其他变量并进行比较,我会得到同样的结果。
执行:a
(来自c
)和var x = 'António'
(来自a
),然后var y = 'António'
将获得c
。如果你在浏览器控制台中尝试这个并且得到x === y
那么是正确的,否则SO可能已经处理了字符串并且难怪其他人得到false
。
为了将false
(true
)与a
('António'
)进行比较,您需要对表单进行规范化以获得相同的内容。
因此你可以这样做:
NFC(标准格式)(默认)
c
或'Anto\u0301nio'
因此,这会使a === c.normalize('NFC')
与a === c.normalize()
表示相同。
NFD(经典分解形式)
c
因此,这会使a
与a.normalize('NFD') === c
表示相同。
或者你可以只依靠一个表格并且不介意用于表示任何字符串的格式:
a
注意: JavaScript引擎使用UTF-16。这意味着如果您的角色位于基本多语言平面中且代码点位于c
和a.normalize() === c.normalize()
之间,那么您将会很好。但是如果你使用该范围之上的某些字符(星界平面),则该字符将使用代理对来表示,因此每个代码单元具有16位代码单元。在这种情况下,如果字符串未规范化,某些操作可能不会产生预期的行为。
注意:为了获得良好的阅读效果,您可以查看this。
答案 2 :(得分:-1)
a == b
对我来说是真的。作为旁注,您应该使用===
答案 3 :(得分:-1)
var a = "António";
var b = "António";
$(document).ready(function(){
if(a == b){
alert(true);
}else{
alert(false);
}
});
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>