前端面试:== 操作符也会比较类型?
大家好,我是大家的林语冰。今天我们来共享一道面试题。
面试官问,请你讲讲 ==
操作符和 ===
操作符的异同点。
AI 面试
遇事不决,AIGC。AI 不会淘汰程序员,但 AI 会淘汰不会 AI 的程序员。
所以我们可以先看看 AI 面试时会怎么说。
如你所见,这就是 AI 面试的答案。
语冰的个人心证是,这个答案其实有点猪头。
为什么这样讲呢?因为 AI 认为 ==
操作符不会比较类型。
但其实这是一个原则性错误。我们可以来证明一下。
反证法
举个粒子,1 == '1'
就会触发隐式类型转换。
如你所见,==
操作符的底层原理涉及隐式类型转换,需要识别类型和比较类型,这和我们假设的前提是矛盾的。
反证法可得,假设不成立,双等操作符会比较类型。
另外,根据 ES 语言说明书(ECMAscript Language Specification)第七章第二小节第十四条的宽松相等算法,该算法用于说明 ==
操作符的语义。
如你所见,==
操作符算法的第一步就是比较类型。
认知偏差
部分教程还有另一个认知偏差,就是 typeof
可以判断变量的类型。
如你所见,typeof x
的返回值是 'number'
,所以变量 x
的类型是 Number,对吗?不对!
注意,这里有个原则性问题就是,JS 是一门动态类型语言,动态类型的意思是变量可以是任意类型。
所以变量 x
还可以赋值为字符串或其他任意类型,变量 x
是“类型自由”的。
注意,typeof
判断的其实不是变量的类型,而是变量的值的类型。
事实上,对于一个 JS 值而言,数据和类型就像硬币的正反面一样不可分割,因为你确定一个值的同时类型也确定了。
举个粒子,当你看到数字 1
时,就知道这是一个 Number 类型,且值为 1
。
这意味着,当你去比较一个值的时候,其实已经在同时比较类型和数据,没法“课题分离”了,就像你没法说语冰是铲屎官,但语冰的影子不是铲屎官一样。
AI 的正确打开方式
虽然我不同意 AI 的说法,但我誓死捍卫 AI 说话的权力。
在用 AI 抄作业时,我们要取其精华去其糟粕,别像 JS 抄了 Java 的 Date
一样连 BUG 也一起抄了。
AI 会出错的原因在于 AI 会爬取数据建模训练,AI 会爬到错误答案说明这个答案的“传唱度”是比较高的,一些教程确实会告诉你,双等操作符不会比较类型。大家要小心被虚假信息 PUA。
另外,你可以从不同角度对 AI 灵魂拷问,再小心求证。
如你所见,AI 的准确率提高了。
打个比方,外国人为什么要相信“阴谋论”黑新疆,因为祂只看过新闻,但却没看过新疆。这就像路痴开车,车速很快,但是没开导航仪也可能迷路。
高能总结
综上所述,===
操作符其实是 ==
操作符的子算法。
祂们的相同点是:
- 都是二元操作符,有且仅有 2 个操作数
- 都是谓词操作符,有且仅有 1 个布尔返回值
- 都是中缀操作符,能且仅能“两面包夹芝士”
- 都会比较类型和值
祂们的不同点是:
==
操作符比较短,===
操作符比较长==
操作符走节育系路线,限用隐式类型转换,相对灵活;===
操作符走绝育系路线,禁用隐式类型转换,相对教条
异同\操作符 | == | === |
---|---|---|
二元操作符 | Y | Y |
谓词操作符 | Y | Y |
中缀操作符 | Y | Y |
隐式类型转换 | Y | N |
学会了的小伙伴可以点赞给作者打 call,欢迎持续关注和订阅最新资讯。谢谢大家的点赞~感恩!
转载自:https://juejin.cn/post/7278306359970365455