JavaScript 语言精粹与编程实践(第三版)
coderljw 2024-10-13 大约 2 分钟
# 1. 表达式运算 - 序列检测
序列检测的含义在于比较变量在序列中的大小,即数学概念中的数轴上点的位置先后。
JavaScript 中可进行序列检测的数据类型
可比较序列的类型 序列值 boolean 0 ~ 1 string 在 JavaScript 中,“字符串”是有序类型的一种特例。在一般语言中,“字符(char)这种数据类型是有序的(字符#0~#255,或 Unicode 全集)。虽然 JavaScript 不存在“字符”类型,但它的字符串中的每一个字符,都被作为单一字符来参与序列检测。 number NEGATIVE_INFINITY ~ POSITIVE_INFINITY (负无穷 ~ 正无穷。值 NaN 没有序列值,任何值与 NaN 进行序列检测都将得到 false) 序列检测的运算规则
类型 运算规则 两个值类型进行比较 直接比较数据在序列中的大小 值类型与引用类型进行比较 将引用类型的数据转换为与值类型数据相同的数据,再进行“序列大小”比较 两个引用类型进行比较 无意义,总是返回 false(对引用类型进行序列检测运算其实是可能的,这与 valueOf()运算的效果有关。但这意味着最终比较的数据并非引用类型本身,而是它们转换后的值类型。) var o1 = {} var o2 = {} var str = '123' var num = 1 var b0 = false var b1 = true var ref = new String() // 示例1:值类型的比较,考查布尔值与数值在序列中的大小 console.log(b1 < num) // 显示 false console.log(b1 <= num) // 显示 true,表明 b1 == num console.log(b1 < b0) // 显示 true // 示例2:值类型与引用类型的比较 // (空字符串被转换为 0 值) console.log(num > ref) // 显示 true // 示例3:两个对象(引用类型)比较时总是返回 false console.log(o1 > o2 || o1 < o2 || o1 == o2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19当任意一个操作数是非字符串时,会将字符串转换为数值来参与运算。
var s1 = 'abc' var s2 = 'ab' var s3 = '101' var b = true var i = 100 // 示例1:两个操作数为字符串,将比较每个字符的序列值,所以显示为 true console.log(s1 > s2) // 示例2:在将字符串 s3 转换为数值时得到 101,所以显示为true console.log(s3 > i) // 示例3:在将字符串 s1 转换为数值时得到 NaN,所以下面的三个比较都为 false // (注:变量 b 的布尔值为 true,转换为数值 1 参与运算) console.log(s1 > NaN || s1 < NaN || s1 == NaN)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16