你不知道的JS:undefined和undeclared

我们在JavaScript中常看到的是undefined(未定义),却对undeclared(未声明)不了解,那么它们两个有着怎样的关系呢?

typeof的作用

我们知道JavaScript有7种内置类型:
字符串(string)、数字(number)、布尔值(boolean)、对象(object,包括数组array、函数function)、空值(null)、未定义(undefined)、符号(symbol)

但是我们怎么知道一个变量是什么类型的呢,这时候就用到了typeof。

typeof作用:用来查看值的类型,返回的就是值的类型。

有意思的是,这7种类型和它们的字符串值(上面7中类型括号里面的英文)并不一一对应,这里不多说,直接进入我们的主题。

undefined和undeclared傻傻分不清楚**

很多开发者认为undefined(未定义)和undeclared(未声明)是一样的,不对,在JavaScript中两者完全不是一回事。

undefined:在作用域中声明过但是没有赋过值的变量是undefined
undeclared:没有在作用域中声明过的变量是undeclared

undefined是Javascript中的语言类型之一,访问一个undefined 的变量时,浏览器不会报错并会返回undefined;undeclared是Javascript中的一种语法错误,访问一个undeclared的变量时,浏览器会报错,JS执行会中断。

抓狂示例1:

var a;
console.log(a); //undefined
console.log(b); //ReferenceError: b is not defined

上例中,“b is not defined”很容易让人误以为是“b is undefined”,然而并不是。“b is not defined”相当于“b is not found”或者“b is not declared”。

我们在写代码的时候经常会遇到这种报错,如果是新手去调试的时候很容易受到误导。b is not defined(b未定义),什么是未定义,已在作用域中声明但还没有赋值的变量,是未定义(undefined)。但是这个【console.log(b); //ReferenceError: b is not defined】报错信息却是因为b未声明(undeclared)。

抓狂示例2:

var a;
typeof a; //"undefined"
typeof b; //"undefined"

上例很容易给人带来疑惑,为什么a声明了b没有声明,查看它们值类型的时候得到的结果却是一样的。

b是一个undeclared变量,但typeof b却没有报错,是因为typeof有一个特殊的安全防范机制。

你可能感兴趣的:(JavaScript)