javascript的类型默认转换机制.
javascript是一门弱类型语言 它的函数形参不指定类型 它的变量在赋值时连同类型一起覆盖 所以不存在类型转换问题,等等,不存在类型转换问题?哦 只是赋值时不存在类型转换问题。 javascript的类型转换主要存在于表达式运算过程中,更直接的说,js的类型默认转换几乎全是由运算符引起的,这篇文章里还会讨论显式转换。
在js的运算符中 有以下几类
- +运算符 只作用于字符串和数字
- - * / %只作用于数字
- ! 只作用于布尔型
如果我们对2个变量a 和b使用+运算符 a+b
那么 js解释器也许会面对这样一个问题: a和b也许不都是数字并且不都是字符串
此时 他将如何做呢?
最基本的答案是 调用a 和b的 valueOf函数 把原来的表达式变成
a.valueOf()+b.valueOf()
但是 这并不完全 因为实际情况要复杂的多:
1.如果a.valueOf()和b.valueOf()仍然不适合+运算符呢?继续调用它们的valueOf 直到返回类型出现循环为止。在valueOf无法达到要求的时候 它会调用toString
2.如果a或b没有valueOf这个方法呢?一般情况下不会,因为Object.prototype提供了这个方法 它是原型链的顶级,所有对象都会共享它的方法。不过 如果你很bt地delete Object.prototype.valueOf 那么很可能导致你的对象整条原型链上都没有valueOf 这个时候 它会调用toString
3.如果a和b一个是字符串 另一个是数字 应该优先转换哪个呢? 当然是字符串啦:P
4.如果a和b的toString也被删掉了呢? delete Object.prototype.toString; 晕 太bt了吧 这样就只能当运算符和b不存在了
+运算符在所有运算符中的行为算是比较复杂的 其他运算符因为几乎只对一种类型起作用 所以并不像+这么复杂:
只对数字运算符起作用的运算符 在valueOf失败时 会把对象转换成NaN
只对布尔型起作的运算符 不会调用valueOf 会把对象按以下规则转换:
空字符串""
数字0
空对象null
非法数无穷大NaN
未定义类型undefined
转换成false 其他转换成true
BTW ,|| &&不是只对布尔值起作用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!