我想知道JavaScript中null和undefined之间的区别。
当前回答
已经给出了很多“技术性”的答案,从JS仅仅是一种编程语言的有限角度来看,所有答案都是正确的。
然而,我想补充以下想法,特别是当您将TypeScript代码作为更大项目/(企业)应用程序的一部分时:
当与某种后端交谈时,您很可能会收到JSON虽然一些后端正确地避免了在JSON中使用“null”(删除那些财产),但其他后端没有这样做现在,虽然“null”可能意味着该值是故意缺失的,但更多情况下,它并没有传达这一含义。大多数数据库使用“null”只是因为它们没有“undefined”类型。但真正的含义只是“未定义”。因此,您永远无法知道“null”值是否真的意味着故意缺席。因此,“空”并不意味着故意选择“缺失值”。一般来说,这是无法决定的。因此,在语义上,“null”和“undefined”实际上是完全相同的。
因此,为了协调一致,我坚决反对使用“null”,并希望鼓励您停止在代码中使用“null“。这比你想象的要容易得多。别误会我。我不是说不处理“null”值,只是为了避免在代码中显式使用它们。换句话说:您的代码应该仍然能够处理来自应用程序外部的意外传递的“null”值,例如通过第三方库(如Angular)或第三方后端。
以下是实现这一目标的指导原则:
避免直接的未定义类型保护(例如,如果(值==未定义){…}。相反,使用间接类型保护(也称为真实性检查),例如if(value){…}每当0或空字符串有意义时,请使用像Lodash的isNil这样的显式助手方法或在比较中包含有意义的值(例如,如果(!value&&value!==0){…})考虑使用不允许使用null的lint规则
其他回答
这种差异可以用卫生纸架来解释:
一个非零值就像一个拿着一卷卫生纸的支架,管上还有卫生纸。零值就像一个空马桶纸巾管的支架。空值就像一个连纸巾管都没有的支架。未定义的值类似于缺少持有者本身。
undefined和null之间的差别很小,但有区别。值未定义的变量从未初始化。值为null的变量被显式指定为null,这意味着该变量被显地设置为没有值。如果使用null==undefined表达式比较undefineed和null,它们将相等。
Null始终是内存中存在的未知对象,而undefined则不是。
看看这个。输出值一千字。
var b1=文档.getElementById(“b1”);checkif(“1,无参数”);checkif(“2,显式未定义”,未定义);checkif(“3,显式空”,空);checkif(“4,the 0”,0);checkif(“5,空字符串”,“”);checkif(“6,string”,“string”);checkif(“7,number”,123456);函数checkif(a1,a2){print(“\ncheckif(),”+a1+“:”);如果(a2==未定义){打印(“==未定义:是”);}其他{打印(“==未定义:否”);}如果(a2==未定义){打印(“==未定义:是”);}其他{打印(“==未定义:否”);}如果(a2==空){打印(“==null:YES”);}其他{打印(“==null:NO”);}如果(a2==空){打印(“==空:是”);}其他{打印(“==null:NO”);}如果(a2==“”){打印(“=='':是”);}其他{打印(“=='':否”);}如果(a2==“”){打印(“=='':是”);}其他{打印(“=='':否”);}如果(isNaN(a2)){打印(“isNaN():是”);}其他{打印(“isNaN():否”);}如果(a2){打印(“如果-?:是”);}其他{打印(“如果-?:否”);}打印(“typeof():”+typeof(a2));}函数打印(v){b1.innerHTML+=v+“\n”;}<!DOCTYPE html><html><body><pre id=“b1”></pre></body></html>
另请参见:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefinedhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaNhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/nullhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators
干杯
除了不同的含义外,还有其他区别:
对象析构函数对这两个值的作用不同:常量{a=“默认”}={a:未定义};//a是“默认值”常量{b=“默认”}={b:null};//b为空JSON.stringify()保持null,但省略未定义const json=json.stringify({undefinedValue:undefined,nullValue:null});console.log(json);//打印{“nullValue”:null}运算符类型console.log(类型未定义);//“未定义”console.log(类型为空);//“object”而不是“null”
推荐文章
- 我如何使用Jest模拟JavaScript的“窗口”对象?
- 我如何等待一个承诺完成之前返回一个函数的变量?
- 在JavaScript中根据键值查找和删除数组中的对象
- 使嵌套JavaScript对象平放/不平放的最快方法
- 如何以及为什么'a'['toUpperCase']()在JavaScript工作?
- 有Grunt生成index.html不同的设置
- 文档之间的区别。addEventListener和window。addEventListener?
- 如何检查动态附加的事件监听器是否存在?
- 如何写setTimeout与参数Coffeescript
- 将JavaScript字符串中的多个空格替换为单个空格
- JavaScript: override alert()
- 重置setTimeout
- 如何确保<select>表单字段被禁用时提交?
- jQuery有不聚焦的方法吗?
- 反应钩子-正确的方式清除超时和间隔