zoukankan      html  css  js  c++  java
  • js中对象转化成字符串、数字或布尔值的转化规则

    js中对象可以转化成 字符串、数字、布尔值

    一、对象转化成字符串:

    规则:

    1、如果对象有toString方法,则调用该方法,并返回相应的结果;(代码通常会执行到这,因为在所有对象中都有toString方法)

    2、如果对象有valueOf方法,则调用该方法,并返回相应的结果;

    3、否则抛出异常。

    通常,所有对象都有toString方法,且内置对象都有自己toString方法的实现

    alert( {key: 'value'} ) // [object Object]
    alert( [1,2] )          // "1,2" 
    alert( new Date() )       // "Sat Sep 15 2018 15:58:01 GMT+0800 (中国标准时间)"

    在界面输出中, 比如 alert() 和 document.write() ,将优先调用 toString,如果过得不到 标量 或 undefined、null ,再尝试 valueOf ,如果仍然返回对象则报错。
    其实 parseInt()、 alert()、 document.write() 这些函数的调用中,参数所进行的类型转换,应当视为"被动的" , 是函数的实现方式使之优先调用 toString, 而非数据对象自动调用 toString。

    可以自定义toString()

    var obj = {
        age:23,
        toString:function(){
            return this.age;
        }
    }
    obj.toString();//23

    二、对象转化成数字

    需要转化成数字的两种主要情况:
    1. 函数里边的参数需要是数字,如: Math.sin(obj) / isNaN(obj) 以及算术运算符: +obj ;
    2. 用于比较,如:obj == 'John'

    PS:下面两种比较不会发生类型转换,

          a)在严格比较(===)中,不会发生任何的类型转换,

          b)在非严格比较中,如果参数都是对象,不会发生类型转换,通常,如果两个对象引用统一对象,则返回true. 

    转化成数字的规则:

    1、如果对象有valueOf方法,则调用该方法,并返回相应的结果;

     2、当调用valueOf返回的依然不是数字,则会调用对象的toString方法,并返回相应的结果;

     3、否则抛出异常。

    对象的valueOf方法返回的是对象本身,而不是字符串(比如数组、函数,它们的valueOf方法是从Object.prototype上继承下来的,默认行为是返回对象本身),所以才会采用toString

    对于对象型参与 算术运算和 "==" 运算, 不等于比较元算(> 、<、>=、<=),自动发生数据类型转换,先调用 valueOf ,如果 valueOf 不能返回标量(number、string、boolean) 和 undefined、 null ,

    将继续调用 toString, 如果仍然返回对象型数据,报错。

    Date 类型的例外: 在 + 和 == 运算中,优先 toString ,这应该是规范对该数据类型的特殊对待。

    补充:调用valueOf()的结果:

    参数类型   返回结果
    Undefined 抛出TypeError异常
    Null 抛出TypeError异常
    Number 创建一个Number对象,它内部的初始值为传入的参数值
    String 创建一个String对象,它内部的初始值为传入的参数值
    Boolean 创建一个Boolean对象,它内部的初始值为传入的参数值
    Object 对象本身

     

     

     

     

     

     

    可以重写对象的valueOf()方法(百度一道面试题,定义一个对象,使obj == '1' ,结果为true):

    var obj = {
        valueOf: function(){
            return 1;
        }
    };
    console.log(obj == '1');//true

    三、对象转化成布尔值:

    对象在JS中总是返回true

    根据上述,对象在相等性判断中如何转变?

    在布尔上下文中, atrue , bfalse,a == b这是可能的 。

     [] == ![] //true

    内部的转化步骤:

    1、右边是![],将会被转换成一个布尔值,[]为true,取非为false,此时表达式变成:

    []==false;

    2、按照规则,右边是布尔值,将false转换成0,左边是数组,数组也将进行数字转换,先调用valueOf(),不能转化成原始值,再用toString(),转换为0

    0 == 0

     3、结果为true

    补充 == 和!=判断规则(注意: ===!==  和 对象==对象 这三种情况不会进行类型转换):

    1. 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值----false转化为0,true转化为1;
    2. 如果有一个数是字符串,另一个操作数是数值,将字符串转化成数值;
    3. 如果一个操作数是对象,另一个操作数不是对象,将对象转化为基本操作类型(先valueOf()再toString(),均不能得到基本类型的值则会报错),再比较。

    所以,对象在相等性判断中:

    • 若两边都是对象,不会进行类型转换,为同一个引用才会返回true
    • 若只有一边为对象,则会先调用对象的valueOf()方法,不能返回基本类型,再调用对象的toString()方法,还是不能就会报错,否则用转化后的基本类型值继续进行判断

    举例,感受下~: 

    []==[]//false
    []==false//true
    !![]//true
    []==![]//true

    总结:


    在JavaScript中,对象有三个转换,这取决于具体情况:

    1. 字符串输出,使用toString 。
    2. 数字:数学函数,操作符,使用valueOf 后使用 toString 。
    3. 布尔值:转化为true。

     

  • 相关阅读:
    java中会存在内存泄漏吗,请简单描述?
    垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
    SpringMvc的控制器是不是单例模式,如果是,有什么问题,怎么解决?
    SpringMVC怎么样设定重定向和转发的?
    Spring MVC的异常处理 ?
    如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎么样快速得到这个对象?
    Spring是什么?
    SpringMvc用什么对象从后台向前台传递数据的?
    SpringMvc中函数的返回值是什么?
    BeanFactory和ApplicationContext有什么区别?
  • 原文地址:https://www.cnblogs.com/lihuijuan/p/9643570.html
Copyright © 2011-2022 走看看