重写 toString()和Object.prototype.toString()的不同

首先记住undefined , null没有toString()方法.
大家都知道toString()是用来返回相对应类型值的字符串格式.
当我们调用toString()返回发现结果并非如此,
当我们对Number,String,Boolean,Array类型 调用
toString()方法时,会返回想对应的字符串.

var arr= [1,2]
arr.toString()
//"1,2"
var num= 12;
num.toString()
//"12"
var str = "abc"
str.toString()
//"abc"
var boo =true;
boo.toString()
//"true"

当对象调用toString()并没有返回”{}”而是返回的”[object Object]”

var obj = {};
obj.toString()
//"[object Object]"

首先原始类型没有属性和方法为什么可以调用toString()?

var num = 123;
//num.toString();—系统内部经过包装类包装–>new Number(num).toString();

(包装类:
new Number(); new String(); new Boolean() ; )

问:包装类也是对象,既然都是对象为什么调用toString()返回结果不一样?

答:原型链终端Object.prototype对象上的toString()确实可以被继承下来,可以用来判断数据类型, 但是并不能满足所有的需求,作为子代的包装类和数组就重写了自己的toString(), 因此当我们调用toString()时,会调用自身原型上重写的toString()

重写后的toString()可以把对象转换成字符串,还可以把number类型的数值转换成不同进制的数

当我们需要知道一个变量或值是什么类型的话就可以通/过调用Object.prototype.toString() 来实现 需要用到call().

Object.prototype.toString.call([123])
//"[object Array]"

当然返回的是对象形式的 .
如果需要判断 原始类型以及引用类型,可以通过函数来实现:

 function type(target){
        var template = {
            "[object Array]" :"array",
            "[object Object]" : "object",
            "[object Number]" : "number-object",
            "[object Boolean]" : "boolean-object",
            "[object String]" : "string-object"
        };

        if(target === null){
            return "null";
        }
        if(typeof(target) == 'object'){
            var str = Object.prototype.toString.call(target);
            return template[str];
        }else{
            return typeof(target);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值