为什么 null 是一个对象,null 和 undefined 之间有什么区别?

IT技术 javascript object null undefined typeof
2021-01-18 18:03:06

为什么在 JavaScript 中null认为是 an object

正在检查

if ( object == null )
      Do something

一样

if ( !object )
      Do something

?

并且:

null和 和有什么不一样undefined

6个回答
(name is undefined)

你:是什么name(*)
JavaScript: name ? 什么是name我不知道你在说什么。你以前从来没有提到name过。您是否在(客户端)端看到了其他一些脚本语言?

name = null;

你:是什么name
JavaScript:我不知道。

简而言之; undefined是不存在事物概念的地方;它没有类型,并且在该范围内之前从未被引用过;null是已知事物存在的地方,但不知道其value是什么。

有一点要记住的是,null不是,概念,同为false""或这样,即使它们的类型转换,即在画上等号

name = false;

你:是什么name
JavaScript:布尔假。

name = '';

你:是什么name
JavaScript:空字符串


*:name在此上下文中表示从未定义的变量。它可以是任何未定义的变量,但是,名称几乎是任何 HTML 表单元素的属性。它可以追溯到很久以前,并且在 id 之前就已经建立了。这很有用,因为 id 必须是唯一的,但名称不必是唯一的。

对于第二种情况,name = null,而不是“我不知道”,JavaScript 可以回答:空对象。除此之外,我喜欢答案的风格。
2021-03-12 18:03:06
空字符串不是布尔 false,但在条件上下文中它被解释为 false(y) 值(强制)。
2021-03-13 18:03:06
与其说“我不知道”,不如说答案null是“什么都没有”。Null 被精确定义为没有值。无效,无,无。没有什么。
2021-03-14 18:03:06
喜欢这种回答风格。一般而言,“您以前从未提及过任何内容 name 是正确的。然而,声明一个变量而不给它赋值 ( var somevar;),出人意料地仍然会导致undefined.
2021-03-23 18:03:06
但是在 JavaScript 中,空字符串 '' 仍然是布尔假值。
2021-03-25 18:03:06

差异可以总结为这个片段:

alert(typeof(null));      // object
alert(typeof(undefined)); // undefined

alert(null !== undefined) //true
alert(null == undefined)  //true

检查

object == null是不同的检查if ( !object )

后者等于! Boolean(object),因为一元运算!符会自动将右操作数转换为布尔值。

由于Boolean(null)等于 false then !false === true

因此,如果您的对象不是 null而是 false0"",则检查将通过,因为:

alert(Boolean(null)) //false
alert(Boolean(0))    //false
alert(Boolean(""))   //false
@kentaromiura 对于我们 Javascript noobs ......也许只有我......这是什么布尔(值)语法?转换为布尔值?
2021-03-12 18:03:06
@xr280xr 是的,它正在铸造。尝试String(null)查看另一个铸造示例。你甚至可以做一些愚蠢的事情,比如Number(null + 2)......但你不应该:-)。kentaromiura 的优秀回答。
2021-04-03 18:03:06
记住typeof是一个操作符。出于同样的原因,您不会将操作数包裹在括号中var sum = 1 +(1);
2021-04-03 18:03:06

null不是一个对象,它是一个原始值例如,您不能向其添加属性。有时人们错误地认为它是一个对象,因为typeof null返回"object"但这实际上是一个错误(甚至可能在 ECMAScript 6 中修复)。

之间的差nullundefined如下:

  • undefined: 由 JavaScript 使用,表示“没有value”。未初始化的变量、缺失的参数和未知变量具有该值。

    > var noValueYet;
    > console.log(noValueYet);
    undefined
    
    > function foo(x) { console.log(x) }
    > foo()
    undefined
    
    > var obj = {};
    > console.log(obj.unknownProperty)
    undefined
    

    但是,访问未知变量会产生异常:

    > unknownVariable
    ReferenceError: unknownVariable is not defined
    
  • null: 被程序员用来表示“无值”,例如作为函数的参数。

检查变量:

console.log(typeof unknownVariable === "undefined"); // true

var foo;
console.log(typeof foo === "undefined"); // true
console.log(foo === undefined); // true

var bar = null;
console.log(bar === null); // true

作为一般规则,在 JavaScript 中您应该始终使用 === 并且永远不要使用 ==(== 执行各种可能产生意外结果的转换)。检查x == null是一种边缘情况,因为它适用于nullundefined

> null == null
true
> undefined == null
true

检查变量是否具有值的常用方法是将其转换为布尔值并查看它是否为true该转换由if语句和布尔运算符执行!(“不是”)。

function foo(param) {
    if (param) {
        // ...
    }
}
function foo(param) {
    if (! param) param = "abc";
}
function foo(param) {
    // || returns first operand that can't be converted to false
    param = param || "abc";
}

这种方法的缺点:以下所有值都计算为false,因此您必须小心(例如,上述检查无法区分undefined0)。

  • undefined, null
  • 布尔值: false
  • 数字:+0, -0,NaN
  • 字符串: ""

您可以使用Boolean作为函数来测试到布尔值的转换(通常它是一个构造函数,与 一起使用new):

