Javascript 类型解读

大多数开发者认为,像JavaScript这样的动态语言是没有类型的

实则ECMAScript 类型细分为语言类型 和 规范类型

ECMAScript 语言中所有的值都有一个对应的语言类型

Undefined
Null
Boolean
String
Number
Object

对于JavaScript 来说,我们可以定义 “类型”:
对于语言引擎和开发人员来说,类型是值得内部特征,它定义了值得行为,以使其区别于其他值

全面掌握 JavaScript的类型之后,我们旨在改变对强制类型转换的成见,看到它的好处并且意识到它的缺点被过分夸大了

内置类型

JavaScript 有 7 种内置类型:
  • 空值 null
  • 未定义 undefined
  • 布尔值 boolean
  • 数字 number
  • 字符串 string
  • 对象 object
  • 符号 symbol

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

typeof 运算符查看值得类型,它返回的是类型的字符串值

typeof undefined === "undefined"
typeof true === "boolean"
typeof 42 === "number"
typeof "42" === "string"
typeof { life: 42 } === "object"
typeof Symbol() ===  "symbol"

typeof null === "object"

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

var a = null
(!a && typeof a === "object")

typeof funcrion a(){} === "function"

typeof [1, 2, 3] === "object" 
复制代码

function (函数) 实际上是 object 的一个 子类型, 具体来说, 函数是 可调用对象 它又一个内部属性[[Call]],该属性使其可以被调用

function a (b, c) {

}
// 函数对象的length属性是其声明的参数的个数
a.length === 2
复制代码

数组也是 object 的一个子类型,数组的元素按数字顺序进行索引,而非普通对象那样通过字符串键值,其length 属性是元素的个数

值和类型

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

换个角度来理解就是,JavaScript不做类型强制,语言引擎不要求变量总是持有与其初始值同类型的值

所以,对变量执行 typeof 操作时,得到的结果并不是该变量的类型,而是该变量持有的值得类型,因为 JavaScript 中的变量没有类型

undefined 和 undeclared

变量在未持有值的时候为 undefined

var a
typeof a // undefined

var b = 42
var c 

b = c

typeof b // undefined
typeof c // undefined
复制代码

已在作用域中声明但还没有赋值的变量,是 undefined 的, 相反,还没有在作用域中声明过的变量,是 undeclared

var a;
a; // undefined
b; // ReferenceError: b is not defined
复制代码

对于 undeclared 变量,typeof 照样返回 undefined, 这是因为 typeof 又一个特殊的安全防范机制

var a;
typeof a; // "undefined"
typeof b; // "undefined"
复制代码
if (DEBUG) {
    console.log("Debugging is starting")
}

if (typeof DEBUG !== "undefined") {
    console.log("Debugging is starting")
}
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享