Fork me on GitHub
随笔 - 265  文章 - 0  评论 - 1075  阅读 - 230万

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 ,|| &&不是只对布尔值起作用

posted on   【艾伦】  阅读(599)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 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 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
< 2013年6月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 1 2 3 4 5 6

点击右上角即可分享
微信分享提示