热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaScript·随记Nullvs.Undefined

刚学了一些Markdown的基础语法,试着用一下。相干文档:Markdown基础语法合营基础运用相同点:null和undefined都是js的基础数据范例扩大:JS的6种基础数据范

刚学了一些 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…,有点懵逼,确切考证了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前提推断时的逻辑值(而非介入逻辑运算时的逻辑值,下文会提到),比方:

!! ""
// 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

另一点须要注重的是,它不做为介入逻辑运算时的逻辑值,比方:

!! 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

题外话:难免想起一篇文章,虽然联络不大
趣文:编程现实上是文科


推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Week04面向对象设计与继承学习总结及作业要求
    本文总结了Week04面向对象设计与继承的重要知识点,包括对象、类、封装性、静态属性、静态方法、重载、继承和多态等。同时,还介绍了私有构造函数在类外部无法被调用、static不能访问非静态属性以及该类实例可以共享类里的static属性等内容。此外,还提到了作业要求,包括讲述一个在网上商城购物或在班级博客进行学习的故事,并使用Markdown的加粗标记和语句块标记标注关键名词和动词。最后,还提到了参考资料中关于UML类图如何绘制的范例。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
author-avatar
蓝紫藤田_835
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有