我编写了以下代码来检查字符串是否由所有唯一字符组成
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 建议我使用"!=="而不是"!="来与 null 进行比较。
如果我将此行更改为if (charMap[string[i]] !== null) {
,则代码停止工作并返回false。
如果我将此行更改为 if (charMap[string[i]]) {
(我认为应该是相同的(,则无论如何该函数都会返回 true。
有人可以对这三者之间的区别进行纯文本解释吗?我可能犯了一个愚蠢的错误,认为它们是相似的,所以请耐心等待。
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]]) {
这将检查值是否为"真实"。基本上,它翻译为:
x !== false && x !== null && x !== undefined && x !== '' && x !== 0
最后一句就是吸引你的。您将值初始化为0
开始,但您的代码永远不会捕获它。
第一个只是比较字符串值中的值,而不是比较对象的类型
第二个还将比较对象的类型。
第三个只是检查它是否未定义或为空。
主要区别在于null
和未定义的变量与==
是相同的。 与===
相比,它们是不一样的。
如果我没记错的话,三个等于(或一个砰
你得到假,因为你正在检查null
并且你期望一个未定义的变量将你的if放到第二个分支。
如果 char 尚未在列表中,则charMap[string[i]]
是未定义的,因此比较适用于 !=
(因为未定义和 null 都是假的(,但不适用于!==
(因为类型不同(。
if (charMap[string[i]]) {
不起作用,因为您在找到字符时将值设置为零,这也是伪造的。
我的建议是,如果您遇到字符(而不是 0(,请将值设置为 1,然后检查charMap[string[i]]!==undefined
或干脆charMap[string[i]]
:
function isUnique(string) {
var charMap = {};
for (var i= 0; i < string.length; i++) {
if (charMap[string[i]]) {
return false;
} else {
charMap[string[i]] = 1;
}
}
return true;
}
我会在这里使用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;
}
'