JavaScript学习笔记10-类型

  |  

前言

类型是一个语言的重中之重


50



类型

要正确合理的进行类型转换,我们必须掌握JavaScript中的各个类型及其内在行为。几乎所有的JavaScript程序都会设计某种形式的强制类型转换,处理这种情况是我们需要有充分的把握和自信。

内置类型

JavaScript有七种内置类型:

  • 空值(null)
  • 未定义(undefined)
  • 布尔值(Boolean)
  • 数字(number)
  • 字符串(string)
  • 对象(object)
  • 符号(symbol)

除对象之外其它统称为基本类型

通常情况下我们使用typeof就可以正确查看大部分值的类型,但是typeof对于null的判断室友错误的。它并不会返回Null而是返回object。这个bug由来已久,在JavaScript中存在了将近二十年,也许永远都不会修复,因为这牵涉到太多的Web系统,修复它将会产生更多Bug.

我们需要使用复合条件来检测null值的类型

1
2
let a = null;
(!a && typeof a === 'object'); //true

这是利用了null是基本类型中唯一的一个假值。

值和类型

JavaScript中的变量是没有类型的,只有值采用。变量可以随时持有任何类型的值。

换个角度说就是,JavaScript不做“类型强制”;也就是说,语言引擎不要求变量总是持有与其初始值同类型的值。

对变量执行typeof操作时,得到的结果并不是该变量的类型,而是该变量持有的值的类型

undefined和undeclared

变量在未持有值的时候为undefined,此时typeof返回”undefined”

undefined与undeclared(未声明)并不相等,已在作用域中声明但是没有赋值的变量,是undefined的。而没在作用域中声明过的变量,是undeclared的。

例如

1
2
3
var a ;
a; //undefined
b; // ReferenceError:b is not defined

“undefined”和is not defined是两码事,其实这个报错成”b is not found”或”b is not declared”会更准确。

而令人抓狂的是typeof处理undeclared变量的方式

1
2
3
var a;
typeof a; // undefined
typeof b; // undefined

由于typeof的一个特殊的安全防范机制,对于undeclared变量,typeof照样返回”undefined”,而不是报错。

typeof Undeclared

该安全方法机制对在浏览器中运行的JavaScript代码来说还是很有帮助的,因为多个脚本文件会在共享的全局命名空间中加载变量。

举个简单的例子,在程序中使用全局变量DEBUG作为”调试模式”的开关。在输出调试信息到控制台之前,我们检查DEBUG变量是否已被声明过。问题是如果在程序中检查全局变量DUBUG才不会出现ReferenceError错误。这时typeof安全防范机制就成为了必不可少的解决方案

1
2
3
4
5
6
7
if(DEBUG) {
console.log("Debugging is starting"); //未声明会报错
}

if(typeof DEBUG !== 'undefined') {
console.log("Debugging is starting)
}
文章目录
  1. 1. 类型
  2. 2. 内置类型
  3. 3. 值和类型
    1. 3.1. undefined和undeclared
    2. 3.2. typeof Undeclared