检查字符串是否由所有唯一字符组成 - 不等于JavaScript中的运算符



我编写了以下代码来检查字符串是否由所有唯一字符组成

    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 中有两个非常相似的值:undefinednull

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;
}

'

最新更新