比较对象类型时第三个是必要的吗?

时间:2012-07-09 21:01:25

标签: javascript

给我一​​个很好的理由,为什么我不应该停止使用第三个等号。

typeof x === "object"
typeof x == "object" // does the same thing 100% of the time and uses one less character

6 个答案:

答案 0 :(得分:3)

1(非常)正当理由:一致性

一般中,您应该尽可能具体。如果您遵循应尽可能具体的一般规则,则应将其保持为===以保持一致性。另外,假设你遵循一般规则,如果你做了一个例外,那么接下来会有更多例外,很快你就不会有一般规则了。

我会在100%的时间内不得不输入1个字符的麻烦时保持一致性和特异性。

答案 1 :(得分:2)

在这种特定情况下,===的唯一优势是它稍快一些。

有关分析结果,请参阅:http://jsperf.com/equal-performance(具体而言,“string + double equals”和“string + tripple equals”)。

答案 2 :(得分:1)

您不是在比较对象类型。您比较字符串:文字字符串('object')和typeof运算符返回的字符串。

因为您总是会比较此声明中的字符串,所以我认为使用=====在此处没有任何区别。

答案 3 :(得分:1)

好的,现在大多数人告诉过你(理所当然地),使用三个=是最好的做法。但是,您的示例在使用type of value-of比较时会出现一个可能的陷阱。以此为例:

var date1 = new Date();
var date2 = new Date(date1.valueOf());

这意味着date1date2的数据类型相同(对象,相同的对象甚至是日期)并且具有完全相同的值。所以逻辑上:

console.log(date1 === date2);//logs FALSE

为什么呢?因为JS对象变量是引用。上述语句实际上正在做的是检查内存中的两个位置(两个都是新实例)是否相同。不是他们的内容被检查,而是他们的mem地址。因此,逻辑要求:

var date1 = new Date();
var date2 = date1;
console.log(date1 === date2);//True

注意:JS总是复制其变量的值,但是对于对象,这些变量是引用,因此JS将存储在date1中的mem地址复制到date2

公平地说,检查两个单独的实例也是一个双等号的问题。无论类型或值是否均匀:两个mem地址永远不会相同。

许多人习惯应用的简单修复方法是覆盖JS对象原型的valueOf方法。这仍然有效,但会导致类型和值检查出现问题(对象类型仍在播放部分):

function SomeConstructor()
{
    this.foo = 'foobar';
    this.bar = function()
    {
        console.log('I am a messy constructor!');
        return this.foo;
    };
}
var inst = new SomeConstructor();
inst.valueOf = function()
{
    return 1;
}

console.log(inst == 1);//logs true
console.log(inst === 1);//logs FALSE

有很多方法可以解决这个问题,我见过人JSON.stringify - 两个对象,然后解析它们,人们使用for...in来检查每个属性,......尽管如此需要做的是将valueOf()返回值存储在一个额外的变量中。完成工作(?)人们真正需要做的就是编写更好的代码,但是我已经厌倦了 WAY 脱离主题......回到手头的问题:

然后,可能有人问,是选择额外=标志的原因。好吧,我看到上面提到的一致性和边际速度增益。
但就像没有人提到这个陷阱一样,没有人提到稳定性

我的意思是,当你编写代码时,特别是在软类型语言中,你发现自己编写的函数或方法假定某种类型的某些参数。
通常在调试时,下一步是你的函数以argument1 = parseInt(argument1);argument1 = argument1 || 0;之类的行开头,这样的代码永远无法避免,但应该保持在最低限度。

对我自己说,我倾向于检查调用函数时期望的参数类型,如果我看到该函数进行类型和值检查。如果不是,我假设该函数将从我选择传递给它的任何参数中解析它需要的任何数据。
基本上:你的代码看起来更严格它可能会被更严格地使用。

答案 4 :(得分:-2)

== - 表示检查vars的值,但不检查其类型(例如“2”== 2 =>返回true)。

=== - 表示检查值及其类型(例如“2”=== 2 =&gt;返回false,因为左参数是一个字符串,第二个是数字,所以vars不相同)< / p>

编辑: ===通常与var1 == var2 && var1.contructor == var2.contructor相同。

答案 5 :(得分:-2)

第三等于比较甚至数据类型。

JavaScript typeof 返回字符串,仅当测试变量为null时才返回“null”,但为null。

如果您要将 typeof x 字符串进行比较,则第二个等于返回始终相同,例如第三个。