undefined、null、isNan

2023-11-17

null 和 undefined的区别

在用法上几乎没有区别:

if (!undefined) 
    console.log('undefined is false');
// undefined is false

if (!null) 
    console.log('null is false');
// null is false

undefined == null
// true

最初设计

JavaScript的最初版本是这样区分的:null是一个表示"无"的对象,转为数值时为0;undefined是一个表示"无"的原始值,转为数值时为NaN。

// 对于 null
let nullValue = null;
let nullToNumber = Number(nullValue);
console.log(nullToNumber); // 输出: 0

// 对于 undefined
let undefinedValue;
let undefinedToNumber = Number(undefinedValue);
console.log(undefinedToNumber); // 输出: NaN

项目实践中的区别

但是,上面这样的区分,在实践中很快就被证明不可行。目前,null和undefined基本是同义的,只有一些细微的差别。

null表示"没有对象",即该处不应该有值。典型用法是:

(1) 作为函数的参数,表示该函数的参数不是对象。

(2) 作为对象原型链的终点。


Object.getPrototypeOf(Object.prototype)
// null

undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。典型用法是:

(1)变量被声明了,但没有赋值时,就等于undefined。

(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。

(3)对象没有赋值的属性,该属性的值为undefined。

(4)函数没有返回值时,默认返回undefined。

var i;
i // undefined

function f(x){console.log(x)}
f() // undefined

var  o = new Object();
o.p // undefined

var x = f();
x // undefined

typeof null 的结果是什么,为什么?

参考:https://www.jianshu.com/p/68c69bd329ee

typeof null 的结果是Object。
在 JavaScript 第一个版本中,所有值都存储在 32 位的单元中,每个单元包含一个小的 类型标签(1-3 bits) 以及当前要存储值的真实数据。类型标签存储在每个单元的低位中,共有五种数据类型:

javascript复制代码000: object - 当前存储的数据指向一个对象。
1: int - 当前存储的数据是一个 31 位的有符号整数。
010: double - 当前存储的数据指向一个双精度的浮点数。
100: string - 当前存储的数据指向一个字符串。
110: boolean - 当前存储的数据是布尔值。

如果最低位是 1,则类型标签标志位的长度只有一位;如果最低位是 0,则类型标签标志位的长度占三位,为存储其他四种数据类型提供了额外两个 bit 的长度。
有两种特殊数据类型:

undefined的值是 (-2)30(一个超出整数范围的数字);
null 的值是机器码 NULL 指针(null 指针的值全是 0)

那也就是说null的类型标签也是000,和Object的类型标签一样,所以会被判定为Object。

如何安全获取undefined的值

直接使用undefined会出现什么问题?undefined是JavaScript的一个全局变量,也就是挂载在window对象上的一个变量,并不是关键字,这意味着可以使用 undefined 来作为一个变量名,但是这样的做法是非常危险的,它会影响对 undefined 值的判断。

因为 undefined 是一个标识符,所以可以被当作变量来使用和赋值,

但是这样会影响 undefined 的正常判断。表达式 void ___ 没有返

回值,因此返回结果是 undefined。void 并不改变表达式的结果,

只是让表达式不返回值。因此可以用 void 0 来获得 undefined。

    // Case 1: 使用undefined作为变量名
    let undefined = "你好";
    console.log(undefined); // Output: "你好"

    // Case 2: 使用 void 0
    let safeUndefined = void 0;
    console.log(safeUndefined); // Output: undefined

isNaN 和 Number.isNaN

函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。
函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

undefined、null、isNan 的相关文章

随机推荐

  • 调试osgEarth(33)分页瓦片卸载器子节点的作用-(3)渲染遍历的帧号和时间设置-TerrainCuller赋值给可渲染图层--TerrainRenderData--深度摄像机

    继续调试 可见 在当前环境下 definelist为空 不会再有 OE IS DEPTH CAMERA 因此不是深度摄像机 果然为false 总结下 这里是通过摄像机的状态集的 definelist是否包含 OE IS DEPTH CAME
  • 论文阅读-多任务(2020)-KL4MTL:用于多任务学习的知识蒸馏方法

    KL4MTL 论文 Knowledge Distillation for Multi task Learning 地址 https paperswithcode com paper knowledge distillation for mu
  • 应用MATLAB求解线性代数题目(五)——特征值与特征向量

    目录 特征值和特征向量 相似矩阵 orth 将矩阵正交规范化 特征值和特征向量 我们先看一下特征值和特征向量的定义 可见 特征值可以通过特征方程 行列式 求得 则特征值与特征向量只存在于方阵中 根据MATLAB中的帮助文档 help eig
  • myeclipse 2019.4 使用

    在下主张开源 链接 https pan baidu com s 1953feWjM8p67LGl lLu9fg 提取码 o3d8 如有失效 请联系 QQ 1193754711 积分不富足的共同进步 在下需要积分 https download
  • 计算机网络第2章(物理层)

    计算机网络第2章 物理层 一 物理层的基本概念 二 物理层下面的传输媒体 2 1导引型传输媒体 2 2非导引型传输媒体 三 传输方式 3 1串行传输和并行传输 3 2同步传输和异步传输 3 3单向通信 双向交替通信 双向同时通信 四 编码与
  • Node.JS学习笔记: 基础篇

    基础概念 三大件 浏览器 服务器 数据库 1 浏览器 在这里主要是关注浏览器的作用是发送请求 比如发送一个HTTP请求 喂 把 index html的文档发给我 至于如何发送请求 服务器又如何处理请求 这方面需要HTTP TCP IP的知识
  • 95-30-012-Channel-AbstractNioChannel

    文章目录 1 概述 2 类图 3 NioUnsafe 4 AbstractNioChannel 4 1 Connect事件框架 4 2 FinishConnect事件框架 4 3 Flush事件细节 4 4 构造方法 4 5 doRegis
  • 系统变量

    系统变量 由 操作系统定义的数据存储位置 无论谁登录该计算机 该位置都相同 Administrators 组的用户可以添加新的变量或更改这些值 编辑本段变量设置实例 格式 变量名 实际含义 homedrive 当前启动的系统的所在分区 一般
  • Android路由方案ARouter分析

    一 路由方案 原生的路由方案缺点 显式 直接的类依赖 耦合严重 隐式 规则集中式管理 协作困难 Manifest扩展性较差 跳转过程无法控制 失败无法降级 ARouter的优势 使用注解 实现了映射关系自动注册 与 分布式路由管理 编译期间
  • Python 异常处理指南

    异常处理是编写健壮的 Python 程序时不可或缺的一部分 当程序运行中发生错误时 异常处理机制可以捕获并处理这些错误 从而保证程序的稳定性和可靠性 本文将为您介绍 Python 中的异常处理机制 并提供一些常见的异常处理技巧和示例代码 异
  • git init报错:‘git‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

    背景 已经安装git 但是使用命令行git init的时候 报错 git 不是内部或外部命令 也不是可运行的程序 或批处理文件 原因 因为没有成功配置环境变量 所以我们要手动添加一个环境变量 解决方法 1 在桌面找到此电脑 右键 选择 属性
  • 并发控制五(封锁的粒度)

    封锁对象的大小称为封锁粒度 封锁对象可以是逻辑单元 也可以是物理单元 以关系数据库为例 封锁对象可以是这样一些逻辑单元 属性值 属性值的集合 元组 关系 索引项 整个索引直至整个数据库 也可以是这样一些物理单元 页 数据页或索引页 物理记录
  • CentOS7安装部署wordpress

    环境介绍 CentOS7 3安装部署wordpress 本环境主机运行在阿里云 部署方式为单节点部署 主机配置 系统 CentOS7 3 mini CPU 1核 内存 1GB 硬盘 60G 外网带宽 1Mbs 一 配置主机名 root lo
  • mysql explain ref const_MySQL EXPLAIN 详解

    一 介绍 EXPLAIN 命令用于SQL语句的查询执行计划 这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的 这条命令并没有提供任何调整建议 但它能够提供重要的信息帮助你做出调优决策 先解析一条sql语句 你可以看
  • pytorch 实现LSTM

    Pytorch基础知识点整理 梯度 下降 coding utf 8 from math import pi import torch import torch optim x torch tensor pi 3 pi 6 requires
  • js数组不同类型元素去重

  • Ubuntu 16.04 服务器安装 hadoop3.1.2

    1 事前准备 1 相关配置信息 仅供参考 ubuntu版本为16 04服务器版 服务器配置为1核2GB hadoop版本我选择hadoop3 1 2 2 相关资源获取 服务器可选择国内的腾讯云和阿里云 也可以选择华为云 任君喜好 系统的话在
  • 校园社区app

    此项目是面向在校大学生开发的一个集预约购物 组织活动 实事热帖于一体的社区app 前后台交互数据采用的是json数据格式 网络请求采用的是volley 后台采用mysql数据库 如果有写的不好的地方还望大家指正 主要功能为 预约购物 组织活
  • DataGrip 2022.2.2 Unknown column ‘generation_expression‘ in ‘field list‘

    安装DataGrip 2022 2 2 连接本地数据库 编写脚本时发现无法自动提示数据库表字段 搜索结果 都是在连接属性 Options Introspection using JDBC metadata 在此版本没有发现此选项 查找发现在
  • undefined、null、isNan

    null 和 undefined的区别 在用法上几乎没有区别 if undefined console log undefined is false undefined is false if null console log null i