JavaScript 解释undefined和not defined的区别
在JavaScript中,它们都与内存空间有关,它们之间有一个非常简单的区别。如果正在访问的变量名在内存空间中不存在,则它将被视为未定义;如果变量名在内存空间中存在,但是到目前为止尚未被赋值,则它将是undefined。
undefined: 它是一个具有特殊含义的JavaScript关键字。在我们将值赋给该内存空间之前,每个在内存中占据空间的元素都包含undefined。
让我们了解一下JavaScript代码是如何执行的,以便更清楚地理解情况。在JavaScript中,所有操作都发生在执行上下文中。执行上下文是一小块单独的区域,其中代码被执行,变量获得内存空间。
JavaScript代码执行有两个阶段:
- 第一阶段是内存分配阶段,在此阶段,所有变量和函数定义都被存储在内存堆中。在这个阶段,JavaScript将undefined赋给每个变量。
-
第二阶段是执行阶段的线程,在此阶段,JavaScript文件中的代码被执行。
在程序达到我们为该变量赋值的那一行之前,每个变量都保持undefined值。在那一行之后,变量的undefined值将被原始值替换。
示例1: 将创建全局执行上下文,在内存分配阶段, var a 将在内存中占据空间,并且JavaScript会将undefined赋给它。在执行线程中,JavaScript会遇到第一行console.log(a),由于我们尚未为a赋值,因此将在控制台打印undefined。在下一行,我们将5赋值给a,因此变量a不再是undefined,而是包含值5。因此,下一次无论我们如何访问变量a,它都不会被计算为undefined,而是打印a的实际值。
HTML
<script>
console.log(a);
var a = 5;
console.log(a);
</script>
输出(在控制台中):
undefined
5
附加说明:
- 如果你将一个函数的调用分配给一个变量,并且这个函数没有返回任何内容,那么这个变量将变成
undefined
。 - 你可以显式地将
undefined
赋值给任何变量,但在意外的情况下使用语言关键字是不好的做法。
未定义: 在JavaScript中,当有人访问不在内存堆中的变量时,JavaScript会抛出其中一个引用错误。
示例2: 首先,将创建全局执行上下文,在内存分配阶段,变量”a”将在内存中分配空间,JavaScript会默认将undefined
赋值给”a”。在执行线程时,”console.log(a)”将输出undefined
。在下一行,我们将数字5分配给变量a。在控制台中,将打印出数字5。当JavaScript遇到”console.log(b)”时,它会在执行上下文的内存堆中搜索”b”,但找不到,JS引擎将抛出一个带有消息”Reference Error”的异常,消息内容为”b未定义”。当JavaScript遇到引用错误时,将停止执行。
HTML
<script>
console.log(a);
var a = 5;
console.log(a);
console.log(b);
</script>
输出:
undefined和not defined之间的区别
undefined | not defined |
---|---|
它的工作原理类似于在代码中声明一个变量,但在打印变量值之前未赋值 | 它的工作原理类似于没有声明变量,然后尝试调用该变量。 |