Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

IE8-中数组toString的BUG

  最基本的toString方法是在Object构造器的原型上就已经定义好的,但是在JavaScript的内置对象继承链中,有些对象自己实现了toString而没有使用Object上的toString。我们最熟悉的就是Array对象实例,当然还有Date实例实例也自己实现了toString。
  首先来看看toString到底是它本身的还是继承而来的,一行代码就可以验证。 alert(Array.prototype.hasOwnProperty("toString")); //true
  这说明,数组自己定义了个toString方法。实际上我们都知道,数组的toString会调用join(",")所以很容易就能猜出这个toString是数组自己实现的。那么,假如有个继承于数组的对象调用了toString方法呢?根据原型继承的原则,继承与数组的对象如果之后没有重定义toString,那么它使用的一定是数组上的toString方法。这就变成另一种情况,非数组而继承于数组的对象调用了数组的toString。如果数组在定义自己的toString时,内部代码判断了什么东西而不允许其它对象使用,那不就蛋疼了吗?然,低版本IE就是这么蛋疼!

  也就是说在IE8-中,任何非数组对象使用数组的toString都会出错。
<script>
(function(){
  console.log(Array.prototype.toString.call(arguments));
})();
</script>
<script>
console.log(Array.prototype.toString.call({}));
</script>

  其它浏览器在调用数组的toString时如果遇到继承于数组的就直接使用数组的toString,如果遇到非数组对象时会切换到Object的toString上。而在IE8-中只要非数组对象调用数组的toString一律报错。
  除了这个数组对象的问题外,还有个Date的问题需要注意。Date对象的实现与数组不同,即使是现代浏览器,非Date对象调用Date的toString方法也会报错,即使是继承的。
var A=function(){};
A.prototype=Date.prototype;
var a=new A();
a.toString();

网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^