一文彻底搞懂javascript中的undefined
undefined in javascript
undefined
是可以说是javascript中最特殊的一个类型,许多其他语言中都没有这个类型。它表示一个变量已经声明,但还没有被赋值。
let a; // a的值是undefined
如果没有掌握好undefined
,则可能会写出一些非常业余的代码,我们来看一个例子,这是在做code review时遇到的真实例子,你能看出下面的代码有什么问题吗?
function getUserName(user) {
if (user) {
return user.name;
} else {
return undefined;
}
}
在揭晓答案之前,我们先系统学习一下什么情况下JavaScript会产生undefined
类型。
1. 显式undefined
类型
const a = undefined;
console.log(a); // undefined.
2. 未初始化的变量
let a;
console.log(a); // undefined.
3. 访问对象中不存在的属性
const person = {
name: 'zdd',
age: 41,
};
console.log(person.gender); // undefined.
const a = [1, 2, 3];
console.log(a[3]); // 数组只有三个元素,而a[3]表示第四个元素,所以它们的值是undefined
4. 函数没有返回值
函数没有返回值的时候,实际上返回的就是undefined
。
function test() {
console.log('hello, world!');
}
console.log(test()); // undefined.
5. 调用函数没有传递对应的参数
下面的代码中,函数add
没有传入任何参数,所以a
和b
的值都是undefined
。
function add(a, b) {
console.log(a); // 输出undefined.
console.log(b); // 输出undefined.
return a + b;
}
add(); // 没有传递参数
undefined
!= not defined
需要注意的是,undefined
和not defined
是两个不同的概念。undefined
表示一个变量已经声明但还没有被赋值,而not defined
表示一个变量没有被声明。
let a;
console.log(a); // undefined.
console.log(b); // error, b is not defined
undefined
vs void 0
既然已经有了undefined
,为什么有很多JavaScript库中还使用void 0
呢? 原因就是undefined
是一个值,而不是关键字,能被用户串改,看下面的代码:
const undefined = 1; // undefined被用户篡改!
const add = (a, b) => {
// 这里判断参数是否传入,结果失效了,因为undefined值在前面被改成了1
if (a === undefined || b === undefined) {
console.error('请输入两个数');
} else {
return a + b;
}
};
add(1, 2); // 这里会执行add函数中的if分支,是不是很崩溃?
使用void 0
就不会有这个问题。
const undefined = 1;
const add = (a, b) => {
// 写成void 0就没有问题了,无论undefined被改成什么,都不影响。
if (a === void 0 || b === void 0) {
console.error('请输入两个数');
} else {
return a + b;
}
};
console.log(add(1, 2));
那么为什么void 0
返回undefined
呢?这是因为void
是一个操作符,它的作用是对其后面的表达式求值,然后返回undefined
。在JavaScript中,void 0
等价于undefined
,其实你也可以写void 1
, void 'hello'
等,结果都是undefined
。
void expression
的求值规则 - 先对expression
求值,然后返回undefined
正则表达式中的undefined
在正则表达式中,可以使用test
来测试某个字符串是否满足特定的规则。
console.log(/^hello/.test('hello, world!')); //true
如果你没有传递参数给test
,那么它会尝试匹配字符串undefined
.
console.log(/undefined/.test()); // true
This is equivalent to the following code, since undefined
convert to string is 'undefined'
, so the result is true.
console.log(/undefined/.test(undefined));
详情请看这里
undefined
vs null
undefined
和null
经常被放到一起比较,那么他们之间有什么区别呢?
undefined
表示一个变量已经声明但还没有被赋值,null
表示一个变量已经被赋值为一个空值。null
是JS中的关键字,但是undefined
是一个全局属性。
undefined与其他类型之间的转换
这里面比较特殊的是和数字类型之间的转换,undefined
转换为数字类型时会返回NaN
,而null
转换为数字时会返回0
。
console.log(String(undefined)); // "undefined"
console.log(Number(undefined)); // NaN
console.log(Boolean(undefined)); // false
注意null
转换为其他类型时与undefined
的区别
console.log(String(null)); // "null"
console.log(Number(null)); // 0
console.log(Boolean(null)); // false
回到文章开始的问题,根据上面第四点,函数没有返回值时,返回的就是undefined
,所以上面的代码可以简化为如下形式,else分支完全没有必要。
function getUserName(user) {
if (user) {
return user.name;
}
}
References:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#undefined_type
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/void
一文彻底搞懂javascript中的undefined的更多相关文章
- 一文彻底搞懂JavaScript中的prototype
prototype初步认识 在学习JavaScript中,遇到了prototype,经过一番了解,知道它是可以进行动态扩展的 function Func(){}; var func1 = new Fu ...
- 来一轮带注释的demo,彻底搞懂javascript中的replace函数
javascript这门语言一直就像一位带着面纱的美女,总是看不清,摸不透,一直专注服务器端,也从来没有特别重视过,直到最近几年,javascript越来越重要,越来越通用.最近和前端走的比较近,借此 ...
- 彻底搞懂JavaScript中的继承
你应该知道,JavaScript是一门基于原型链的语言,而我们今天的主题 -- "继承"就和"原型链"这一概念息息相关.甚至可以说,所谓的"原型链&q ...
- 一文彻底搞懂Java中的环境变量
一文搞懂Java环境变量 记得刚接触Java,第一件事就是配环境变量,作为一个初学者,只知道环境变量怎样配,在加上各种IDE使我们能方便的开发,而忽略了其本质的东西,只知其然不知其所以然,随着不断的深 ...
- 一张图搞懂 Javascript 中的原型链、prototype、__proto__的关系 转载加自己的总结
1. JavaScript内置对象 所谓的内置对象 指的是:JavaScript本身就自己有的对象 可以直接拿来就用.例如Array String 等等.JavaScript一共有12内置对象 ...
- 彻底搞懂javascript中的match, exec的区别
在工作中经常发现一些同学把这两个方法搞混,以致把自己弄的很郁闷.所以我和大家一起来探讨一下这两个方法的奥妙之处吧. 我们分以下几点来讲解: 相同点: 1.两个方法都是查找符合条件的匹配项,并以数组形式 ...
- 一分钟搞懂JavaScript中的JSON对象
JSON(JavaScript Object Notation)是表示值和对象的通用格式. JavaScript 提供了如下方法: JSON.stringify 将对象转换为 JSON. JSON.p ...
- 来吧,一文彻底搞懂Java中的Comparable和Comparator
大家好,我是沉默王二,今天在逛 programcreek 的时候,我发现了一些专注细节但价值连城的主题.比如说:Java 的 Comparable 和 Comparator 是兄弟俩吗?像这类灵魂拷问 ...
- 来吧,一文彻底搞懂Java中最特殊的存在——null
没事的时候,我并不喜欢逛 P 站,而喜欢逛 programcreek 这些技术型网站,于是那天晚上,在夜深人静的时候,我就发现了一个专注基础但不容忽视的主题.比如说:Java 中的 null 到底是什 ...
- 轻松搞懂Java中的自旋锁
前言 在之前的文章<一文彻底搞懂面试中常问的各种“锁”>中介绍了Java中的各种“锁”,可能对于不是很了解这些概念的同学来说会觉得有点绕,所以我决定拆分出来,逐步详细的介绍一下这些锁的来龙 ...
随机推荐
- <HarmonyOS第一课07>从网络获取数据
视频链接: https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101717497918284399?ha_sou ...
- packer 学习笔记
前言 网上有一个老哥用 packer 制作镜像的博客里开篇就提到[1]. Failure is success in progress. -- Albert Einstein 不要害怕失败,在用 pa ...
- 模板导入_分页_cookie_装饰器_实例
程序目录 urls.py """s14_day21 URL Configuration"""from django.contrib impo ...
- pyspark - 逻辑回归
是在整理文件时, 翻到的, 感觉是好久以前的代码了, 不过看了, 还是可以的. 起码注释还是蛮清晰的. 那时候我真的是妥妥的调包man.... # 逻辑回归-标准化套路 from pyspark.ml ...
- VitePress 集成 Twikoo 评论
Twikoo 是一个简洁.安全.免费的静态网站评论系统. 主要特点:免费搭建,部署简单,功能很完善,隐私护安全,通知发邮件,管理有内嵌,总之免费又方便 关于后端部署,大家可以看官网,或者这篇 Vite ...
- ListBox横向排布Item
<Window x:Class="TwoColumnListBox.MainWindow" xmlns="http://schemas.microsoft.com/ ...
- ComfyUI+通义万相 Wan2.1系列生成视频教程
一.Wan2.1系列 Wan2.1 系列是阿里巴巴通义实验室推出的开源视频生成模型套件,共有 4 个模型,包括文生视频的 Wan2.1-T2V-1.3B 和 Wan2.1-T2V-14B,以及图生视频 ...
- A* 合集
板子那篇烂尾了,等 \(25\) 年 \(csp\) 时再继续写吧 CF1620E Replace the Numbers 点击查看代码 #include<bits/stdc++.h> u ...
- odoo14本地windows安装报错汇总
odoo14安装libsass报错C++啥的解决办法:pip install wheel: pip install libsass-0.20.1-......whl 注意:whl版本应与python版 ...
- Spring Boot线程池简单监控|转
背景 在我们实际项目开发中,常常会为不同优先级的任务设置相对应的线程池.一般我们只关注相关池的相关参数如核心线程数据,最大线程数据等等参数,容易忽略了对线程池中实际运行情况的监控. 综上所述:线程 ...