我们在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有一个特殊的安全防范机制。