null和undefined相等吗(null undefined区别)
null和undefined相等吗(null undefined区别),新营销网红网本栏目通过数据整理汇集了null和undefined相等吗(null undefined区别)相关信息,下面一起看看。
许多编程语言都有一个名为null的非值。它表示一个变量当前没有指向一个对象,例如,当它还没有被初始化时。
相比之下,JavaScript有两个这样的非值:undefined和null。在这篇博文中,我们将研究它们有何不同,以及如何最好地使用或避免它们。
1.undefined vs. null这两个值非常相似,经常互换使用。因此,他们的差异是微妙的。
1.1 ECMAScript语言规范3360未定义与空ECMAScript语言规范描述如下。
当变量没有赋值时,使用Undefined。
Null意味着没有对象值。
1.2两个非值——一个不可磨灭的错误在JavaScript中有两个非值现在被认为是设计错误(甚至被JavaScript的创造者Brendan Eich认为)。
那么为什么不从JavaScript中删除其中一个值呢?JavaScript的一个核心原则是永远不要破坏向后兼容性。这个原则有很多优点。它最大的缺点是设计错误无法删除。
1.3 undefined和null的历史在Java中(启发了JavaScript的很多方面),初始化值取决于变量的静态类型。
具有对象类型的变量被初始化为null。
每个基本类型都有自己的初始化值。例如,int变量被初始化为0。
在JavaScript中,每个变量都可以保存对象值和基本类型值。因此,如果null表示它不是对象,那么JavaScript也需要一个初始化值,这意味着它既不是对象,也不是原始值。该初始化值未定义。
undefined的出现如果一个变量myVar没有初始化,它的值就是undefined。
letmyVarassert.equal(myVar,undefined);如果一个属性。缺少unknownProp,访问此属性将产生未定义的值。
const obj={ };assert.equal(obj.unknownProp,undefined);如果函数有不带参数的return语句,则该函数隐式返回undefined。
functionmyFunc(){ return;assert.equal(myFunc(),未定义);如果省略参数x,语言会将该参数初始化为undefined。
functionmyFunc(){ return;assert.equal(myFunc(),未定义);my func();通过obj?的可选链接。someProp,如果obj未定义或为空,则为undefined。
未定义?somePropundefined null?somePropundefined3.null出现对象的原型要么是对象,要么是原型链末端的null。Object.prototype没有原型。
object . get prototype of(object . prototype)null如果我们将一个正则表达式(比如/a/)与一个字符串(比如x)进行匹配,要么得到一个带有匹配数据的对象(如果匹配成功),要么得到null(如果匹配失败)。
/a/。exec(x )nullJSON数据格式不支持undefined,只支持null。
JSON . stringify({ a : undefined,b:null}) {b:null} 4。运算符4.1 undefined和参数默认值对于undefined或null的特殊处理在下列情况下,将使用参数默认值。
缺少一个参数。
参数的值未定义。
例如:
function my func(arg=ABC){ return rg;} assert.equal (myfunc (hello),helloassert.equal (myfunc()),ABC assert . equal(my func(undefined)),abcundefined也触发参数的默认值,说明是元值。
下面的例子说明了这一点的用处。
functionconcat(str1=,str 2=){ return str 1 str 2;} function twice(str){//(A)return concat(str,str);}在A行,我们没有为str指定参数默认值。当缺少这个参数时,我们将这个状态转发给concat()并让它选择一个默认值。
4.2未定义和解构的默认值解构中的默认值与参数默认值的工作方式类似——如果变量在数据中不匹配,或者它与未定义的变量匹配,则它们将被使用。
const[a=a]=[];assert.equal(a,a const[b=b]=[undefined];assert.equal(b,b const { prop:c=c }={ }assert.equal(c,c const { prop :d=d }={ prop : undefined };assert.equal(d,d 4.3 undefi
ned 和 null 以及可选链
当通过value?.prop进行可选的链接时
如果value是undefined或null,则返回undefined。也就是说,只要value.prop会抛出一个异常,就会发生这种情况。
否则,返回value.prop。
functiongetProp(value){//optionalstaticpropertyaccessreturnvalue?.prop;assert.equal(getProp({prop:123}),123);assert.equal(getProp(undefined),undefined);assert.equal(getProp(null),undefined);
下面两个操作的效果类似。
obj?.[«expr»]//optionaldynamicpropertyaccessfunc?.(«arg0»,«arg1»)//optionalfunctionormethodcall4.4 undefined 和 null 和 nullish 聚结
nullish 合并算子??如果一个值undefined或为null,则允许我们使用默认值:
undefined?? defaultvalue defaultvalue null?? defaultvalue defaultvalue 0?? defaultvalue 0 123?? defaultvalue 123 ?? defaultvalue abc ?? defaultvalue abc
null合并赋值操作符??=:
functionsetName(obj){obj.name??= (Unnamed) returnobj;}assert.deepEqual(setName({}),{name: (Unnamed) });assert.deepEqual(setName({name:undefined}),{name: (Unnamed) });assert.deepEqual(setName({name:null}),{name: (Unnamed) });assert.deepEqual(setName({name: Jane }),{name: Jane });5. 处理 undefined 和 null
下面分享一下我们自己的代码中处理undefined和null的最常见 。
5.1 undefined 或 null 都不能作为实际值使用
举例,我们可能希望一个属性file.title永远存在,并且永远是一个字符串。有两种常见的 来实现这一点。
这里,只检查undefined和null,而不检查一个值是否是字符串。你必须自己决定是否要把它作为一个额外的安全措施来实施。
5.1 undefined 和 null 都是禁止的
如下所示
functioncreateFile(title){if(title===undefined
title===null){thrownewError( `title`mustnotbenullish }//···}
为什么选择这种 ?
我们想把undefined和null当作一样的东西,因为JavaScript代码经常这样做--比如说。
//检测一个属性是否存在if(!obj.requiredProp){obj.requiredProp=123;}constmyValue=myParameter?? somedefault
如果我们的代码中出现了问题,出现了undefined或null,我们希望它尽可能快地失败。
5.1.2 undefined 和 null 都会触发默认值
如下所示
functioncreateFile(title){title??= (Untitled) //···}
我们不能在这里使用参数缺省值,因为它只由undefined触发。相反,我们依靠nullish 合并赋值运算符??=。
为什么选择这种 ?
我们想把undefined和null同等对待(见上一节)。
我们希望我们的代码能够稳健地、无声地处理undefined和null。
5.2 undefined 或 null 都是“关闭”值
例如,我们可能希望一个属性file.title是一个字符串或 关闭 (文件没有标题)。有几种 可以实现这一点。
5.2.1 null是 关闭的 值functioncreateFile(title){if(title===undefined){thrownewError( `title`mustnotbeundefined }return{title};}
另外,undefined可以触发一个默认值。
functioncreateFile(title= (Untitled) ){return{title};}
为什么选择这种 ?
我们需要一个表示“关闭”的非值。
我们不希望我们的非值触发参数默认值和解构默认值。
我们想把非值字符串化为JSON(这是我们不能用undefined做的)。
5.2.2 undefined 是 关闭的 值。functioncreateFile(title){if(title===null){thrownewError( `title`mustnotbenull }return{title};}
为什么选择这种 ?
我们需要一个表示“关闭”的非值。
我们确实想让我们的非值触发参数默认值和解构默认值。
5.2.3 为什么不同时使用undefined和null作为 关闭 的值?
当接收一个值时,把undefined和null都当作 不是一个值 是有意义的。然而,当我们创建值时,我们希望不含糊,以便处理这些值时保持简单。
这指向了一种不同的 。如果我们需要一个 关闭 的值,但又不想使用undefined或null作为这样的值,怎么办?请往下看。
5.3 处理“关闭”的其他方式5.3.1 特殊值
我们可以创建一个特殊的值,每当属性.title被关闭时,我们就使用这个值。
constUNTITLED=Symbol( UNTITLED constfile={title:UNTITLED,};5.3.2 空对象模式
空对象模式来自于面向对象的编程。
一个共同的超类的所有子类都有相同的接口。
每个子类都实现了一个实例运行的不同模式。
其中一个模式是 null 。
在下面的例子中,UntitledFile实现了 null 模式。
//抽象的超类classFile{constructor(content){if(new.target===File){thrownewError( Can’tinstantiatethisclass }this.content=content;}}classTitledFileextendsFile{constructor(content,title){super(content);this.title=title;}getTitle(){returnthis.title;}}classUntitledFileextendsFile{constructor(content){super(content);}getTitle(){return (Untitled) }}constfiles=[newTitledFile( Deardiary! , MyDiary ),newUntitledFile( Reminder:pickatitle! ),assert.deepEqual(files.map(f= f.getTitle()),[ MyDiary , (Untitled) ,]);
我们也可以只对标题使用空对象模式(而不是对整个文件对象)。
5.3.3 Maybe 类型
Maybe 类型是一种函数编程技术。
functiongetTitle(file){switch(file.title.kind){case just :returnfile.title.value;case nothing :return (Untitled) default:thrownewError();}}constfiles=[{title:{kind: just ,value: MyDiary },content: Deardiary! ,},{title:{kind: nothing },content: Reminder:pickatitle! ,},assert.deepEqual(files.map(f= getTitle(f)),[ MyDiary , (Untitled) ,]);
我们可以通过Arrays对 just 和 nothing 进行编码。我们的 的好处是,它得到了TypeScript的良好支持(通过判别性联合)。
6.我的
我不喜欢用undefined作为 关闭 的值,有三个原因。
undefined经常意外地出现在JavaScript中。
ndefined会触发参数和结构化的默认值(出于同样的原因,有些人喜欢undefined)。
因此,如果我需要一个特殊的值,我会使用以下两种 中的一种。
我使用null作为一个 关闭 的值。(作为一个旁观者,这种 在TypeScript中得到了比较好的支持)。)
我通过上述的技术之一来避免undefined和null。这样做的好处是比较干净,坏处是涉及更多的工作。
相关文章
十大巅峰网游小说(十大公认网游小说神作推荐)
百度网盘登陆入口(百度网盘共享群的正确使用方法)
恶人传评价(《恶人传》以暴制暴成了救赎)
百度网盘登录入口(百度网盘安装方法)
番禺中学排名(番禺区热门学校盘点)
马路标志(交通安全标示大全及图解)
苹果序列号是哪个(iPhone序列号知识扫盲)
故宫太和殿介绍(故宫的太和殿为什么叫金銮殿)
东营人均gdp(中国人均GDP前15强城市)
陆贞原型(陆贞传奇的原型各个奇葩)
硫酸铜什么颜色(硫酸铜的用途与危害)
小米平板4参数(小米平板4参数全曝光)
更多null和undefined相等吗(null undefined区别)相关信息请关注本文章,本文仅仅做为展示!