“undefined”和undefined有什么区别?

26

我正在尝试在Chrome控制台中完成这个测试:测试

我可以在尝试后解释其中大部分内容,但有一件事让我困惑:

var x = [typeof x, typeof y][1];
    typeof typeof x;

...返回"string",这对我来说毫无意义。

var x = [typeof x, typeof y][1]; 

返回的结果为"undefined"

typeof "undefined"

返回的结果为"string",因为undefined被引用在了引号中。但总体来说,我不理解为什么需要与undefined共存的"undefined"的作用。此外,那是什么样的数组语法?根据《JavaScript权威指南》,JavaScript没有多维数组。


查看此内容以了解未定义如何与作用域相关: https://codepen.io/grumpy/post/undefined-scope-in-javascript - AL-zami
5个回答

39
  1. undefined在大多数情况下实际上是window.undefined。它只是一个变量。
  2. window.undefined通常未定义,除非有人定义了它(尝试undefined = 1typeof undefined将是"number")。
  3. typeof是一个运算符,它始终返回一个字符串,描述值的类型。
  4. typeof window.undefined会给你"undefined"——只是一个字符串。
  5. typeof "undefined"会给出"string",就像typeof "foo"一样。
  6. 因此,typeof typeof undefined会给出"string"

关于这个语法:

[1, 2][1];

这不是一个多维数组 - 它仅仅是先创建了一个数组 arr = [1, 2],然后从中选择了第1个元素:arr[1]


4

undefined 是默认未定义的全局变量。

typeof 返回一个描述对象类型的字符串。

因此:

 [typeof x, typeof y][1];
 [typeof undefined, typeof undefined][1];
 ["undefined", "undefined"][1];
 "undefined"

 typeof "undefined" == "string"
 typeof undefined == "undefined"
 typeof 1 == "number"
 typeof {} == "object"

还有,那是什么样的数组语法?

这是一个带有[1]的数组字面量,因此它返回索引为1的对象。

《JavaScript权威指南》中说没有多维数组。

确实没有,但是一个数组可以包含其他数组。不过这个数组并没有包含其他数组。


1
哇,这是一个很难解释的问题。 "typeof" 运算符返回一个字符串,描述其操作数的类型。所以:
typeof undefined

返回字符串 "undefined",并且
typeof typeof undefined

返回字符串"string",这是字符串"undefined"的类型。我认为它很令人困惑,因为undefined既是一种类型又是一个值。

第二部分:实际上,在JavaScript中确实没有多维数组(就算是)。在这个表达式中:

var x = [typeof x, typeof y][1];

第一组方括号是一个包含2个元素的数组字面量。第二组方括号引用该数组的第1个元素(y的类型)。因此,该表达式实际上等价于:

var x = typeof y;

1

"undefined" 是一个字符串(字面量),undefined 是嗯... undefined

var x = [typeof x, typeof y][1] 据说返回字符串 "undefined"(来自 typeof y)。现在如果你询问 typeof "undefined",它会返回字符串 "string"。如果你询问 typeof "string",它(再次)返回 "string"

可以肯定的是,typeof [anything] 总是返回一个字符串(字面量),所以 typeof typeof something 总是 "string"。


1
我认为将“undefined”称为字符串字面量是有用的,因为它在引号中。 - sdm350

1
  1. [typeof x, typeof y] 是一个普通的数组,包含类似于 ["string", "number"] 或者可能是 ["undefined", "undefined"],这取决于 xy 的类型。
  2. x = ["string", "number"][1] 取该数组的第二个元素并将其赋值给 x
  3. typeof x 返回 "string" 作为 x 的类型。
  4. typeof "string""string"

至于 "undefined"undefined 之间的区别:一个是字符串,另一个是对象。 typeof 总是返回变量的类型作为字符串,因为您可以重新定义 undefined 为其他内容,所以您无法正确比较它,但是 "undefined" == "undefined" 总是为真。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接