关于js中''、0、false、[]和{}等==的判断逻辑

本文通过实例探讨了JavaScript中==与===的区别,展示了不同类型的值在进行比较时的行为,并解释了为何某些比较结果会令人意外。

这个问题也是我在写代码的途中遇到的,觉得有点意思,先附上我当时写的代码,如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
</body>
<script type="text/javascript" src="jquery-3.0.0.min.js"></script>
<script type="text/javascript">
    $(function () {
        check(0);
    });
    function check(a) {
        if (a==""){
            console.log("校验不通过");
            return
        }
        console.log("校验通过");
    }
</script>
</html>

在我的预想中除非a的值是空串,否则结果应该是通过的,但上面的运行结果却是不通过,我还是太young了,所以当时我只好把check(0)换成了check(‘0’),然后运行通过了,后来我才了解到在js中进行==判断的话认真你就输了,要么你使用===,要么你必须是同类型来比较,check(‘0’)就是如此,然后我又做了一些测试,

测试代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
</body>
<script type="text/javascript" src="jquery-3.0.0.min.js"></script>
<script type="text/javascript">
    $(function () {
        check();
    });
    function check() {
        console.log("0 == '' is " + (0 == ""));
        console.log("false == '' is " + (false == ""));
        console.log("[] == '' is " + ([] == ""));
        console.log("{} == '' is " + ({} == ""));
    }
</script>
</html>

测试运行结果如下:

0 == '' is true
false == '' is true
[] == '' is true
{} == '' is false

  what are you 弄啥啊?从运行结果我们首先可以知道0和”还有false相等我们是可以接受的,因为他们在js的逻辑判断中本来就是false的,而{}不等于”也是可以理解的,因为{}在js的逻辑判断中是为true的,但是[]等于”是什么鬼,因为[]的逻辑判断是true,而”是false,他俩居然相等,所以this is a problem。
  答案揭晓,其实在进行数组直接与true和false的布尔类型比较时,默认是将数组和布尔类型都转化为了Number类型进行比较,空数组转化为Number类型时为0,所以[]==”没毛病……
  but,请注意一点,null和undefined和”的比较结果也都是false的。

参考:http://www.cnblogs.com/wait-hua/p/5700342.html

JavaScript 中,如果不使用 `==` 运算符进行等于判断,则通常会采用 `===`(全等运算符)作为替代方案。`===` 不仅比较值的相等性,还确保两个操作数的类型一致[^5]。 ### 使用 `===` 进行等于判断 - **基本类型**:当比较两个基本类型的值时,如数字、字符串或布尔值,`===` 会在类型值都匹配的情况下返回 `true`。 ```javascript let a = 123; let b = '123'; console.log(a === b); // false,因为类型不同 [^3] ``` - **对象与引用**:对于对象、数组、函数等引用类型,`===` 判断的是两个变量是否指向同一个内存地址。 ```javascript let obj1 = { name: 'Alice' }; let obj2 = { name: 'Alice' }; let obj3 = obj1; console.log(obj1 === obj2); // false,尽管内容相同,但引用地址不同 [^3] console.log(obj1 === obj3); // true,两者指向同一对象 [^3] ``` - **特殊值比较**: - `null` `undefined` 是不同类型,因此 `null === undefined` 返回 `false`[^5]。 - 数值 `NaN` 在任何情况下都不等于自身,包括 `NaN === NaN` 也返回 `false`[^1]。 ### 深度比较对象内容 如果需要比较两个对象的内容而不是引用地址,可以使用递归方法或第三方库(如 Lodash 的 `_.isEqual()` 方法)。以下是一个简单的深度比较实现示例: ```javascript function deepEqual(obj1, obj2) { if (obj1 === obj2) return true; if (typeof obj1 !== 'object' || obj1 === null || typeof obj2 !== 'object' || obj2 === null) { return false; } const keys1 = Object.keys(obj1); const keys2 = Object.keys(obj2); if (keys1.length !== keys2.length) return false; for (let key of keys1) { if (!keys2.includes(key) || !deepEqual(obj1[key], obj2[key])) { return false; } } return true; } const objA = { a: 1, b: { c: 2 } }; const objB = { a: 1, b: { c: 2 } }; console.log(deepEqual(objA, objB)); // true,内容完全相同 [^1] ``` ### 总结 - 推荐使用 `===` 来避免隐式类型转换带来的不可预测行为。 - 对于对象比较,除非明确希望检查引用一致性,否则应使用深度比较逻辑。 - 当处理复杂结构或嵌套对象时,考虑引入成熟的工具库以提高准确性性能。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值