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

  • 相关阅读:
    poj3067 Japan(树状数组)
    Codeforces 482C Game with Strings(dp+概率)
    LeetCode -- 推断链表中是否有环
    螺旋矩阵——正逆序
    POJ 3905 Perfect Election(2-sat)
    设计模式 之 桥接
    Codeforces Round #257 (Div. 2)
    [LeetCode][Java] Minimum Window Substring
    Unity特殊目录和脚本编译顺序
    jQuery插件 -- Cookie插件
  • 原文地址:https://www.cnblogs.com/aaronjs/p/3125964.html
Copyright © 2011-2022 走看看