专栏首页前端重点笔记js中关于假值和空数组的总结

js中关于假值和空数组的总结

先上x==y运算符的算法细节:

  1. 如果x不是正常值(比如抛出一个错误),中断执行。
  2. 如果y不是正常值,中断执行。
  3. 如果Type(x)Type(y)相同,执行严格相等运算x === y
  4. 如果xnullyundefined,返回true
  5. 如果xundefinedynull,返回true
  6. 如果Type(x)是数值,Type(y)是字符串,返回x == ToNumber(y)的结果。
  7. 如果Type(x)是字符串,Type(y)是数值,返回ToNumber(x) == y的结果。
  8. 如果Type(x)是布尔值,返回ToNumber(x) == y的结果。
  9. 如果Type(y)是布尔值,返回x == ToNumber(y)的结果。
  10. 如果Type(x)是字符串或数值或Symbol值,Type(y)是对象,返回x == ToPrimitive(y)的结果。
  11. 如果Type(x)是对象,Type(y)是字符串或数值或Symbol值,返回ToPrimitive(x) == y的结果。
  12. 返回false

1、“假值”总共只有6个: false,undefined,null,0,""(空字符串),NaN 除此之外的所有值,都是“真值”,即在逻辑判断中可以当true来使用

用代码表示:

if(false&&undefined&&null&&0&&""&&NaN){
    console.log('其中有真值');
}else{
    console.log('全部都是假值');
}
//全部都是假值

2、对于空数组和空对象的疑惑

疑惑来源:用空数组和空对象进行if语句判断为true,但是空数组和true进行==运算时,返回的是false

用代码表示:

if([]){
    console.log('空数组转化为布尔值为true');//空数组转化为布尔值为true
}
if({}){
    console.log('空对象转化为布尔值为true');//空对象转化为布尔值为true
}
if([]==true){
    console.log('空数组等于true');
}else{
    console.log('空数组等于false');//空数组等于false
}

为什么空数组转化为布尔值是true,而下面和true做对比时又不等于true呢?

原因分析:if ([ ]) {} 里发生自动类型转换,[ ] => Boolean,从object到布尔型,结果是true。事实上,所有的object转型到Boolean,都是true,[ ]和{ }都是对象。

      [ ] == true 里不发生自动类型转换,这条语句只比较左右的“值”是否相等,所以要先化为number类型,true转化为数字1就不用说了,主要分析一下[ ]怎么转化为0的,这里涉及到ToPrimitive方法的操作,不懂的可以先看我的另一篇博客,https://i.cnblogs.com/EditPosts.aspx?postid=10859000,再返回看。[ ]会先调用valueOf方法,返回数组本身不是原始值,所以继续调用toString方法,返回' ',从而Number(' ')=0,而0!=1,所以返回false。

总结:Boolean([ ]) => true;//直接作条件    Boolean(Number([ ])) => false;//当与布尔值做比较时

Number({ })//NaN,不等于任何数包括自己

最后送大家一张经典的图:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 时间复杂度和空间复杂度

    这个算法的运行次数函数是f (n) =3。 根据我们推导大0阶的方法,第一步就是把常数项3 改为1。在保留最高阶项时发现,它根本没有最高阶项,所以这个算法的时...

    周三不加班
  • 递归和动态规划

    算法中使用递归可以很简单地完成一些用循环实现的功能,比如二叉树的左中右序遍历。递归在算法中有非常广泛的使用, 包括现在日趋流行的函数式编程。

    lucifer210
  • SpringFramework之ControllerAdvice注解的源码分析

        我们会通过@ControllerAdvice和@ExceptionHandler来处理异常,Springmvc是如何进行处理的呢?

    克虏伯
  • 【LeetCode题解---2】Add Two Numbers

    You are given two non-empty linked lists representing two non-negative integers....

    周三不加班
  • 【LeetCode题解---1】Two Sum

    “Bad programmers worry about the code. Good programmers worry about data structu...

    周三不加班
  • 232. 用栈实现队列

    push(x) -- 将一个元素放入队列的尾部。pop() -- 从队列首部移除元素。peek() -- 返回队列首部的元素。empty() -- 返回队列是否...

    lucifer210
  • 226. 翻转二叉树

    谷歌:我们90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了。

    lucifer210
  • 【LeetCode题解---771】Jewels and Stones

    You're given strings J representing the types of stones that are jewels, and S r...

    周三不加班
  • TCP网络编程中connect()、listen()和accept()三者之间的关系 ( 非常重要!!)

    基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下:

    战神伽罗
  • 【LeetCode题解-004】Median of Two Sorted Arrays

    There are two sorted arrays nums1 and nums2 of size m and n respectively.

    周三不加班

扫码关注云+社区

领取腾讯云代金券