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

时间:2017-02-06 17:29:28

标签: javascript string operators

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

    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。

有人可以给出这三者之间差异的明文解释吗?我认为他们是相似的,我可能犯了一个愚蠢的错误,所以请耐心等待。

5 个答案:

答案 0 :(得分:2)

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]]) {

这将检查值是否为"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;
}

`