JavaScript中确切未定义的含义是什么?为什么在那里?它有什么用途?它怎么可能有用?


11

在JavaScript中,我们有一个叫做undefined的东西。我说了些什么,是因为我真的不知道它是基类,内置变量,关键字还是其他。我只知道它在那里。

要查看其实际效果,您只需编写以下代码:

undefined;
typeof undefined;

谁能向我解释为什么将这个东西插入JavaScript?我们null在这种语言中具有价值,因此不应该像null。在其他语言中,当我们不知道属性或变量的值时,只需将其设置为null。在这里,我们可以做同样的事情。

我们如何在JavaScript中使用这个东西



这里这是讨论广告nauseum stackoverflow.com/questions/6999291/...
保罗

Answers:


13

关于未定义,您需要了解两件事...

  • 只能有一个值类型undefined
  • 变量 undefined

现在,请仔细阅读以下内容...

  • 类型的值太多了number(10,10.01,1e1)。但是类型只能有一个值undefined,并且该值存储在变量中undefined该值在字面上没有任何表示-例如,数值11001e-1是的类型号的所有文字,而是存储在该变量中的值undefined在字面上没有任何形式。

  • undefined是一个变量,只是一个普通变量,JavaScript会undefined在全局范围内声明并为其分配类型值。因此,您可以执行以下所有操作...

  typeof未定义;//“未定义”

  未定义= 100;
  typeof未定义;//“数字”

  未定义=无效0;
  typeof未定义;//“未定义”

  window.undefined ===未定义;//正确
  window.undefined ===无效0; //正确
  
  • 如果您不想使用该变量undefined,您可以undefined通过表达式生成type的值void 0-其唯一目的是返回type的值undefined

...任何人都可以向我解释为什么将这个东西插入JavaScript ...

没有。就像没人能解释为什么未声明的变量进入全局范围而不是局部变量。您只需要训练自己聪明地使用它,而不是试图为它的存在找到理由。

...我们有空值...

尽管null可以做什么undefined,但它与objects标量或多或少相关。实际上,JavaScript认为null自己是一个对象- typeof null返回“对象”。

我认为,最重要的是不要试图推论undefinedand 的绝对目的,并null在代码中清楚地使用它们,以使您的代码具有可读性,可维护性和可重用性。


2
很好的解释@greengit。the bottom line is to NOT try to reason the absolute purposes of undefined and null,似乎JavaScript不再是一种逻辑语言,我们只需要习惯一下,就像尝试一个新世界一样。
2011年

1
“其唯一目的是返回类型的值undefined”。实际void计算一个表达式,不考虑返回值,然后返回该undefined值。至于差异。undefined被JS引擎用来说这东西没有价值。null所使用的说这个东西有没有价值。有明显的区别。
雷诺斯2011年

1
undefined = 100; typeof undefined;为我返回“ undefined”,如果您尝试将其分配为null,则会出现错误。只是想为以后的读者澄清一下。
Josh Rumbut

6

很抱歉回答一个老问题,但是同时需要undefined和null的原因很简单:在基于原型的鸭类语言中,您绝对必须区分“此对象未为X定义值”和“此对象说X为没有/空/空”。

没有此功能,就无法遍历原型链,因此继承无法正常进行。您必须能够确定obj.someProp是未定义的,因此您可以查看obj.prototype.someProp,然后向上进行查找,直到找到一个值。如果obj.someProp返回null,则无法知道它是否真的为null或仅意味着“看我的原型”。唯一的解决方法是在幕后注入一些魔术般的魔术,这破坏了您对原型链进行模糊处理并执行其他各种JS黑魔术的能力。

像大多数Javascript一样,undefined和null的概念一开始似乎很愚蠢,然后又变得绝对聪明(然后又回到了愚蠢但有合理的解释)。

如果您访问不存在的属性,则诸如C#之类的语言将无法编译,并且其他动态语言在您触摸不存在的属性时通常会在运行时引发异常,这意味着您必须使用特殊的结构对其进行测试。加类意味着实例化一个对象时,您已经知道它的继承链及其所有属性-在JS中,我可以修改原型,使该链向上15步,并且这些更改将出现在现有对象上。


3

有一个全局变量undefined,它设置为未定义的值。邪恶的人可能会将其设置为其他内容,因此最好不要信任它。

  • 未定义值是不返回值的函数的返回值。
  • 未定义的值是尚未分配的变量的值。
  • 未定义的值是尚未传递的参数的值。
  • 未定义的值是尚未分配的属性的值。
  • “未定义”是未声明变量的类型。(typeof undeclaredVariable == 'undefined'。尝试读取未定义变量的值会抛出异常ReferenceError。)

null被巧妙地打破了,因为typeof null == 'object'。我不知道我们为什么要undefinednull,可能是历史性的意外。


2

嗯,undefined是通过评估所得到的东西一个哨兵值没有定义,而不是null,这正是定义为代表的价值没有

var o = { };
> undefined
o
> Object {}
o.foo
> undefined
function f() {}
> undefined
function r() { return null; }
> undefined
f()
> undefined
r()
> null

因此,例如,未定义返回值的函数的返回值是未定义的。未在对象上定义的属性的值是未定义的。语句(不是表达式)的返回值是不确定的(尽管您不会在控制台中看到这种情况)。
请注意,您可以创建一个函数,该函数显式地返回,undefined并且您可以显式定义一个undefined对象上具有值的属性,因为最后它是有效值。您这样做是为了明确地传达未定义的内容

你能想到的关系,undefinednull作为之间NaN0


“函数的返回值,没有定义返回值是不确定的”,你的意思是undefinedvoid
2011年

@Saeed:不完全是。voidJavaScript中的int是一元运算符,它可以接受任何参数并返回 undefined
back2dos
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.