为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript 中的传递性

JavaScript 中的传递性

莫回无 2023-08-10 16:03:27
在数学中,= 被假定为传递关系。传递性的意思正是你所说的:A = B和B = C意味着A = C。但是,据我所知,javascript不尊重这种传递性原则。对于以下所有表达式,输出均为 TRUE[]==0true0==[]true"0" == 0true0 == "0"true但是,这是错误的"0" == []false它背后的原因是什么?编译器如何处理这个表达式?
查看完整描述

3 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

查看有关非严格 Javascript 相等运算符的文档它尝试转换不具有相同类型的对象,虽然它显然支持 [] 和 0,但它没有对“0”和 [] 的强制。

我猜测其背后的原因:0 通常用于表示 False 的布尔值。当转换为布尔值时,[] 的值为 False,因此[] == 0用布尔值表示是方便的。"0" == 0然而,出于不同的原因,这是正确的;字符串“0”代表整数0。从逻辑上来说,相等运算符实际上代表了两种不同的关系,因此它们之间不存在传递性。


查看完整回答
反对 回复 2023-08-10
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

右侧值被强制转换为字符串。


console.log("0" == []) // false

console.log([].toString()) // ""

console.log("" == [].toString()) // true

console.log("0" == [0].toString()) // true

console.log([0, 1, 2, 3].toString()) // 0,1,2,3

console.log("0,1,2,3" == [0, 1, 2, 3]) // true


查看完整回答
反对 回复 2023-08-10
?
心有法竹

TA贡献1866条经验 获得超5个赞

JavaScript 的激进类型的强制转换会导致奇怪的结果。空数组的字符串等价物是空字符串,因此这就是它的工作原理。同样,将空字符串转换为数字会得到零,因此您也可以将数组转换为数字。字符串“0”等于 0,因为调用 0.toString 给出“0”。但我们之前说过,空数组会变成空字符串,因此我们不能将“0”作为空数组的转换版本。

所有这一切的发生首先是由于“==”,它强制类型。对于“===”,这些等式都不成立。


查看完整回答
反对 回复 2023-08-10
  • 3 回答
  • 0 关注
  • 72 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信