如果指定的属性在指定的对象或其原型链中,则返回true
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
右操作数必须是一个对象值
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结果不同
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先将自身的值自增1,再将自增后的值赋值给变量a
let i = 1
const a = ++i
console.log(i) // 2
console.log(a) // 2
i先将自身的值赋值给变量a,然后再自增1
let i = 1
const a = i++
console.log(i) // 2
console.log(a) // 1
x == y
如果操作数具有相同的类型,则按如下方式进行比较(===)
对象(Object):仅当两个操作数引用同一个对象时返回 true。
字符串(String):只有当两个操作数具有相同的字符且顺序相同时才返回 true。
数值(Number):如果两个操作数的值相同,则返回 true。+0 和 -0 被视为相同的值。如果任何一个操作数是 NaN,返回 false;所以,NaN 永远不等于 NaN。
布尔值(Boolean):仅当操作数都为 true 或都为 false 时返回 true。
大整形(BigInt):仅当两个操作数值相同时返回 true。
符号(Symbol):仅当两个操作数引用相同的符号时返回 true。
如果其中一个操作数为 null 或 undefined,另一个操作数也必须为 null 或 undefined 以返回 true。否则返回 false
如果其中一个操作数是对象,另一个是基本类型,按此顺序使用对象的 @@toPrimitive()(以 "default" 作为提示),valueOf() 和 toString() 方法将对象转换为基本类型。(这个基本类型转换与相加中使用的转换相同。)
在这一步,两个操作数都被转换为基本类型(String、Number、Boolean、Symbol 和 BigInt 中的一个)
如果Type(x)与Type(y)相同,执行严格相等运算x === y, 也就是第一步。
Symbol 返回 false
转number 继续比较
返回false。