【问题标题】:why does javascript have both null and undefined? [duplicate]为什么 javascript 同时具有 null 和 undefined ? [复制]
【发布时间】:2020-07-17 02:12:45
【问题描述】:

为什么javascript有nullundefined?它们似乎都意味着同一件事,there's nothing here 并且它们都是虚假的,因为它们应该是。但这意味着,例如,如果我想检查是否存在某些东西,但它可能是 {}[]0 或其他一些我必须检查的虚假内容

if(thing !== undefined && thing !== null)

另外,我知道typeof nullObjecttypeof {} 也是Objecttypeof undefined"undefined" 但是

const nullVariable = null;
console.log(nullVariable.x) // => error
const emptyVariable = {};
console.log(emptyVariable.x) // => undefined
const undefinedVariable;
console.log(undefinedVariable.x) // => error

另外,undefined 应该是表示该变量还没有被声明,但是你可以声明一个变量像

const undefinedVariable = undefined;

所以已经定义了但是还没有定义?

所以我的意思是,虽然它们有不同的语义含义,一个表示尚未声明的变量,而 on 表示没有值的变量,它们似乎具有功能并且它们都是错误的,试图得到它们的属性将返回错误。

基本上我要问的是为什么我们需要两者,为什么不只使用带有None 的python 或带有Null 的Java 和c++ 等低级语言?

【问题讨论】:

  • 不是真的,它们是两个完全不同的东西。
  • @ggorlen 旨在显示 typeof nullObject 是多么不直观,但您无法从中访问属性,就像您无法访问未定义的属性一样,我可以看看你有多困惑,所以我会编辑问题。
  • 啊,我明白你的意思了。显然对此的解释是here
  • 副本中也提到了这一点...

标签: javascript


【解决方案1】:

我建议你想想他们的意图,以更好地理解差异。

null 表示任何对象值有意缺席。它永远不会由运行时分配。

同时,任何未赋值的变量都是undefined 类型。方法、语句和函数也可以返回undefined。当您调用对象的不存在的属性或方法时,您也会得到undefined

undefined 与空值无关。例如:

console.log(5 + undefined);
// expected output: NaN
console.log(5 + null);
// expected output: 5

两者之间的区别很有用,因为 JavaScript 是动态类型的,而对象是可以在运行时更改的属性的动态“包”。

let car = {type: "Fiat", model:"500", color:"white"};
console.log(car.type);
// expected output: "Fiat"
console.log(car.price);
// expected output: undefined
car.price = null;
console.log(car.price);
// expected output: null
car.price = 2000;
console.log(car.price);
// expected output:2000

【讨论】:

    【解决方案2】:

    想象一杯水;

    如果它存在,但里面没有水;是null

    如果根本没有玻璃;是undefined

    【讨论】:

    • 是的,但是在 python 中,如果你有一杯水,它存在并且里面没有水,那么它就是 None,如果没有玻璃,它也是 None 并且那里没有因为这个事实而出现错误,你也会认为,如果玻璃存在但没有水,那么glass.water 将返回 undefined 但它返回错误,can not get property "water" of null
    • @davidsnyder 两个不同的错误,当您在null glass 或undefined glass 上调用glass.water 时抛出。一个是typeError,另一个是referenceError
    • 这不是重点,重点是它们都抛出错误。
    • @davidsnyder 深绿色和浅绿色都是green;但它们是不同的。这是一个古老的论点兄弟.. 我建议你阅读 YDKJS getify 的书
    • 你说得有道理,但我只是再次测试了它,它们都返回 TypeError,如 Here 所示,但即使它们没有抛出相同类型的错误,但仍然没有解释他们的需求
    猜你喜欢
    • 2021-10-29
    • 2018-03-19
    • 2018-10-23
    • 2017-11-16
    • 1970-01-01
    • 2014-05-11
    • 2023-03-08
    • 2010-10-22
    相关资源
    最近更新 更多