JS 数据类型-【未完结】

261 阅读4分钟

1.JS原始数据类型有哪些?引用数据类型有哪些?

  • 在 JS 中,存在着 6 种种简单数据类型【原始值】,分别是:
Undefined
Null
Boolean
Number
String
SymbolSymbol(符号)是 ECMAScript 6 新增的】
  • 引用数据类型【复杂数据类型】: 对象Object
包含:
普通对象-Object,
数组对象-Array,
正则对象-RegExp,
日期对象-Date,
数学函数-Math,
函数对象-Function

2.typeof 是否能正确判断类型?

  • 对于原始类型来说,除了 null 都可以调用typeof显示正确的类型。

typeof null 会输出 object,但是这只是 JS 存在的一个悠久 Bug。在 JS 的最初版本中使用的是 32 位系统,为了性能考虑使用低位存储变量的类型信息,000 开头代表是对象,然而 null 表示为全零,所以将它错误的判断为 object 。虽然现在的内部类型判断代码已经改变了,但是对于这个 Bug 却是一直流传下来。

typeof undefined // 'undefined'
typeof null // 'object'
typeof true // 'boolean'
typeof 1 // 'number'
typeof '1' // 'string'
typeof Symbol() // 'symbol'
  • 但对于引用数据类型,除了函数之外,都会显示"object"。
typeof [] // 'object'
typeof {} // 'object'
typeof console.log // 'function'

注意:严格来讲,函数在 ECMAScript 中被认为是对象,并不代表一种数据类型。可是,函数也有自己特殊的属性。为此,就有必要通过 typeof 操作符来区分函数和其他对象

typeof 是一个操作符而不是函数,所以不需要参数(但可以使用参数)

3. Undefined 类型

3.1 Undefined 类型只有一个值,就是特殊值 undefined。当使用 var 或 let 声明了变量但没有初始化时,就相当于给变量赋予了 undefined 值:

let message; 
console.log(message == undefined); // true

3.2 增加这个特殊值的目的就是为了正式明确空对象指针(null)和未初始化变量的区别。

注意,包含 undefined 值的变量跟未定义变量是有区别的。请看下面的例子:

let message; // 这个变量被声明了,只是值为 undefined 
// 确保没有声明过这个变量
// let age 
console.log(message); // "undefined" 
console.log(age); // 报错

3.3 【对未声明的变量,只能执行一个有用的操作,就是对它调用 typeof,返回的结果是"undefined",】

3.4 undefined 是一个假值

let message; // 这个变量被声明了,只是值为 undefined 
// age 没有声明 
if (message) { 
 // 这个块不会执行
} 
if (!message) { 
 // 这个块会执行
} 
if (age) { 
 // 这里会报错,因为age变量没有定义
}

4. Null 类型

4.1 Null 类型同样只有一个值,即特殊值 null。

逻辑上讲,null 值表示一个空对象指针,这也是给typeof 传一个 null 会返回"object"的原因:

let car = null; 
console.log(typeof car); // "object"

4.2 undefined 值是由 null 值派生而来的,因此 ECMA-262 将它们定义为表面上相等,如下面的例子所示:

console.log(null == undefined); // true

4.2 null 是一个假值

let age; 
if (message) { 
 // 这个块不会执行
} 
if (!message) { 
 // 这个块会执行
} 
if (age) { 
 // 这个块不会执行
} 
if (!age) { 
 // 这个块会执行
}

5. Boolean 类型

5.1 Boolean(布尔值)类型是 ECMAScript 中使用最频繁的类型之一,有两个字面值:true 和 false。

5.2 布尔值字面量 true 和 false 是区分大小写的

因此 True 和 False(及其他大小混写形式)是有效的标识符,但不是布尔值

5.3 Boolean()转型函数

虽然布尔值只有两个,但所有其他 ECMAScript 类型的值都有相应布尔值的等价形式。要将一个其他类型的值转换为布尔值,可以调用特定的 Boolean()转型函数:

let message = "Hello world!"; 
let messageAsBoolean = Boolean(message);
console.log(messageAsBoolean) // true

Boolean()转型函数可以在任意类型的数据上调用,而且始终返回一个布尔值

5.4 总结了不同类型与布尔值之间的转换规则

数据类型        转换为true的值              转换为false的值
Boolean             true                       false
String              非空字符串                  " "(空字符串)
Number              非零数值(包括无穷值)        0,NaN
Object              任意对象                    null
Undefined           N/A(不存在)                 undefined

理解以上转换非常重要,因为像 if 等流控制语句会自动执行其他类型值到布尔值的转换,例如:

let message = "Hello world!"; 
if (message) { 
 console.log("Value is true"); 
}

因为字符串 message 会被自动转换为等价的布尔值 true。由于存在这种自动转换,理解流控制语句中使用的是什么变量就非常重要