0

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

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

6 回答 6

3

1(非常)好的理由:一致性

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

对于必须 100% 输入 1 个字符的麻烦,我会采取一致性和特异性。

于 2012-07-09T21:03:52.953 回答
2

在这种特定情况下,唯一的优点===是速度稍快。

有关分析结果,请参阅:http: //jsperf.com/equal-performance(特别是“字符串 + 双等号”和“字符串 + 三等号”)。

于 2012-07-09T21:03:54.793 回答
1

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

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

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

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

为什么?因为 JS 对象变量是引用。上面的语句实际上是在检查内存中的两个位置(都是新实例)是否相同。不是检查它们的内容,而是检查它们的内存地址。
因此,逻辑表明:

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

注意:JS 总是复制其变量的值,但是对于对象,这些变量是引用,所以 JS 将存储date1date2.

很公平,检查两个单独的实例也是双等号出现的问题。不管类型,甚至值:两个内存地址永远不会相同。

许多人过去应用的一个简单修复方法是覆盖 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()返回值存储在一个额外的变量中. 工作完成(?)人们实际上需要做的是编写更好的代码,但我很累并且偏离了主题......回到手头的问题:

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

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

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

于 2012-07-09T21:25:05.983 回答
1

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

因为你总是会在这个语句中比较字符串,所以我想在这里使用==or===不会有任何区别。

于 2012-07-09T21:03:51.213 回答
-2

第三个等于比较偶数数据类型。

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

如果您将typeof xstring进行比较,第二个等于返回总是相同的,例如第三个。

于 2012-07-09T21:08:59.997 回答
-2

==- 表示检查变量的值但不检查它们的类型(例如“2” == 2 => 返回真)。

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

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

于 2012-07-09T21:05:16.760 回答