重写 toString()和Object.prototype.toString()的不同,
分享于 点击 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);
}
}
相关文章
- 暂无相关文章
用户点评