看一道JavaScript题(类型转换)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014465934/article/details/89152130
function fn(){
	return 20;
}
fn.toString = function(){
	return 10;
}

console.log(fn+10)
20

我们看一些输出:

function fn() {
    return 10;
}
console.log(fn);           // 浏览器环境下,ƒ fn() { return 10;}
console.log(fn);           // 交互式命令行中,[Function: fn]
console.log(fn + 10);      // 浏览器环境下, function fn() {return 10;}10 
console.log(fn + 10);      // 交互式命令行中,function fn() {return 10;}10

//稍微修改一下
function fn() {
    return 10;
}
fn.toString = function() {
    return 10;
}
console.log(fn);            // 浏览器环境下,ƒ 10
console.log(fn);            // 交互式命令行中,{ [Function: fn] toString: [Function] }
console.log(fn.toString()); // 浏览器环境下,10
console.log(fn.toString()); // 交互式命令行中,10
console.log(fn + 10);       // 浏览器环境下, 20
console.log(fn + 10);       // 交互式命令行中,20

由此可以看出,对于一个方法,浏览器单纯打印地话,会自动调用toString方法(打印会带上ƒ 标识),交互式命令行不会;调用简单操作比如+、-等运算,都会自动调用toString方法(并且浏览器下也会取消ƒ 标识)。

总结:因为+号,后面是数字类型,前面要进行类型转换,这时候就会调用toString(),没有toString()就调用valueof()。

再看一个例子:

function a(x){
        var y=100;
        a.toString=function(){
            return  x+y;
        }
        return a;
}
 
alert(a(10))
110

参考文章:
https://www.jianshu.com/p/4f931024d5d1
https://blog.csdn.net/xiaomogg/article/details/78041291

猜你喜欢

转载自blog.csdn.net/u014465934/article/details/89152130