比较对象类型时是否需要第三个=
Is the third = necessary when comparing object types?
给我一个不应该停止使用第三个等号的充分理由。
typeof x === "object"
typeof x == "object" // does the same thing 100% of the time and uses one less character
1(非常)好的理由:一致性。
在常规中,您应该尽可能具体。如果您遵循的是应该尽可能具体的一般规则,那么为了保持一致性,您应该将其保留为===
。另外,假设你遵循了一般规则,如果你破例,那么会有更多的破例,很快你就没有了一般规则。
我会考虑一致性和特异性,而不是100%输入1个字符的麻烦。
在这种特定情况下,===
的唯一优势是速度稍快。
有关分析结果,请参阅:http://jsperf.com/equal-performance(特别是"字符串+双等于"answers"字符串+三元组等于")。
您不是在比较对象类型。比较字符串:文本字符串('object'
)和typeof
运算符返回的字符串。
因为您总是在这个语句中比较字符串,所以我想使用==
或===
在这里没有什么区别。
好吧,到目前为止,大多数人已经告诉你(理所当然地)使用三个=
是最佳实践。但是,在使用type of value-of
比较时,您的示例会带来一个可能的陷阱。举个例子:
var date1 = new Date();
var date2 = new Date(date1.valueOf());
这意味着date1
和date2
都属于相同的类型(对象,甚至是相同的对象:Date),并且具有完全相同的值。从逻辑上讲:
console.log(date1 === date2);//logs FALSE
为什么?因为JS对象变量是引用。上面的语句实际上是在检查内存中的两个位置(都是新实例)是否相同。不是检查它们的内容,而是检查它们的内存地址
因此,逻辑规定:
var date1 = new Date();
var date2 = date1;
console.log(date1 === date2);//True
注意:JS总是复制其变量的值,但在对象的情况下,这些变量是引用,因此JS将存储在date1
中的mem地址复制到date2
。
公平地说,两个独立实例的检查也是双等号出现的问题。无论类型或值如何:两个内存地址永远不会相同。
许多人曾经应用的一个简单修复方法是覆盖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;
这样的行开始。这样的代码永远无法避免,但应该保持在最低限度。
就我自己而言,如果我看到函数进行类型和值检查,我倾向于在调用函数时检查期望的参数类型。如果没有,我假设函数将从我选择传递给它的任何参数中解析它需要的任何数据。
基本上:代码看起来越严格,它可能被使用得越严格。
Third等于比较偶数数据类型。
JavaScripttypeof返回字符串,仅当测试变量为null时才返回"null",而是null。
如果将类型的x与字符串进行比较,则second等于返回的值始终相同,例如third。
==
-表示检查变量的值,但不检查其类型(例如"2"==2=>返回true)。
===
-表示检查值及其类型(例如"2"===2=>返回false,因为左边的参数是字符串,第二个是数字,所以vars不相同)
编辑:CCD_ 22与CCD_。
- 为什么grunt contrib connect的中间件选项的第三个参数是未定义的
- 如何使用PHP和JS级联三个下拉列表
- 灯光问题(使用三个.js)
- 在三个.js中创建球体(例如地球)的磁力线
- 什么'这是从第三个函数上的async 1st函数获得结果的更好方法
- javascript第三个XMLHttpRequest被拒绝.但前两个是允许的
- 将循环中的两个文本框相乘,并在第三个文本框上显示结果
- 根据前两个下拉ID显示第三个下拉列表
- 在数组JS中查找三个重复项
- Meteor和S3:如何通过一次上传/编辑定义三个不同的图像
- 导出单个或多个类型
- 如何替换javascript字符串中的前三个连字符
- 保存两个模型(属于第三个模型)和一个提交
- 将文本字段限制为三个数字
- 三个js键盘旋转
- 匹配三个正则表达式中的任意一个,以先到的为准(在javascript中)
- 加载模型与三个.js
- 连续三个检查宾果游戏
- 我需要制作第三个累加器来保存while循环中的项类型吗
- 比较对象类型时是否需要第三个=