许多编程语言都有一个称为null的非值 。它指示一个变量当前不指向一个对象,例如,当它还没有初始化的时候 。
相比之下,JavaScript有两个这样的非值:undefined和null 。在这篇博文中,我们将研究它们有什么不同,以及如何最好地使用或避免它们 。
1. undefined vs. null
这两种值非常相似 , 经常互换使用 。因此,它们的区别是微妙的 。
1.1 ECMAScript语言规范:undefined vs. null
ECMAScript语言规范对其描述如下 。
- undefined是 &34;
- null &34;
在JavaScript中拥有两个非值现在被认为是一个设计错误(甚至被JavaScript的创造者Brendan Eich认为) 。
那为什么不从 JavaScript 中删除其中的一个值呢?JavaScript 的一个核心原则是绝不破坏向后兼容 。这个原则有很多好处 。它最大的缺点是,设计上的错误无法被删除 。
1.3 undefined和null的历史
在Java中(它启发了JavaScript的许多方面),初始化值取决于变量的静态类型 。
- 具有对象类型的变量被初始化为null 。
- 每个原始类型都有自己的初始化值 。例如,int变量被初始化为0 。
undefined 的出现
如果一个变量myVar还没有被初始化,它的值是undefined 。
【5年前学习null和undefined,现在有新的认知,看看这位人才怎么说】let myVar;
assert.equal;
如果一个属性.unknownProp丢失,访问该属性会产生undefined的值 。
const obj = {};
assert.equal;
如果一个函数有一个没有参数的返回语句,该函数隐含地返回undefined 。
function myFunc {
return;
}
assert.equal, undefined);
如果一个参数x被省略了,语言将该参数初始化为undefined 。
function myFunc {
return;
}
assert.equal, undefined);
myFunc;
通过obj?.someProp的可选链路,如果obj未定义或为空,则返回未定义 。
> undefined?.someProp
undefined
> null?.someProp
undefined
3.null 出现情况
一个对象的原型要么是一个对象,要么在原型链的末端是null 。Object.prototype没有原型 。
> Object.getPrototypeOf
null
如果我们将一个正则表达式(如/a/)与一个字符串(如&39;)相匹配,我们要么得到一个带有匹配数据的对象(如果匹配成功) , 要么得到空(如果匹配失败) 。
> /a/.exec
null
JSON数据格式不支持undefined,只支持null 。
> JSON.stringify
&34;b&39;
4.特别处理 undefined 或 null 的运算符4.1 undefined 和参数默认值
在以下情况下,将使用参数默认值 。
- 缺少一个参数 。
- 一个参数的值是undefined 。
function myFunc {
return arg;
}
assert.equal, &39;);
assert.equal, &39;);
assert.equal, &39;);
undefined也触发了参数的默认值 , 这说明它是一个元值 。
下面的例子说明了这一点的用处 。
function concat {
return str1 + str2;
}
function twice { //
return concat;
}
在A行,我们没有为str指定一个参数默认值 。当这个参数缺失时,我们把这个状态转发给concat,让它选择一个默认值 。
4.2 undefined 的和解构的默认值
解构中的缺省值与参数缺省值的工作原理类似–如果一个变量在数据中没有匹配,或者它与undefined的变量匹配,就会使用它们 。
const [a=&39;] = [];
assert.equal;
const [b=&39;] = [undefined];
assert.equal;
const {prop: c=&39;} = {};
assert.equal;
const {prop: d=&39;} = {prop: undefined};
assert.equal;
4.3 undefined 和 null 以及可选链
当通过 value?.prop 进行可选的链接时
- 如果value是undefined或null,则返回 undefined 。也就是说,只要value.prop会抛出一个异常,就会发生这种情况 。
- 否则,返回value.prop 。
// optional static property access
return value?.prop;
}
assert.equal, 123);
assert.equal, undefined);
assert.equal, undefined);
下面两个操作的效果类似 。
obj?.[?expr?] // optional dynamic property access
func?. // optional function or method call
4.4 undefined 和 null 和 nullish 聚结
nullish 合并算子??如果一个值undefined或为null , 则允许我们使用默认值:
> undefined ?? &39;
&39;
> null ?? &39;
&39;
> 0 ?? &39;
0
> 123 ?? &39;
123
> &39; ?? &39;
&39;
> &39; ?? &39;
&39;
null合并赋值操作符??=:
function setName {
obj.name ??= &39;;
return obj;
}
assert.deepEqual,
{name: &39;}
);
assert.deepEqual,
{name: &39;}
);
assert.deepEqual,
{name: &39;}
);
assert.deepEqual,
{name: &39;}
);
5. 处理 undefined 和 null
下面分享一下我们自己的代码中处理undefined 和null的最常见方法 。
5.1 undefined 或 null 都不能作为实际值使用
举例,我们可能希望一个属性file.title永远存在 , 并且永远是一个字符串 。有两种常见的方法来实现这一点 。
这里,只检查undefined和null,而不检查一个值是否是字符串 。你必须自己决定是否要把它作为一个额外的安全措施来实施 。
5.1 undefined 和 null 都是禁止的
如下所示
function createFile {
if{
throw new Error;
}
// ···
}
为什么选择这种方法?
我们想把undefined和null当作一样的东西 , 因为JavaScript代码经常这样做–比如说 。
// 检测一个属性是否存在
if{
obj.requiredProp = 123;
}
const myValue = https://www.30zx.com/myParameter ?? &39;;
如果我们的代码中出现了问题,出现了undefined或null,我们希望它尽可能快地失败 。
5.1.2 undefined 和 null 都会触发默认值
如下所示
function createFile {
title ??= &39;;
// ···
}
我们不能在这里使用参数缺省值,因为它只由undefined 触发 。相反,我们依靠nullish 合并赋值运算符??= 。
为什么选择这种方法?
- 我们想把undefined和null同等对待(见上一节) 。
- 我们希望我们的代码能够稳健地、无声地处理 undefined 和null 。
例如 , 我们可能希望一个属性file.title是一个字符串或 &34;(文件没有标题) 。有几种方法可以实现这一点 。
5.2.1 null是 &34;值function createFile {
if{
throw new Error;
}
return {title};
}
另外,undefined可以触发一个默认值 。
function createFile&34;关闭的 &34;关闭 &34;不是一个值 &34;关闭&34;null&34;null&39;&39;My Diary&39;&39;just&39;nothing&39;&39;just&39;My Diary&39;Dear diary!&39;nothing&39;Reminder: pick a title!&39;My Diary&39;&34;just &34;nothing &34;关闭 &34;关闭 "的值 。
作者:Michael Thiessen 译者:前端小智 dev
原https://2ality.com/2021/01/undefined-null-revisited.html
以上就是朝夕生活(www.30zx.com)关于“5年前学习null和undefined,现在有新的认知,看看这位人才怎么说”的详细内容 , 希望对大家有所帮助!
猜你喜欢
- 红米手机开机只停到黑屏有 mi字母怎麼办
- 十大婴儿推车品牌排行榜:酷尼上榜,第一辈子产范围最大
- 今日头条App出现bug了吗,搜索后下拉到最下面出现undefined
- php提示undefined index的几种解决方法
- 如何解决 JavaScript 中处理 null 和 undefined 的麻烦事
- vue在html中结合axios时,this指向为undefined解决办法
- this 设计缺陷和应对方案
- 香水排行榜前十名男士:博宝利英伦迷情上榜,第一无比强烈
- PHP的Undefined variable错误怎么解决?