其他运算符

in 运算符

如果指定的属性在指定的对象或其原型链中,则返回true

javascript
const trees = new Array("redwood", "bay", "cedar", "oak", "maple")
0 in trees // true
'bay' in trees // false
'length' in trees // true
Symbol.iterator in trees // true

右操作数必须是一个对象值

javascript
const color1 = new String("green")
'length' in color1 // true
const color2 = 'coral'
'length' in color2 // Cannot use 'in' operator to search for 'length' in coral

删除值等于undefined结果不同

javascript
const mycar = {a: undefined, make: "Honda", model: "Accord", year: 1998}
delete mycar.make
'make' in mycar  // false
'a' in mycar // true

+ 运算符

作用

为两种不同的运算重载:数字加法和字符串连接

运作方式

在求值时,它首先将两个操作数强制转换为基本类型(先调用valueOf)。然后,检查两个操作数的类型:

  • 如果有一方是字符串,另一方则会被转换为字符串,并且它们连接起来

  • 如果双方都是 BigInt,则执行 BigInt 加法。如果一方是 BigInt 而另一方不是,会抛出 TypeError。

  • 否则,它们将被转换为数字,并且执行数字加法。

与 模板字符串 或 String.prototype.concat() 的区别

  • 加法强制将表达式转为基本类型,它优先调用 valueOf()

  • 模板字符串和 concat() 则强制将表达式转为字符串,它们优先调用 toString()

++i

i先将自身的值自增1,再将自增后的值赋值给变量a

javascript
let i = 1
const a = ++i
console.log(i)  // 2
console.log(a)  // 2

i++

i先将自身的值赋值给变量a,然后再自增1

javascript
let i = 1
const a = i++
console.log(i)  // 2
console.log(a)  // 1

== 运算符

javascript
x == y
  1. 如果操作数具有相同的类型,则按如下方式进行比较(===)

    • 对象(Object):仅当两个操作数引用同一个对象时返回 true。

    • 字符串(String):只有当两个操作数具有相同的字符且顺序相同时才返回 true。

    • 数值(Number):如果两个操作数的值相同,则返回 true。+0 和 -0 被视为相同的值。如果任何一个操作数是 NaN,返回 false;所以,NaN 永远不等于 NaN。

    • 布尔值(Boolean):仅当操作数都为 true 或都为 false 时返回 true。

    • 大整形(BigInt):仅当两个操作数值相同时返回 true。

    • 符号(Symbol):仅当两个操作数引用相同的符号时返回 true。

  2. 如果其中一个操作数为 null 或 undefined,另一个操作数也必须为 null 或 undefined 以返回 true。否则返回 false

  3. 如果其中一个操作数是对象,另一个是基本类型,按此顺序使用对象的 @@toPrimitive()(以 "default" 作为提示),valueOf() 和 toString() 方法将对象转换为基本类型。(这个基本类型转换与相加中使用的转换相同。)

  4. 在这一步,两个操作数都被转换为基本类型(String、Number、Boolean、Symbol 和 BigInt 中的一个)

    • 如果Type(x)与Type(y)相同,执行严格相等运算x === y, 也就是第一步。

    • Symbol 返回 false

    • 转number 继续比较

    • 返回false。

更多运算符

developer.mozilla