变量类型
6种基本类型变量(简单类型变量)
number
string
boolean
undefined
null
symbol (ES6 新增)
一种引用类型变量 (复杂类型变量)
object
typeof 操作符
typeof 操作符返回的值是字符串(完全小写)
typeof 操作符的返回值
typeof null === “object”
历史遗留问题,可以认为是一个老bug
typeof ()=>{} === “function”
可以借此区分 function 和其他对象
typeof NaN === “number”
NaN不是一种类型,也未被特殊处理
typeof 未声明变量 === “undefined”
对于没有声明的变量,只有 typeof 操作和 delete 操作是合法的
(严格模式下,delete一个不存在的变量也会报错)
typeof 对于没有声明的变量 和 声明但没有初始化的变量 都返回"undefined",为了避免混淆这两种情况,尽量在声明变量的同时进行初始化,这样出现"undefined"就可以肯定该变量没有被声明。
let 和 const 的出现解决了这一问题。
类型细节
Boolean
转型函数 Boolean()
数据类型 | 转换成true | 转换成false |
---|---|---|
String | 非空字符串 | “”(空字符串) |
Number | 任何非零数值(包括Infinity) | 0 和 NaN |
Object | 任何对象 | 不存在 |
Null | 不存在 | null |
Undefined | 不存在 | undefined |
流程控制语句,比如if、while,会在()内自动执行Boolean()转型函数。
Number
整型数值
只需要注意:八进制以0打头,十六进制以0x打头;八进制在严格模式下无效
浮点数值
当数值中包含一个小数点,且小数点后至少有一个数字,这个数值就是一个
浮点数值。
- e表示法
浮点数值支持e表示法:3.125e7 - 存在舍入误差(通病)
计算精确度的问题导致了舍入误差,比如 0.1 + 0.2 不等于 0.3
Infinity
若一个值 < Number.MIN_VALUE,或 > Number.MAX_VALUE 时,
(比如 正数、负数 / 0)
会被自动转换成 Infinity (有正负),它不能参与运算。
可以用 isFinite() 进行判断,不超过大小限制的数值会返回 true。
NaN
Not a Number,比如,0除以0就会返回NaN。
两个特点:
- 任何涉及 NaN 的运算都会返回 NaN
- NaN 与任何值都不相等,包括NaN本身。
可以用 isNaN() 进行判断
isNaN() 会使用 Number() 进行转换,不能转换成数值就会返回false
转型函数 Number()
数据类型和转换规则
- Boolean
true返回1,false返回0 - String
字符串中只包含数字(包括0x打头的十六进制格式、浮点数),忽略前导0,转换十进制数值;
空字符串返回 0;
包含其他任何字符,都转换成 NaN - undefined
返回 NaN;
(这点是经常被遗忘的,但是比较重要) - null
返回 0; - object
先调用valueOf(),若转换成NaN,再调用toString(),再按上述规则进行转换;
parseInt() 和 parseFloat()
Number() 对字符串的转换不够合理,parseInt() 和 parseFloat() 解决的是字符串转
换成数值的问题。JS中带有"parse"的函数,大都有解析字符串的功能。
parseInt()
parseInt(string, number)
- 忽略字符串前的空格,直到找到第一个非空格字符
- 若这第一个字符不是数字或者负号,返回 NaN
直到遇到非数字字符,或者解析完成为止。
parseInt()本身能够根据格式识别出各种进制的正数,但是为了解决类似上述八进制
的问题,它提供了第二个参数,用于指定以什么进制来解析,即把这个要解析的字符
串当做什么进制的数来看。
通常会以10作为第二个参数。
举例:
- 对于空字符串,Number() 返回 0,而 parseInt() 返回 NaN;
- 对于 " 70",Number() 返回 NaN,parseInt() 返回 70;
- 对于 “70abc”,Number() 返回 NaN,parseInt() 返回 70。
parseFloat()
用法与 parseInt() 类似,区别在于对浮点数模式(小数点、e表示法)的处理。
String
String.length
返回字符串的长度。若存在双字节字符,可能不精确。
字符串不可变
JS中的字符串是不可变的,比如对原字符串做拼接、修改等操作,本质上都会
返回一个新的字符串,这个过程是在后台发生的。
toString()
除了null和undefined外的值都具有toString()方法,返回结果都是在值的两边加上引号,成为一个字符串。
数值的toString()可以传入参数,用于指定转换成什么进制的格式:
let num = 10;
num.toString(2); //"1010"
转型函数 String()
null 和 undefined 没有 toString() 方法,String() 函数能够实现对这些值的转换,
null -> “null”,
undefined -> “undefined”,
其他值的处理结果,和toString()方法不传参的情况相同。
Object
个中概念不做解释,因为拾遗的前提是对基础有整体的了解。
以下是一些Object实例的属性与方法:
- constructor
指向实例的构造函数 - hasOwnProperty(propertyName)
判断“该属性是否存在于该对象实例(而不是原型链)中?” - isPrototypeOf(object)
判断“是object的原型吗?” - propertyIsEnumerable(propertyName)
判断“该属性可枚举吗?”