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
以父之名
周杰伦.mp3