系列文章:
Javascript 类型
类型 和值
在 JavaScript 中,共有7种类型主要类型:
- 基本类型:
- string
- number
- boolean
- undefined
- symbol,ES6 中新增
- null:typeof null === 'object',这是语言本身的一个bug。
- 非基本类型:object 对象,就是键/值对的集合。包括以下子类型:
- array
- function:typeof function === "function"
- 内置对象
在js中,有以下几点需要注意⚠️:
- 变量没有类型,有类型区分的是值,变量可以随时持有任何类型的值。
- 变量未声明是 undeclared,变量已声明未赋值是undefined。但 JS 不区分 undeclared 和 undefined,typeof统一返回 undefined
- 有两个办法可以判断 x 是否在全局命名空间中:
- 通过 typrof(x) !== ‘undefined’
- 通过 window.x
数字
JS 数字类型使用“双精度”格式,.运算符是一个有效的数字字符,会被优先识别为数字常量的一部分,然后才是对象属性访问运算符。
数字表示格式
数字常量除了用十进制表示,还可以通过0x, 0o, 0b做前缀的十六进制、八进制、二进制来表示。
数字的特殊值
Number 内有几个特殊值:
Number.ESPILON:浮点数最大的问题是会出现精度问题,比如0.1 + 0.2 === 0.3 (false),解决此问题最常见的是设置一个误差范围值Number.ESPILON- 最大浮点数是
Number.MAX_VALUE,最小的浮点数是Number.MIN_VALUE,正数无限接近于0 - 最大安全整数
Number.MAX_SAFE_INTEGER,最小安全整数Number.MIN_SAFE_INTEGER,是负数。 - a | 0可以将 a 中的数值转换成32位有符号整数
- NaN:不是数字的数字,可以理解为“无效数值”、“失败数值”或“坏数值”,它和自身不相等。使用
Number.isNaN()来确定是否是NaN - 正无穷数 Infinity,负无穷数 -Infinity,Infinity / Infinity = NaN
- 加法和减法不会得到-0,乘除法可以,可以通过 isNegZero() 判读是否为 -0
原生函数
JS 中有一些原生函数:
- String()
- Boolean()
- Number()
- Symbol(): ES6 新加
- Object()
- Array()
- Function()
- RegExp()
- Date()
- Error()
通过这些原生函数 new 出的数据,是封装了基本类型值的对象,可通过 valueof 得到基本类型值。
内部 [[Class]] 就是内部的分类,比如通过 Object.prototype.toString.call([1, 2])可以得到结果 "[object Array]",后面部分就是[[Class]]
这些原生函数,除了 RegExp()/Date()/Error() 都尽量不要使用,避免出现问题
类型转换
将值从一个类型转换成另外一个类型,发生在静态类型语言的编译阶段称为显式强制类型转换。发生在动态类型语言的运行时,称为隐式强制类型转换。
ToString 非字符串 => 字符串
- toString():
- 基本类型规则:
null => 'null'; undefined => 'undefined'等 - 对象规则:
- 数组:用,连接的字符串,如
[1,2,3] => '1,2,3' - 函数:字符串,如
function hh() {} => 'function hh() {}' - 普通对象:[object object],如
{label: 'xx'} => [object object]
- 数组:用,连接的字符串,如
- 基本类型规则:
- JSON.stringify()
- 格式:
- 普通值:
null => 'null'; '42' => ''42'' - 特殊值:若对象定义了 toJSON(),会先调用它再转成JSON值
undefined => undefinedfunction() {} => undefined- 在对象中遇到
undefined、function、symbol会自动将其忽略,在数组中会返回 null
- 普通值:
- 可选参数:
- replacer:数组或函数,用来指定对象序列化过程中哪些属性应该被处理
- space:数字或字符串,指定输出的缩进格式
- 格式:
ToNumber 非数字 => 数字
- Number:
- 普通值:
true => 1; false => 0; undefined => NaN; null => 0 - 对象:首先转换成相应的基本类型值,基本类型值再转成数字,如果转不成功,就是 NaN
- 普通值:
ToBoolean 非布尔值 => 布尔值
假值:undefined、null、0、-0、NaN、''、false => 0
- Boolean()
- !
- if(...)
- for(;;)
- while(...)
- do ... while(...)
- ? :
- || 和 && 左边的操作数
字符串和数字之间的转换
| 字符串 => 数字 | 数字 => 字符串 |
|---|---|
| Number() | String() |
| + | + '' |
|0 |
toString() |
| parseInt() | |
| - 0 | |
| / 1 | |
| * 1 |