一、类型的定义

大多数人认为,像 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 = nullif (!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 // undefinedb // 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。

总结

  1. JavaScript中有七种内置类型:null、undefined、boolean、number、string、object、symbol,能够应用typeof运算符来判断某个值的类型。
  2. 变量是没有类型的,只有值有类型,类型定义(形容)了值的行为特色。
  3. undefined和undeclared不是同一个货色。undefined是值的类型之一,undeclared示意变量还未声明。
  4. 间接拜访undeclared变量是会报错的(ReferenceError: xxx is not defined),而且typeof对undefined和undeclared变量都返回'undefined'。
  5. 能够通过typeof的平安防备机制(阻止报错)来查看undeclared变量