美文网首页
关于JS对象的toString()方法

关于JS对象的toString()方法

作者: 明里人 | 来源:发表于2019-08-20 11:48 被阅读0次

    借鉴与老师写的一篇文章,原文地址:https://www.jianshu.com/p/25001441ffba

    变量a在什么情况下会满足这三个条件,打印出1?
    var a = ?
    if (a == 1 && a == 2 && a == 3) {
        console.log(1);
    }
    
    解题:
    var a = {
        i: 1,
        toString: function() {
            return a.i ++;
        }
    }
    if (a == 1 && a == 2 && a == 3) {
        console.log(1);
    }
    
    思路:

    1、JavaScript对象在与 字符串拼接或者比较 时,首先会通过valueOf()方法获取其原始值。原始值就是其本身。

    var a = {};
    console.log(a.valueOf()); // {}
    console.log(a === a.valueOf()); // true
    

    2、如果valueOf值为对象,则会去调用对象的toString()方法。若该对象内部没有重写实现该方法,会调用对象共有的toString()方法,返回"[object Object]"。

    var a = {};
    console.log(a.toString()); // [object Object]  类型为string
    console.log(a.toString() + 1); // [object Object]1   返回结果为字符串,拼接1
    console.log(a + 1 === a.toString() + 1); // true;
    

    3、如果对象下有重写toString()方法,会执行该方法:

    var a = {
        toString() {
            return 1;
        }
    }
    console.log(a.toString()); // 1
    console.log(a.toString() - 1); // 0
    console.log(a - 1 === a.toString() - 1); // true  进行比较对象a会执行valueOf()和toString()方法。
    

    4、以上可以看出对象每进行一次比较或拼接都会执行toString()方法。

    var num =1;
    var a = {
        toString(){
            return ++num;
        }
    };
    console.log(a + "");// 2
    console.log(a + "");// 3
    console.log(a + 1);// 5
    console.log(a == 5);// true
    

    5、最终实现结果:

    // 使用 toString 实现:
    var a = {
        i: 1,
        toString: function() {
            return a.i ++;
        }
    }
    // a == 1 比较时,a对象会调用toString()方法,返回结果与1进行比较。
    if (a == 1 && a == 2 && a == 3) {
        console.log(1);
    }
    
    // 使用 valueOf 实现:
    let a = {
        i: 0,
        valueOf: function() {
            return ++ a.i;
        }
    }
            
    if (a == '1' && a == '2' && a == '3') {
        console.log(typeof obj); // object
    }
    

    注意:不论是 toString 方法或者是 valueOf 方法实现, 都不可以使用全等去判断a,因为此时a的类型为对象。

    相关文章

      网友评论

          本文标题:关于JS对象的toString()方法

          本文链接:https://www.haomeiwen.com/subject/dbiusctx.html