> Boolean(null)
false
> Boolean("")
false
> Boolean(3-3)
false
> Boolean({})
true
> Boolean([])
true
哦对,就像在 C 中一样,未初始化的变量声明被认为是未定义的(旧版本实际上可能包含以前的程序数据)。
2021-03-14 18:03:06
为什么要分别引用+0-0if +0 === -0
2021-03-17 18:03:06
“但这实际上是一个错误(甚至可能在 ECMAScript 6 中修复)” – 来源?
2021-03-30 18:03:06
这个答案链接到一个链接回这个答案作为源的帖子......可能意味着链接到这个而不是2ality.com/2013/10/typeof-null.html
2021-04-03 18:03:06
可能是因为您仍然可以区分+0-0: 1/+0 !== 1/-0
2021-04-05 18:03:06

null 和 undefined 有什么区别??

没有定义的属性是undefinedanull是一个对象。它的类型是object. null 是一个特殊的值,意思是“没有值。undefined 不是一个对象,它的类型是 undefined。

您可以声明一个变量,将其设置为空,并且行为是相同的,只是您会看到打印出“空”与“未定义”。您甚至可以将未定义的变量与 null 进行比较,反之亦然,条件将为真:

 undefined == null
 null == undefined

有关更多详细信息,请参阅JavaScript 的 null 和 undefined 区别

和你的新编辑

if (object == null)  does mean the same  if(!object)

当测试 ifobject为 false 时,它​​们都只在测试 if false时满足条件,而在 true 时不满足

在这里检查:Javascript 陷阱

注意最后一部分,不正确,请参阅我的答案;)
2021-03-12 18:03:06
null 真的是一个对象吗?您提供的第一个链接通过 typeof 检查 null,但由于语言设计错误,typeof(null) 评估为“object”。
2021-04-05 18:03:06
您应该使用 ===,然后使用 undefined !== null :D
2021-04-06 18:03:06
!object 与“object == null”不同......事实上,它们完全不同。如果对象为 0、空字符串、布尔值 false、未定义或空值,!object 将返回 true。
2021-04-07 18:03:06
null不是一个对象。typeof null == 'object';返回true,是因为不能固定在JavaScript中的错误(现,但在将来可能会改变)。
2021-04-08 18:03:06

问题的第一部分:

为什么 null 在 JavaScript 中被认为是一个对象?

这是他们现在无法修复的 JavaScript 设计错误。它应该是 null 类型,不是 object 类型,或者根本没有它。它需要在检测真实物体时进行额外检查(有时会被遗忘)并且是错误的来源。

问题的第二部分:

检查是否


if (object == null)
Do something



if (!object)
Do something

这两个检查总是假的,除了:

  • 对象未定义或为空:两者都为真。

  • object 是原始的,0, "", 或 false:首先检查 false,第二个 true。

如果对象不是原始对象,而是真正的对象,例如new Number(0)new String("")、 或new Boolean(false),则两个检查都为假。

因此,如果“对象”被解释为一个真正的对象,那么两个检查总是相同的。如果允许基元,则对 0 ""、 和 false的检查不同

在这种情况下object==null,不明显的结果可能是错误的来源。使用==不推荐过,用===代替。

问题的第三部分:

还有:

null 和 undefined 有什么区别?

在 JavaScript 中,一个区别是 null 是 object 类型,undefined 是 undefined 类型。

在 JavaScript 中,null==undefined为真,如果忽略类型,则视为相等。为什么他们决定这样做,但是 0""和 false 不相等,我不知道。这似乎是一种随意的意见。

在 JavaScript 中,null===undefined不是真的,因为类型在===.

实际上, null 和 undefined 是相同的,因为它们都代表不存在。0""也是如此,就此而言也是如此,也许空容器[]{}. 这么多类型的相同没有是错误的秘诀。一种或根本没有更好。我会尽量少用。

“假”、“真”和“!” 是可以简化,例如蠕虫的另一个袋子,if(!x)if(x)单是足够了,你不需要真假。

var x如果没有给出值,则声明的类型为 undefined,但它应该与 x 从未声明过一样。另一个错误来源是一个空的容器。所以最好一起声明和定义,比如var x=1.

人们绕着圈子转来转去,试图找出所有这些不同类型的虚无,但在复杂的不同衣服中,这一切都是一样的。现实是

undefined===undeclared===null===0===""===[]==={}===nothing

也许所有人都应该抛出异常。

这不是设计错误(请参阅我的回答)。
2021-03-19 18:03:06
很好的答案,但 [] 有点过头了:“实际上,null 和 undefined 是相同的......也许空容器 [] 和 {}。 ”你可能会让我认为 {} 应该是一些null 的味道,但我的直觉是它不应该。但争议较少,可以[]理解的是,空数组有一个.push()function,因此 [] 为 null 没有很好的论据。0.02 美元。
2021-03-27 18:03:06
谢谢。我觉得这比选择的答案更好地回答了原始问题。我希望任何人都可以详细说明“这是一个他们现在无法修复的 JavaScript 设计错误”并链接到文档,以准确解释 javascript 为何如此行事?
2021-04-01 18:03:06