- 数据类型
5 种基本数据类型:Undefined、Null、Boolean、Number、String
1 种复杂数据类型:Object
typeof 对于不同的数据类型,返回以下不同的值:
Undefined -- undefined
Boolean -- boolean
Number -- number
String -- string
Function -- function
Object -- object
Array -- object
Null -- object // null 被认为是一个空的对象引用
var a
alert(a) // 'undefined'
alert(b) // 产生错误
alert(typeof a) // 'undefined'
alert(typeof b) // 'undefined'
- Number
- NaN
任何涉及 NaN 的操作(NaN / 10)都会返回 NaN
与任何值都不相等,包括 NaN - isNaN()
先将一个值转成数值,再去判断
- NaN
- Object
- 每个 Object 实例都有以下属性和方法
constructor: 用于创建当前对象的函数
hasOwnProperty(propertyName): 检查当前实例是否有给定的属性
isPrototypeOf(object): 检查传入的对象是否实例的原型
propertyIsEnumerable(propertyName): 给定属性是否可枚举
toLocalString(): 返回对象的字符串表示,与执行地区有关系
toString(): 返回对象的字符串表示
valueOf(): 返回对象的字符串、数值或布尔值表示
- 每个 Object 实例都有以下属性和方法
- 类型转换
-
复杂类型的转换,核心是 valueOf() 和 toString() 两个函数
- 以 Object -> Number 为例
首先调用 valueOf() 方法,如果求得的值是基础类型,则把基础类型转换为 Number
如果求得的值还是复杂类型,则调用 toString() 方法,把 String 转换为 Number
console.log([] == ![]) // true 解释: ![] 是一个布尔值 false 任何值和布尔值比较,会把两边的操作数转换为数值,所以 ![] 变为 0 [] 转为数值会先调用 valueOf(),得到的还是 [] [] 再尝试调用 toString(),得到 '',空字符串 转 数值是 0 所以 0 == 0 是true
- 以 Object -> Number 为例
其他类型 转 Boolean,使用 Boolean()
String
true: 任何非空字符串
false: ""(空字符串)
Number
true: 任何非零数字值
false: 0、NaN
Object
true: 任何对象
false: null
Undefined
false: undefined其他类型 转 Number,使用 Number()
Boolean
true: 1
false: 0
Null
null: 0
Undefined
undefined: NaN
String
只包含数字(包括前面带 0/+/- 号),转换为十进制数字
只包含有效的浮点格式(不包含其他中英文字符),转换为浮点数
只包含有效的十六进制格式("0xfg"这类无效),转换为数值大小一样的十进制数字
空字符串(包括一个或多个空格),转换为 0
其他,转换为 NaN
Object
先调用对象的 valueOf() 方法,获取到的一个值 a
再根据前面的规则对 a 进行转换
如果是 NaN,则调用对象的 toString() 方法,获取到一个值 b
再根据前面的规则对 b 进行转换其他类型 转 String,使用 String()
如果值有 toString() 方法,调用该方法
null,"null"
undefined, "undefined"
-
- 一元操作符
-
递增和递减
- 「前置型」和「后置型」的区别是,「后置型」操作会在包含它们的语句中执行完之后,再去求值
var a = 1 var b = 2 var c = a-- + b // 3 var d = a + b // 2
当一元操作的对象不是数值的时候,先用 Number() 方法转换为数值,再去执行一元操作
-
-
布尔值操作符
- 逻辑与(当有一个操作数不是布尔值的情况)
「短路操作」,如果第一个操作数能够决定结果,就不会对第二个操作数求值
如果有一个操作数是 null、NaN、undefined,则返回 null、NaN、undefined
第一个操作数求值为 true,会返回第二个操作数
function fn() {return 1} console.log(true && fn()) // 1
- 逻辑或(当有一个操作数不是布尔值的情况),与逻辑与类似
「短路操作」,如果第一个操作数求值为 true,就不会对第二个操作数求值
如果两个操作数都是 null、NaN、undefined,则返回 null、NaN、undefined
第一个操作数求值为 false,会返回第二个操作数
- 逻辑与(当有一个操作数不是布尔值的情况)
- 乘性操作符(* / %)
如果某个操作数不是数值,会用 Number() 转换
-
加性操作符
- (String + 其他类型),将其他类型的操作数转换为字符串,然后进行拼接
console.log('11' + 2 - 1) // 111
- 减性操作符
- (Number - Object)
调用 Object 的 valueOf() 方法求值,如果是 NaN,结果就是 NaN
如果没有 valueOf() 方法,调用 toString() 求值并转换为数值进行计算 - (Number - 其他类型)
调用 Number() 方法对其他类型进行转换,然后进行计算
- (Number - Object)
- 相等操作符
- != 和 ==
- 如果一个操作数是 Boolean ,则先将 Boolean 转换为 Number
- String 和 Number,将 String 转换为 Number
- Object 和 其他类型
先后尝试调用 Object 的 valueOf() 和 toString() 求得基本类型值,再进行比较 - null == undefined // true;undefined 派生自 null
- null 和 undefined 在比较时候,不做转换
- NaN 与 任何值 不相等
- Object 和 Object,仅比较是否同一个对象
- != 和 ==
- 函数
- 参数(arguments)
- 与数组类似,有数组的某些方法
- 参数(arguments)
- 不常用的知识
- 8进制、16进制、浮点数
- Number.MIN_VALUE、Number.MAX_VALUE、parseInt()
- 0、Infinity、NaN 的四则运算
- 非数值类型的 <、>、<=、 >=比较
- 逗号操作符