zoukankan      html  css  js  c++  java
  • 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 ,|| &&不是只对布尔值起作用

  • 相关阅读:
    Linux_RHEV虚拟化_基础理论&KVM
    Linux_RHEV虚拟化_基础理论&KVM
    Python Module_openpyxl_处理Excel表格
    HDFS QJM原理分析
    HDFS QJM原理分析
    现阶段为什么国内程序员无法很好的参与到开源社区?
    现阶段为什么国内程序员无法很好的参与到开源社区?
    一致性哈希环的理论实现
    一致性哈希环的理论实现
    HDFS RBF支持多目标集群的挂载映射
  • 原文地址:https://www.cnblogs.com/aaronjs/p/3125964.html
Copyright © 2011-2022 走看看