mck*_*oss 9 javascript internet-explorer prototype quirks-mode internet-explorer-8
我想我已经在IE(IE8)处理for-in javascript语句中发现了一个错误.经过几个小时的煮沸这个小例子后,看起来IE特意在for-in循环中跳过任何名为"toString"的属性 - 无论它是在原型中还是对象的"自有属性".
function countProps(obj) {
var c = 0;
for (var prop in obj) {
c++;
}
return c;
}
var obj = {
toString: function() {
return "hello";
}
};
function test() {
var o = "";
var d = document.getElementById('output');
o += "<br/>obj.hasOwnProperty('toString') == " + obj.hasOwnProperty('toString');
o += "<br/>countProps(obj) = " + countProps(obj);
o += "<br/>obj.toString() = " + obj.toString();
d.innerHTML = o;
}
Run Code Online (Sandbox Code Playgroud)
这应该产生:
obj.hasOwnProperty('toString') == true
countProps(obj) = 1
obj.toString() = hello
Run Code Online (Sandbox Code Playgroud)
但在IE中,我得到:
obj.hasOwnProperty('toString') == true
countProps(obj) = 0
obj.toString() = hello
Run Code Online (Sandbox Code Playgroud)
这个名为'toString'的属性的特殊大小写破坏了我的代码,试图将方法复制到Function.prototype中 - 我的自定义toString函数总是被跳过.
有没有人知道解决方法?这是某种怪癖模式的行为 - 还是只是一个BUG?
Cri*_*hez 10
是的,这是一个错误.看到这个答案.
引用CMS:
另一个众所周知的JScript错误是"DontEnum Bug",如果其作用域链中的对象包含不可枚举的属性(具有{DontEnum}属性),如果该属性在其他对象上被遮蔽,则它将保持为非可枚举的,例如:
var dontEnumBug = {toString:'foo'}.propertyIsEnumerable('toString');
Run Code Online (Sandbox Code Playgroud)
它将在IE上评估为false,这会在使用for-in语句时导致问题,因为不会访问属性.
归档时间: |
|
查看次数: |
6043 次 |
最近记录: |