lizhongzhen11 / lizz-blog

前端学习
80 stars 6 forks source link

重学js —— js数据类型:Number(二) #96

Open lizhongzhen11 opened 4 years ago

lizhongzhen11 commented 4 years ago

js数据类型:Number(二)

Number::unit 形式运算算法 续

Number::subtract( x, y ) 减法

x - y 等同于 x + (-y)

Number::leftShift( x, y ) 左移

  1. 定义 lnum!ToInt32(x)
  2. 定义 rnum!ToUint32(y)
  3. 定义 shiftCount 为掩盖 rnum 的除最低有效5位以外的所有位的结果,即计算 rnum & 0x1F
  4. shiftCount 位返回左移 lnum 结果。该结果是有符号的32位 整数

Number::signedRightShift( x, y ) 有符号右移

  1. 定义 lnum!ToInt32(x)
  2. 定义 rnum!ToUint32(y)
  3. 定义 shiftCount 为掩盖 rnum 的除最低有效5位以外的所有位的结果,即计算 rnum & 0x1F
  4. 返回通过 shiftCount 位对 lnum 执行符号扩展右移的结果。传播最高有效位。该结果是有符号的32位 整数

Number::unsignedRightShift( x, y ) 无符号右移

  1. 定义 lnum!ToInt32(x)
  2. 定义 rnum!ToUint32(y)
  3. 定义 shiftCount 为掩盖 rnum 的除最低有效5位以外的所有位的结果,即计算 rnum & 0x1F
  4. 返回通过 shiftCount 位执行 lnum填充0 右移的结果。空位用零填充。该结果是无符号的32位 整数

Number::lessThan( x, y ) 小于

  1. 如果 xNaN,返回 undefined
  2. 如果 yNaN,返回 undefined
  3. 如果 xy 有相同的 Number值,返回 false
  4. 如果 x+0y-0,返回 false
  5. 如果 x-0y+0,返回 false
  6. 如果 x+∞,返回 false
  7. 如果 y+∞,返回 true
  8. 如果 y-∞,返回 false
  9. 如果 x-∞,返回 true
  10. 如果 x数学值 小于 y数学值,它们的数学值都是有限且不为0的话,返回 true。否则,返回 false

Number::equal( x, y ) 等于

注意:Number类型的 === 调用的就是该算法

  1. 如果 xNaN,返回 false
  2. 如果 yNaN,返回 false
  3. 如果 xy 有相同的 Number值,返回 true
  4. 如果 x+0y-0,返回 true
  5. 如果 x-0y+0,返回 true
  6. 否则返回 false

Number::sameValue( x, y ) 相同值

  1. 如果 xNaNy 也是 NaN,返回 true
  2. 如果 x+0y-0,返回 false
  3. 如果 x-0y+0,返回 false
  4. 如果 xy 有相同的 Number值,返回 true
  5. 否则返回 false

Number::sameValueZero( x, y )

  1. 如果 xNaNy 也是 NaN,返回 true
  2. 如果 x+0y-0,返回 true
  3. 如果 x-0y+0,返回 true
  4. 如果 xy 有相同的 Number值,返回 true
  5. 否则返回 false

NumberBitwiseOp( op, x, y )

  1. 定义 lnum!ToInt32(x)
  2. 定义 rnum!ToUint32(y)
  3. 返回将按位运算符 op 应用于 lnumrnum 的结果。该结果是有符号的32位 整数

Number::bitwiseAND( x, y ) 与

  1. 返回 NumberBitwiseOp(&, x, y)

Number::bitwiseXOR( x, y ) 异或

  1. 返回 NumberBitwiseOp(^, x, y)

Number::bitwiseOR( x, y ) 或

  1. 返回 NumberBitwiseOp(|, x, y)

Number::toString( x )

  1. 如果 xNaN,返回字符串 "NaN"
  2. 如果 x+0-0,返回字符串 "0"
  3. 如果 x 比 0 小,返回 "-"!Number::toString( -x ) 的字符串拼接
  4. 如果 x+∞,返回字符串 "Infinity"
  5. 否则,定义 nk 以及 s 为符合 k ≥ 1, 10k - 1 ≤ s < 10k 条件的整数,R(s) x 10RR(n) - R(k)Number值x,同时 k 应尽可能的小。请注意,ks 的十进制表示形式的位数,s 不能被 10R 整除,并且 s 的最低有效位不一定由这些条件唯一确定。
  6. 如果 k ≤ n ≤ 21,返回下面的字符串拼接:
    1. s 十进制表示形式的 k 位的码元(按顺序,没有前导0)
    2. n-k 出现码元 0x0030(数字0)
  7. 如果 0 < n ≤ 21,返回下面的字符串拼接:
    1. s 十进制表示形式的 n 位的最高有效位的码元
    2. 码元 0x002E (句号)
    3. s 十进制表示形式的剩下的 k - n 位的码元
  8. 如果 -6 < n ≤ 0,返回下面的字符串拼接:
    1. 码元 0x0030 (数字0)
    2. 码元 0x002E (句号)
    3. -n 出现码元 0x0030 (数字0)
    4. s 十进制表示形式的 k 位的码元
  9. 否则,如果 k = 1,返回下面的字符串拼接:
    1. s 单个数字的码元
    2. 码元 0x0065 (拉丁文小写字母E)
    3. 码元 0x002B (+号)或 0x002D (减号),根据 n -1 的正负结果
    4. 整数 abs(n - 1) 十进制表示形式的码元 (没有前导0)
  10. 返回下面的字符串拼接:
    1. s 十进制表示形式最高有效位的码元
    2. 码元 0x002E (句号)
    3. s 十进制表示形式剩余的 k - 1 位码元
    4. 码元 0x0065 (拉丁文小写字母E)
    5. 码元 0x002B (+号)或 0x002D (减号),根据 n -1 的正负结果
    6. 整数 abs(n - 1) 十进制表示形式的码元 (没有前导0)

思考

toString为何要这样写?

1.toString() // Invalid or unexpected token
1..toString() // '1'
(1).toString() // '1'
1 .toString() // '1'

这个其实和浮点数有点关系。js是支持浮点数的,举个例子,浮点数 1.1,这里的小数点表示 我是个浮点数,所以一般来说,直接像上面那样采用字面量形式来写的话,需要区分浮点数!

1.toString() 这种写法,js引擎会默认 1. 这个是浮点数,所以改成 1..toString() 则避免了这种歧义。当然,用括号括起来语义上看起来更清晰。