Javascript

记录一下常见的js问题

==隐式转换

  • 如果x不是正常值(比如抛出一个错误),中断执行。
  • 如果y不是正常值,中断执行。
  • 如果Type(x)与Type(y)相同,执行严格相等运算x === y。
  • 如果x是null,y是undefined,返回true。
  • 如果x是undefined,y是null,返回true。
  • 如果Type(x)是数值,Type(y)是字符串,返回x == ToNumber(y)的结果。
  • 如果Type(x)是字符串,Type(y)是数值,返回ToNumber(x) == y的结果。
  • 如果Type(x)是布尔值,返回ToNumber(x) == y的结果。
  • 如果Type(y)是布尔值,返回x == ToNumber(y)的结果。
  • 如果Type(x)是字符串或数值或Symbol值,Type(y)是对象,返回x == ToPrimitive(y)的结果。
  • 如果Type(x)是对象,Type(y)是字符串或数值或Symbol值,返回ToPrimitive(x) == y的结果。
  • 返回false。

以上是==的执行步骤,总结成以下表格


如果x不是正常值(比如抛出一个错误),中断执行。
如果y不是正常值,中断执行。至少有一个非正常值,报错
--
如果Type(x)与Type(y)相同,执行严格相等运算x === y
--
如果x是null,y是undefined,返回true。
--
如果x是undefined,y是null,返回true。undf和null比较,都是true
--
如果Type(x)是数值,Type(y)是字符串,返回x == ToNumber(y)的结果
--
如果Type(x)是字符串,Type(y)是数值,返回ToNumber(x) == y的结果。数值和字符串比较,字符串转成数值跟数值比较
--
如果Type(x)是布尔值,返回ToNumber(x) == y的结果。
--
如果Type(y)是布尔值,返回x == ToNumber(y)的结果。如果其中一个是布尔值,就令这个布尔值转成数值进行比较
--
如果Type(x)是字符串或数值或Symbol值,Type(y)是对象,返回x == ToPrimitive(y)的结果
--
如果Type(x)是对象,Type(y)是字符串或数值或Symbol值,返回ToPrimitive(x) == y的结果。
--
返回false
--

JavaScript 新增两种数据类型

还没正式上stage-4,目前在stage-2

新增两个类型RecordTuple,可以看作只读的对象和数组

const record = #{
  name: 'aaa'
}

const tuple = #[1,2,3]

特点

  • 只读,所以里面的数据不能修改
record.name = 'bbb' // error
tuple[1] = 222  // error
  • 如果两个Record或Tuple里的数据相同,那么可以相等,这对于Object或Array来说是一定不相等的
#[1,2,3] === #[1,2,3]
Updated on 5/12/2023