JavaScript相等运算符:是否有一个用例我更喜欢== over ===?

时间:2016-05-02 06:08:51

标签: javascript

作者和开发人员似乎同意应该使用===运算符来检查值和类型。

但我问自己: 它是在语言中。所以最有原因!

因此我的问题(对于更有经验的JavaScript开发人员):

任何人都可以向我展示一个我可以从使用==运算符中获利的szenarios吗?

或者解释一下它在语言中的原因?

4 个答案:

答案 0 :(得分:1)

"因为它更容易"

我非常确定double equals的行为旨在降低学习语言的人的标准。几乎在所有情况下,除了节省一点打字之外,没有充分的理由使用双等于三倍。

Triple更快更安全。它没有做任何"魔法"。魔术糟透了。魔术不太可预测。

也就是说,双重等于是如何工作的是众所周知的,并且不会做那么多魔法。它只是转换为最近的基本类型,您可以考虑使用一个用例来比较输入字符串和数字值。

例如,quantityInput.value == 0

如果quantityInput为空或不是数字,则会出现明显的问题。但是,这个问题也会出现三等于。因此,忽略这些情况,使用三等于的同样的事情是:

Number(quantityInput.value) === 0+(quantityInput.value) === 0

三重相等例子的意图更清楚。我们正在接受此事(quantityInput.value),将其转换为数字,并将其与其他数字进行比较。当然它更冗长,但在最后一个例子中,我们只增加了4个字符。

魔法不好,mkay?

当您开始比较可能不是原语的东西时,双等于变得不太可预测。

举个例子:

var a = 'aString';
var b = {
    toString: function() {
        return 'aString';
    }
};

a == b; // true

您可能一直期望对于双等号,比较会调用b toString来比较a&#39}的字符串值,而您是对的。

但是这个怎么样?:

var a = 'aString';
var b = {
    valueOf: function() {
        return 'aDifferentString';
    },
    toString: function() {
        return 'aString';
    }
};

a == b; // 'aString' == 'aDifferentString' // false

valueOf践踏toString。 Double equals并不关心你比较的类型。如果它看到一个基元与一个对象进行比较,它首先尝试valueOf,然后toString秒。

a0时,b.valueOf返回'0'字符串时会怎样?:

var a = 0;
var b = {
    toString: function() {
        return '0';
    }
};

a == b; // 0 == '0' // 0 === 0 // true

使用b.toString的双等号提供String,然后将String投放到Number

现在,如果ab都是在valueOftoString中返回相同内容的对象,该怎么办?

var a = {
    valueOf: function() {
        return 'aValue';
    },
    toString: function() {
        return 'aString';
    }
};
var b = {
    valueOf: function() {
        return 'aValue';
    },
    toString: function() {
        return 'aString';
    }
};

a == b; // false

你在期待吗?如果没有,这应该是一个很好的例子,说明为什么魔法不好。你永远不知道魔法会有多强大。

在这种情况下,由于ab都不是原语,它会跳过valueOftoString调用,只是比较指针。

编辑:我将添加一个"有用的"前同事违反自己的情况"总是使用三等于"从他起草的项目代码规范中做出规则。

他使用undefined检查potentiallyUndefinedThing == null。他的论点是它应该得到特殊处理,因为双等于零等于未定义并且它一石二鸟(undefined& null检查)。实际上,几乎他使用过的每一个案例,我们都知道价值永远不会是null或永远不会是undefined。仅仅因为你看到推文使用==的推文并没有使魔法犹太人成为可能。它仍然只是懒惰。

当我查看他的代码时,我并没有太多打扰我,但是当他发回我明确的=== undefined支票并被== null支票替换时,我畏缩了。

答案 1 :(得分:1)

===也检查数据类型,但在使用==时,仅检查值。 ie; if(2 ==' 2')返回true。但是如果我们使用(2 ===' 2')则返回false。 希望你明白。

更好地使用===总是

答案 2 :(得分:0)

例如,当您需要将对象与基本类型进行比较时:

new String("abc") === "abc"

将返回false,因此最好在这种情况下使用==

new String("abc") == "abc"

将返回true

答案 3 :(得分:0)

相同的运算符===和相等的==运算符是相同的,除了在相同的运算符===中没有进行类型转换的事实。

例如:

12.01 == "12.01" // will be true

12.01 === "12.01" // will be false