JavaScript · 随笔 Null vs. Undefined

神秘代码
• 阅读 859

刚学了一些 Markdown 的基础语法,试着用一下。

相关文档:Markdown基本语法配合基本使用

相同点:

  • nullundefined 都是js的基本数据类型
    扩展:JS的6种基本数据类型

    • Boolean
    • String
    • Number
    • Symbol
    • Null
    • undefined
  • nullundefined 都是falsy值
    扩展:JS的6种falsy值

    • 0
    • false
    • "" (空字符串)
    • NaN (Not a Number)
    • undefined
    • null

不同点:

let i = null;
console.log(i);
// null
let j;
console.log(j);
// undefined

可见:
null 代表变量有值,值为 , 且该值是通过 变量赋值 获得的;
undefined 代表声明了变量,但没有为其赋值。

综上:

undefined == null;
// true
undefined !== null;
// true

使用 typeof 验证一下:

typeof undefined;
// "undefined"
typeof null;
// "object"
typeof NaN;
// "number"

Emm...,undefinednull的类型不一致,确实验证了undefined !== null,不过...
null的类型是object?! ( 你不是js的基本数据类型吗? )
NaN的类型是number?! ( 你全称不是叫 “Not a Number” 吗? )

事实上就是如此,而且你还会发现:

!!NaN === false;
// true
NaN == false;
// false
NaN == 0;
// false

甚至:

NaN == NaN;
// false

NaN的特性就是如此:

  • NaN是number类型;
  • NaN不等于任何值;
  • 无效运算时会产生NaN,比如parseInt('abc')
  • 可用isNaN()判断一个值是否是NaN

!!是个很好用的“运算符”,它的用途是判断任意值在做if条件判断时的逻辑值(而非参与逻辑运算时的逻辑值,下文会提到。实际上!!运算符的运算结果就是前面提到的那6个falsy值),比如:

!! ""
// false
"" == false
// true

!! 0
// false
0 == false
// true

但是,千万不要觉得!!运算结果为false,== false就成立,比如:

!! undefined;
// false
undefined == false;
// false
!! undefined === false;
// true

!! null;
// false
null == false;
// false
!! null === false;
// true

!! NaN;
// false
NaN == false;
// false
!! NaN === false;
// true

另一点需要注意的是,它不做为参与逻辑运算时的逻辑值(而是作为falsy或truly值参与条件运算),比如:

!! undefined;
// false

/* 结果是undefined,而不是false */
undefined && 'a';
// undefined

false && 'a';
// false

但愿你还没看蒙。。至于为什么typeof(null) === 'object'
Emm。。跑题了,我们接着说 Null vs. Undefined


常见应用场景:

  1. ===(严格等于) 和 ==(等于) 分别在何时使用:

    我们都知道在做逻辑判断时,== 会强制转换用于比较的两个值的类型;而在实际开发中,以下情况用 == ,其他时候都用 === 即可

    if (obj.a == null) {
      // 这里相当于 obj.a === null || obj.a === undefined;
      // 这也是jquery源码中推荐的写法
    }
  2. ES6函数默认参数的实现:
    结合上文,null 是有值的,且值为 ,可通过赋值赋给变量

    let logHi = (param = 'hello' ) => {
      console.log(param);
    };
    
    /* 默认值生效 */
    logHi();
    // "hello"
    
    /* 赋值调用 */
    logHi('world');
    // "world"
    
    /* undefined时,默认值生效 */
    logHi(undefined);
    // "hello"
    
    /* null作为值,赋值调用 */
    logHi(null);
    // null
    
    /* NaN作为值,赋值调用 */
    logHi(NaN);
    // NaN

    倘若函数这样写:

    let consoleHi = (param) => {
      param = param || 'hello';
      console.log(param);
    };
    
    /* 默认值生效 */
    consoleHi();
    // "hello"
    
    /* 赋值调用 */
    consoleHi('world');
    // "world"
    
    /* undefined时,默认值生效 */
    consoleHi(undefined);
    // "hello"
    
    /* null作为值为falsy */
    consoleHi(null);
    // "hello"
    
    /* NaN作为值为falsy */
    consoleHi(NaN);
    // "hello"
参考文献:JavaScript — Null vs. Undefined

题外话:不免想起一篇文章,虽然联系不大
趣文:编程其实是文科

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
8个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Karen110 Karen110
4年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
Jacquelyn38 Jacquelyn38
4年前
面试官:JavaScript的数据类型你了解多少?
前言作为JavaScript的入门知识点,Js数据类型在整个JavaScript的学习过程中其实尤为重要。最常见的是边界数据类型条件判断问题。我们将通过这几个方面来了解数据类型:概念检测方法转换方法概念undefined、Null、Boolean、String、Number、Symbol、BigInt为基础类型;Ob
Souleigh ✨ Souleigh ✨
4年前
安利几个JS开发小技巧
开发小技巧<br/1、转换布尔值除了常规的布尔值true和false之外,JavaScript还将所有其他值视为truthy或falsy。除非另有定义,否则JavaScript中的所有值都是truthy,除了0,“”,null,undefined,NaN,当然还有false,这些都是falsy我们可以通过使用负算运算符轻松地
劳伦斯 劳伦斯
4年前
前端面试题自检 JS CSS 部分
JS类型JavaScript的简单数据类型Number,String,Boolean,Undefined,Null,Symboltypeof操作符的返回值numberstringbooleanundefinedobjectfunction
Stella981 Stella981
3年前
AndroidStudio封装SDK的那些事
<divclass"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,2.55,5z"id"raphael
Stella981 Stella981
3年前
JavaScript的 基本数据类型
第一:Javascript对象是第二:Javascript中第三:Javascript的对象是数据;第四:JavaScript中的对象可以简单理解成"名称:值"对(name:value)。名称(name):"名称"部分是一个JavaScript字符串参考https://www
Wesley13 Wesley13
3年前
JS中有趣的知识
1.分号与换行functionfn1(){return{name:'javascript'};}functionfn2(){return{name:'javascript'
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我