JavaScript 内置类型

JavaScript 中的一共有 8 中内置类型。分为原始类型(Primitive values)对象类型(objects)

原始类型(Primitive values)

  • 布尔值 (Boolean)
  • 空值 (Null)
  • 未定义 (Undefined)
  • 数字 (Number)
  • 长整型 (BigInt, ECMAScript 2020 新增)
  • 字符串 (String)
  • 符号 (Symbol, ECMAScript 2015 新增)

对象类型(Objects)

简略能够了解为: new Object new Array new Map new Set new WeakMap new WeakSet new Date,和简直所有通过 new keyword 创立的货色。

Typeof 操作符

typeof 操作符的目标就是查看数据类型。然而对于从 Object 派生出的构造类型。
比如说const a = new Date(); typeof a // 依旧会返回object

咱们能够参考这个表:

类型typeof 返回后果
Undefined'undefined'
Null'object'
Boolean'boolean'
Number'number'
BigInt'bigint'
String'string'
Symbol'symbol'
Function 对象'function'
其余 Object'object'

typeof Null

咱们本人在本地尝试typeof null;会发现返回后果居然是'object'。这其实是一个历史遗留的 bug。因为 JavaScript 在最后设计的时候,是通过 32bit 单元来存储数组的。这外面存储的数据,都由一个type tag(1-3bitsvalue形成。type tag 都是存储在低位。它对应的数据能够参考上面这个表:

type tag类型
000object
1int
010double
100string
110boolean

对于援用类型 objecttype tag 对应的是0。然而对于 Null 类型,机器码是空指针(在大多数平台中是0x00),正好也是 0。而 JavaScript 外面的 typeof 办法,是没有过滤 Null 类型的。因而,咱们typeof null的时候,会认为它的 type tag0,就失去'object'

类型转换

将值从一种类型转换为另一种类型通常称为类型转换(type casting)。它分为显式强制类型转换(explicit coercion)和隐式强制类型转换(implicit coercion)。

显式强制类型转换(explicit coercion)

咱们最罕用到的显示类型转换形式有四种

  1. 转换成字符串

    • String(), 它可用于任意类型的数字、文字、变量或表达式
    • 除了nullundefined之外的任何值都有的 toString()办法
  2. 转换为数值

    • Number()可把字符串,布尔值,Date 类型转换为数字。空的字符串转换为 0, 其余字符串将转换为 NaN
    • parseInt(string, radix), parseFloat(string, radix)函数会解析字符串中的数字。ES5 之后。radix 默认为 10 进制。
  3. 转换为对象

    • Object()
  4. 转换为布尔值

    • Boolean()
    • 应用!!(也能够了解为隐式类型转换)

隐式强制类型转换(implicit coercion)

隐式类型转换是指的那些荫蔽的强制类型转换。

咱们写代码大都是给他人看的,显示强制类型转换旨在让代码更加清晰易懂。而隐式强制类型转换的目标是缩小冗余,让代码更整洁。绝对的,它的副作用就是让代码比拟艰涩难懂。
但这个副作用也是相对而言的。比如说如下代码:

var a = 10;var b = a + ""; // 隐式强制类型转换var b = String(a); // 显示强制类型转换

如果你了解a + ''的意思,那么“暗藏的副作用”对你来说就不显著。不过咱们也要顾及其余不同程度的开发人员,思考到他人是否能读懂本人的代码。这些能够依据理论工作状况做出抉择,尽量让整体代码兼顾“简洁”和“可读性”。

咱们目前罕用到的会产生隐式强制类型转换的操作有以下三种:

  1. number 和 string 之间的隐式强制类型转换
  2. number 和 boolean
  3. boolean 的隐式强制类型转换,蕴含一下状况中的条件判断表达式

    • if()
    • for(..;..;..;)中的第二个表达式
    • while()do..while(..)
    • 三元运算符? :
    • 逻辑运算符||&&

JavaScript 类型转换表

原始值转换为数字转换为字符串转化为布尔值
false0'false'false
true1'true'true
00'0'false
11'1'true
'0'0'0'true(不是空的 string 类型转化为 boolean 都是 true)
'000'0'000'true
'1'1'1'true
NANNAN'NAN'false
Infinity(正无穷)Infinity'Infinity'true
-Infinity(负无穷)-Infinity'-Infinity'true
''0''false
'10'10'10'true
'twenty'NAN'twenty'true
[]0''true
[10]10'10'true
[10,20]NAN'10, 20'true
['ten']NAN'ten'true
function(){}NAN'function(){}'true
{}NAN'[object Object]'true
null0'null'false
undefinedNAN'undefined'false