我编写了以下代码来检查字符串是否由所有唯一字符组成
function isUnique(string) {
var charMap = {};
for(var i= 0; i < string.length; i++) {
if (charMap[string[i]] != null) {
charMap[string[i]] = 1;
return false;
} else {
charMap[string[i]] = 0;
}
}
return true;
}
当我运行它时,这是有效的,但是,我的linter建议我使用&#34;!==&#34;而不是&#34;!=&#34;比较为null。
如果我将此行更改为if (charMap[string[i]] !== null) {
,代码将停止工作并返回false,无论如何。
如果我将此行更改为if (charMap[string[i]]) {
(我认为应该相同),则无论如何都会返回true。
有人可以给出这三者之间差异的明文解释吗?我认为他们是相似的,我可能犯了一个愚蠢的错误,所以请耐心等待。
答案 0 :(得分:2)
JavaScript中有两个值非常相似:undefined
和null
。
undefined
是所有变量的默认状态,包括对象中未知属性的值。
var x;
console.log(x); // undefined
var obj = {
a: 1
};
console.log(obj.b); // undefined
null
是您可以将指定给的值。它通常用来暗示价值是故意不存在的。
在对null
(!= null
)进行弱比较时,它相当于:
x !== null && x !== undefined
将代码更改为
if (charMap[string[i]] !== null) {
你省略了对undefined
的检查,这是你真正想要的。
接下来,您尝试了
if (charMap[string[i]]) {
这将检查值是否为"truthy"。基本上,它转换为:
x !== false && x !== null && x !== undefined && x !== '' && x !== 0
最后一句是抓住你的。您将值初始化为0
以开始,但您的代码永远不会捕获它。
答案 1 :(得分:0)
第一个只比较String值中的值,但不比较对象的类型
第二个还将比较对象的类型。
第三个只是检查它是否未定义或为空。
答案 2 :(得分:0)
主要区别在于null
和未定义的变量与==
相比是相同的。与===
相比,它们并不相同。
如果我没记错的话,三个等于(或一个爆炸和两个等于)的身份检查(这些事情完全相同)vs两个等于(或一个爆炸和一个等于)检查相等(这些东西在功能上是相同的)。
你得到的是假的,因为你正在检查null
并且你期望一个未定义的变量将你的if放到第二个分支。
答案 3 :(得分:0)
如果列表中尚未包含char,则charMap[string[i]]
未定义,因此比较适用于!=
(因为undefined和null都是假的)但不是{{1} (因为类型不一样)。
检查!==
不起作用,因为在找到char时将值设置为零,这也是假的。
如果您遇到char(而不是0),我的建议是将值设置为1,然后检查if (charMap[string[i]]) {
或仅charMap[string[i]]!==undefined
:
charMap[string[i]]
答案 4 :(得分:0)
我会在这里使用hasOwnProperty
因为这会返回一个布尔值,指示charMap
对象是否具有指定的char作为属性。
`
function isUnique(string) {
var charMap = {};
for (var i = 0; i < test.length; i++) {
if (charMap.hasOwnProperty(test[i])) {
charMap[test[i]] = 1;
return false;
} else {
charMap[test[i]] = 0;
}
}
return true;
}
`