我想知道为什么会发生这种情况以及" a"的原始价值是什么?
a = [1,2,3]
b = "1,2,3"
a==b //this returns true
据我所知,在执行此操作时,a的基本类型与b进行比较。
修改
根据"Loose equality using =="部分 将对象(a)与字符串(b)进行比较时,以下规则有效:
ToPrimitive(A)尝试通过尝试在A上调用A.toString和A.valueOf方法的不同序列,将其对象参数转换为原始值。
不知道" ToPrimitive(A)"工作至关重要。
答案 0 :(得分:9)
它返回true
,因为您没有使用严格比较运算符===
。
使用==
时,您实际上在做[1,2,3].toString() === '1,2,3'
平等(==)(source)
如果操作数不是,则等于运算符会转换操作数 相同的类型,然后应用严格的比较。如果两个操作数都是 对象,然后JavaScript比较相同的内部引用 当操作数引用内存中的同一个对象时。
身份/严格平等(===)(source)
如果操作数严格相等,则identity运算符返回true (见上文)没有类型转换。
console.log('[1,2,3] == "1,2,3"', [1,2,3] == "1,2,3");
console.log('[1,2,3] === "1,2,3"', [1,2,3] === "1,2,3");
console.log('[1,2,3].toString() === "1,2,3"', [1,2,3].toString() === "1,2,3");
抽象等式比较算法(source)
比较x == y,其中x和y是值,产生true或 假。这样的比较如下进行:
1 。如果Type(x)与Type(y)相同,那么
____的一个即可。如果Type(x)为未定义,请返回 true 。
____的 B'/ strong>即可。如果Type(x)为 Null ,则返回 true 。
____ <强> C 即可。如果Type(x)为 Number ,则
________ 我如果x NaN ,请返回 false 。
________ ii 如果y NaN ,请返回 false 。
________ iii 如果x与y的数字值相同,则返回 true 。
________ iv 如果x为+0且y为-0,则返回 true 。
________ v 如果x为-0且y为+0,则返回 true 。
________ vi 返回 false 。
____的 d 即可。如果Type(x)是String,则如果x和y完全相同的字符序列(相同的长度和相同的字符),则返回true 相应的职位)。否则,请返回 false 。
____的ë即可。如果Type(x)是布尔值,如果x和y都是 true 或两者都是 false ,则返回 true 。否则,请返回 false 。
____ f 如果x和y引用同一个对象,则返回 true 。否则,请返回 false 。
<强> 2 即可。如果x null 且y 未定义,请返回 true 。
第3 即可。如果x 未定义且y null ,则返回 true 。
<强> 4 即可。如果Type(x)为 Number 且Type(y)为 String , 返回比较结果x == ToNumber(y)。
<强> 5 即可。如果Type(x)为 String 且Type(y)为 Number , 返回比较结果ToNumber(x)== y。
<强> 6 即可。如果Type(x)是 Boolean ,则返回比较结果ToNumber(x)== y。
<强> 7 即可。如果Type(y)是 Boolean ,则返回比较结果x == ToNumber(y)。
<强> 8 即可。如果Type(x)是 String 或 Number 而Type(y)是 Object , 返回比较结果x == ToPrimitive(y)。
<强> 9 即可。如果Type(x)为 Object 且Type(y)为 String 或 Number , 返回比较结果ToPrimitive(x)== y。
<强> 10 即可。返回 false 。