一、类型的定义
大多数人认为,像 JavaScript 这样的动静语言是没有类型(type)的。
也有人认为,JavaScript 中的“类型”应该称为“标签”(tag)或者“子类型”(subtype)。
定义:类型是值的外部特色,它定义了值的行为,目标是为了辨别其余值。
怎么了解?变量是没有类型的,值才具备类型,类型形容了值的行为特色;换句话说,当某个值产生扭转,类型也随之扭转(如 a = 1 –> a = ‘1’)。
二、内置类型(七种)
JavaScript 中有七种内置类型:
- 空值(null)
- 未定义(undefined)
- 数字(number)
- 字符串(string)
- 对象(object)
- 布尔值(boolean)
- 符号(symbol,ES6 中新增)
除了对象之外,其余统称为‘根本类型’。
三、检测值的类型(typeof)
咱们能够应用 typeof 运算符来查看值的类型,留神:它的返回值是 字符串(string)
typeof undefined // 'undefined'
typeof 11 // 'number'
typeof 'kyrie' // 'string'
typeof {name: 'kyrie'} // 'object'
typeof true // 'boolean'=
typeof null // 'object' 远古 bug(二进制问题)// ES6 新增类型
typeof Symbol('11') // 'symbol'
你可能留神到少了 null 类型,而且 typeof null 居然返回的 ’object’ 类型,这是个远古 bug,存在将近 20 年,但这个 bug 应该不会修复了,一修复可能牵扯到的 web 零碎都崩了 …
提醒:文末有对于这个 bug 的具体解释。
咱们能够应用 && 来检测 null 值的类型
var a = null
if (!a && typeof null === 'object') // true
- object 的子类型(函数)
typeof function demo() {...} // 'object'
函数理论是 object 的一个“子类型”
函数是“可调用的对象”,他也能够领有属性
function demo(a, b) {...}
demo.length // 2
函数(对象)的 length 属性是形参的个数
- object 的子类型(数组)
var arr = [1, 2, 3]
typeof arr // 'object'
arr.length // 3
数组也是 object 的一个“子类型”
数组(对象)的 length 属性是元素的个数
四、undefined 和 undeclared
变量在定义了(但没有值)时为 undefined
var a;
typeof a // 'undefined'
那 undeclared 又是什么?
undeclared(未声明),大多数人认为它和 undefined(未定义值) 是同一个货色,但其实不是。
区别:曾经在作用域中申明了但还没有赋值的变量,是 undefined 的;还没有在作用域中申明过的变量,是 undeclared 的。
var a;
a // undefined
b // b is not defined (undeclaced)
这里,浏览器的解决很让人误会,“b is not defined”很容易让人误以为 b 是 undefined(未定义值)的,但其实 b 是 undeclaced(未声明)的,如果浏览器报错为:“b is not found” 或者 “b is not declared” 或者更精确一点。
更气人的是,typeof 对这类解决让人失望。
var a;
typeof a //'undefined'
typeof b //'undefined' 返回 undeclared 会好很多
对于 undeclared 或者 undefined 的变量,typeof 的返回值都是 ’undefined’;但请留神,这里 typeof b 没有报错(间接拜访 b 会报错),这是 typeof 一种 非凡平安防备机制。
五、typeof 的平安防备机制
能够用来检测 某个全局变量是否存在
// 报错 debug 是未声明(undeclared)的
if (debug) {console.log('Debugging is starting!!!')
}
// 平安 typeof 的平安防备机制
if (typeof debug !== 'undefined') {console.log('Debugging is starting!!!')
}
某些时候也能够不必 typeof 的 平安防备机制
if (window.debug) {console.log('Debugging is starting!!!')
}
下面的实现形式只实用于代码运行在 浏览器环境(领有 window 对象),但其余环境不行(如 Node.js/ 服务端 …), 因为全局对象并不是 window。
总结
- JavaScript 中有七种内置类型:null、undefined、boolean、number、string、object、symbol,能够应用 typeof 运算符来判断某个值的类型。
- 变量是没有类型的,只有值有类型,类型定义(形容)了值的行为特色。
- undefined 和 undeclared 不是同一个货色。undefined 是值的类型之一,undeclared 示意变量还未声明。
- 间接拜访 undeclared 变量是会报错的(ReferenceError: xxx is not defined),而且 typeof 对 undefined 和 undeclared 变量都返回 ’undefined’。
- 能够通过 typeof 的平安防备机制(阻止报错)来查看 undeclared 变量