当前位置: 首页 > 科技观察

JavaScript中关于null的一切

时间:2023-03-20 01:46:52 科技观察

本文由作者@DmitriPavluti翻译授权翻译JavaScript有2种类型:基本类型(字符串、布尔数、符号)和对象。对象是复杂的数据结构,JS中最简单的对象就是一个普通的对象:一组键和相关联的值:letmyObject={name:'FrontendXiaozhi'}但在某些情况下,无法创建对象。在这种情况下,JS提供了一个特殊的值null——表示对象不存在。letmyObject=null在本文中,我们将了解有关JavaScript中null的所有知识:它的含义、如何检测它、null和undefined之间的区别,以及为什么使用null会使代码维护变得困难。1、null的概念JS规范对null的信息进行了解释:值null指的是指定对象的值没有被设置,它是JS的基本类型之一,在布尔运算中被认为是falsy。例如,函数greetObject()创建对象,但如果无法创建对象,也可以返回null:函数greetObject(who){if(!who){returnnull;}return{message:`Hello,${who}!`};}greetObject('Eric');//=>{message:'Hello,Eric!'}greetObject();//=>null但是,当调用函数greetObject()时没有参数,函数返回null。返回null是合理的,因为who参数没有值。2.如何检查null检查null值的一个好方法是使用严格相等运算符:constmissingObject=null;constexistingObject={message:'Hello!'};missingObject===null;//=>trueexistingObject===null;//=>falsemissingObject===null计算结果为true,因为missingObject变量包含空值。如果变量包含非空值(例如对象),则表达式existObject===null的计算结果为false。2.1null是假值null和false、0、''、undefined、NaN都是假值。如果在条件语句中遇到falsy值,那么JS会将falsy值强制为false。Boolean(null);//=>falseif(null){console.log('nullistruthy')}else{console.log('nullisfalsy')}2.2typeofnulltypeof值运算符确定值的类型。例如,typeof15是“number”,typeof{prop:'Value'}的计算结果是“object”。有趣的是看typenull的结果是typeofnull;//=>为什么'object'是'object',拼写错误nullbeingobject是早期JS实现中的一个错误。要检测空值,请使用typeof运算符。如前所述,使用严格相等运算符myVar===null。如果我们想使用typeof运算符来检查一个变量是否是一个对象,我们还需要排除空值:functionisObject(object){returntypeofobject==='object'&&object!==null;}isObject({prop:'值'});//=>trueisObject(15);//=>falseisObject(null);//=>false3.nullnull的陷阱往往在我们认为变量是对象的时候意外出现。然后,如果从null中提取属性,JS会抛出错误。再次使用greetObject()函数,并尝试从返回的对象中访问message属性:letwho='';greetObject(who).message;//throws"TypeError:greetObject()isnull"因为who变量为空string,so函数返回null。从null访问message属性时,将引发TypeError错误。可以通过使用带有空合并的可选链接来处理空值:letwho=''greetObject(who)?.message??'Hello,Stranger!'//=>'Hello,Stranger!'4.null方法的替代方案当无法构造对象时,我们通常的做法是返回null,但这种做法有缺点。只需检查执行堆栈中的空值。尝试避免返回null的事情:返回默认对象而不是null抛出错误而不是返回null回到开始返回问候对象的greetObject()函数。当缺少参数时,可以返回默认对象而不是null:functiongreetObject(who){if(!who){who='Stranger';}return{message:`Hello,${who}!`};}greetObject('Eric');//=>{message:'Hello,Eric!'}greetObject();//=>{message:'Hello,Stranger!'}或抛出错误:functiongreetObject(who){if(!who){thrownewError('"who"argumentismissing');}return{message:`Hello,${who}!`};}greetObject('Eric');//=>{message:'Hello,Eric'!'}greetObject();//=>throwsanerror这两个方法可以避免使用null。5.nullvsundefinedundefined是未初始化的变量或对象属性的值,undefined是未初始化的变量或对象属性的值。letmyVariable;myVariable;//=>undefinednull和undefined的主要区别在于null表示缺少对象,而undefined表示未初始化状态。严格相等运算符===区分null和undefined:null===undefined//=>false而双重相等运算符==认为null和undefined相等null==undefined//=>true我用的是双重相等检查变量是否为空或未定义的运算符:functionisEmpty(value){returnvalue==null;}isEmpty(42);//=>falseisEmpty({prop:'Value'});//=>falseisEmpty(null);//=>trueisEmpty(undefined);//=>true6。总结null是JavaScript中的一个特殊值,表示缺少对象。严格相等运算符判断变量是否为空:variable===null。typoef运算符可用于确定变量的类型(数字、字符串、布尔值)。但是,如果为null,则typeof会产生误导:typeofnull的计算结果为“object”。null和undefined在某种程度上是等价的,但是null表示没有对象,而undefined是未初始化状态。作者:DmitriPavluti译者:倩倩小智来源:dmitripavlutin原文:https://dmitripavlutin.com/javascript-null/#comments本文转载自微信公众号“大运世界”,可通过以下方式关注二维码。转载请联系大千世界公众号。