欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > > 文章正文

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

来源: javaer 分享于  点击 20758 次 点评:78

重写 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);
        }
    }

相关文章

    暂无相关文章

用户点评