javascript中String类型转换详解编程语言

javascript中String类型转换详解编程语言

在某个操作或者运算需要字符串的时候,会触发 Object 的 String 转换,举个栗子:

var obj = {name: ‘Coco’};

var str = ‘123’ + obj;

console.log(str);  // 123[object Object]

转换规则:

    1.如果  toString  方法存在并且返回原始类型,返回  toString  的结果。

    2.如果  toString  方法不存在或者返回的不是“原始类型”,调用 valueOf  方法,如果  valueOf  方法存在,并且返回“原始类型”数据,返回  valueOf  的结果。

    3.其他情况,抛出错误。

上面的例子实际上是:

var obj = {name: ‘Coco’};

var str = ‘123’ + obj.toString();

其中, obj.toString() 的值为  “[object Object]” 。

假设是数组:

var arr = [1, 2];

var str = ‘123’ + arr;

console.log(str); // 1231,2

上面  + arr 其实是调用了  + arr.toString() 。

但是,我们可以自己改写对象的  toString , valueOf 方法:

var obj = {

    toString: function() {

        console.log(‘调用了 obj.toString’);

        return ‘111’;

    }

}

alert(obj);

// 调用了 obj.toString

// 111

上面  alert(obj) ,obj 会自动调用自己的  obj.toString() 方法转化为原始类型,如果我们不重写它的  toString 方法,将输出  [object Object] ,这里我们重写了  toString ,而且返回了一个原始类型字符串  111 ,所以最终 alert 出了 111。

上面的转化规则写了, toString 方法需要存在并且返回原始类型,那么如果返回的不是一个原始类型,则会去继续寻找对象的  valueOf 方法:

下面我们尝试证明如果  toString() 方法不可用的时候系统会调用  valueOf() 方法,下面我们改写对象的  valueOf :

var obj = {

    toString: function() {

        console.log(‘调用了 obj.toString’);

        return {};

    },

    valueOf: function() {

        console.log(‘调用了 obj.valueOf’)

        return ‘110’;

    }

}

alert(obj);

// 调用了 obj.toString

// 调用了 obj.valueOf

// 110

从结果可以看到,当  toString 不可用的时候,系统会再尝试  valueOf 方法,如果  valueOf 方法存在,并且返回原始类型(String、Number、Boolean)数据,返回 valueOf 的结果。

那么如果, toString 和  valueOf 返回的都不是原始类型呢?看下面这个例子:

var obj = {

    toString: function() {

        console.log(‘调用了 obj.toString’);

        return {};

    },

    valueOf: function() {

        console.log(‘调用了 obj.valueOf’)

        return {};

    }

}

alert(obj);

// 调用了 obj.toString

// 调用了 obj.valueOf

// Uncaught TypeError: Cannot convert object to primitive value

可以发现,如果  toString 和  valueOf 方法均不可用的情况下,系统会直接返回一个错误。

javascript中String类型转换详解编程语言

转载请注明来源网站:blog.ytso.com谢谢!

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/14956.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论