
文章插图
【JS 中令人脑壳疼的 == 与 === 区别到底是什么?】曾经对我来说 , 等于就是等于 , 所以第一次接触到 JS 中的三等号时我感到很困惑 。大部分编程语言中都有双等号"==" , 但没有三等号"===" 。
下面是一个比较官方的双等号与三等号的差别:
"如果需要判断运算数是否为同一类型并且值相等 , 则使用严格相等运算符[===] 。
否则 , 使用标准相等运算符[==] , 它允许你比较两个运算数的值 , 即使它们类型不同 。"
--MDN web docs
在认为理解它的关键就在于了解“类型强制转换” , 它是“动态类型语言” Vanilla JAVAScript 中的一个奇怪的概念 。
之所以会有类型强制转换是因为 JS 想要防御编程错误 , 比如拿一个数字和一个字符串比较:
“当在 JavaScript 中使用双等号时我们测试的是不严格的相等 。双等号还会带来类型强制转换 。
强制转换的意思是只有当运算数被转换为相同类型时它们才能被比较 。”
换句话说 , 由于有类型转换 , 不同类型的值可以通过 == 被比较 , 但一个字符串和一个数字则永远不会用 === 严格相等 。
举个例子:
console.log(Number("7") - 7 == 0); // trueconsole.log(Number("7") - 7 === 0); // trueconsole.log(Number("7") - 7 === Number("0")); // trueconsole.log("7" - 7 == "0"); // trueconsole.log("7" - 7 === "0"); // false
JavaScript 中的真与假
在 JavaScript 中我们有六个代表假的值:false, 0, ""(空字符串),null, undefined 和 NaN(Not A Number) , 这六个假值互相是什么关系呢?
“将 false , 0和""用(==)相比较 , 结果为真 , 它们都不严格相等;null 和 undefined 只和自己相等;NaN 不与任何假值相等 , 包括它自己 。”
// All permutations of falsy comparisons in JavaScript by Dr. Derek Austin console.log(false == false); // trueconsole.log(false === false); // trueconsole.log(false == 0); // true -- false, 0, and "" are loosely equalconsole.log(false === 0); // falseconsole.log(false == ""); // true -- false, 0, and "" are loosely equalconsole.log(false === ""); // falseconsole.log(false == null); // falseconsole.log(false === null); // falseconsole.log(false == undefined); // falseconsole.log(false === undefined); // falseconsole.log(false == NaN); // falseconsole.log(false === NaN); // falseconsole.log(0 == 0); // trueconsole.log(0 === 0); // trueconsole.log(0 == ""); // true -- false, 0, and "" are loosely equalconsole.log(0 === ""); // falseconsole.log(0 == null); // falseconsole.log(0 === null); // falseconsole.log(0 == undefined); // falseconsole.log(0 === undefined); // falseconsole.log(0 == NaN); // falseconsole.log(0 === NaN); // falseconsole.log("" == ""); // trueconsole.log("" === ""); // trueconsole.log("" == null); // falseconsole.log("" === null); // falseconsole.log("" == undefined); // falseconsole.log("" === undefined); // falseconsole.log("" == NaN); // falseconsole.log("" === NaN); // falseconsole.log(null == null); // trueconsole.log(null === null); // trueconsole.log(null == undefined); // true -- null loosely equals undefinedconsole.log(null === undefined); // falseconsole.log(null == NaN); // falseconsole.log(null === NaN); // falseconsole.log(undefined == undefined); // trueconsole.log(undefined === undefined); // trueconsole.log(undefined == NaN); // falseconsole.log(undefined === NaN); // falseconsole.log(NaN == NaN); // false -- NaN nothing equals NaN, andconsole.log(NaN === NaN); // false -- NaN doesn't equal itself
虽然 JS 中的假值这么奇葩 , 但幸好除了这些假值以外所有值都为真:
“在 JavaScript 中 , 真值就是在布尔类型上下文中所有被认为是"true"的值 。所有的值皆为真 , 除非它被定义为假 , 比如 false , 0 , "" , null , undefined 和 NaN 。”
ECMAScript 中的情况呢?
如果你感兴趣的话 , 下面是 JavaScript 所使用的具体算法 。
严格相等运算符
严格相等运算符(=== 与 !==)使用严格相等比较算法来比较两个运算数:
推荐阅读
-
北青网综合|不同体质调理方法截然不同!来学习一下吧
-
人民日报|红色基因 赓续绵延(特别策划·传红色基因 承优良家风)
-
天蝎座|表面柔弱,内心刚强的三大星座,不抱怨,不诉说,让人刮目相看
-
【经济日报·经济论坛】创业板注册制首批公司上市 新一轮改革开放的重大成果
-
EDA365电子论坛电子工程师的顶级PCB设计软??件工具:46种PCB设计的必备工具
-
《看破,瞬间天晴》一本教你放下烦恼的心灵读本!|悦读青春 | 读本
-
-
游戏青年|OG官方宣布SumaiL离队 Ceb重返首发名单
-
凌云搞笑荟|就不能好好拉面吗,搞笑GIF:现在的拉面师傅都怎么了
-
「海关总署」美国确诊病例已超125万 国内状况百出特朗普依旧“我行我素”
-
懂球帝德西利奥可能去巴萨,跟队记者:桑德罗和达尼洛大概率留队
-
何有强|马雅舒不愧是吴奇隆的前妻,黑色Polo衫配牛仔裤,猜不出年龄
-
全球颜值最前线|网红模特成熟妩媚,气质出众有女人味,完美身材可谓辣妹
-
-
澳洲▲澳洲76岁百万富翁荒岛求生23年,带俩人体模特与世隔绝,生活充实
-
第五大道|Open Summer 缤纷彩虹腕表,开启夏日之门:Swatch
-
属鸡|进入十月,三大生肖好运相随,属猪职场顺遂,属兔贵人相助,属鸡求财顺遂。
-
农产品好消息!万州首个智慧农超即将投入使用,选址在甘家院
-
川北高速公路大队@道路交通安保工作部署会,川北高速公路大队召开清明节期间
-
陶玉玲|张舒越冯硕主持总台首届电视剧年度盛典红毯,准备不足且多次嘴飘