问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

javascript 中的 for in遍历属性问题

发布网友 发布时间:2022-05-16 04:53

我来回答

2个回答

懂视网 时间:2022-05-16 09:15

Javascript for in的缺陷总结

for in 语句用来列举对象的属性(成员),如下

var obj = { name:"jack",
 getName:function(){return this.name}
};
//
输出name,getName for(var atr in obj) { alert(atr); }

注意了吗,没有输出obj的toString,valueOf等内置属性(或称内置成员,隐藏属性和预定义属性)。即for in用来列举对象的显示成员(自定义成员)。

如果重写了内置属性呢,下面就重写obj的toString

var obj = {name:"jack",
 getName:function(){return this.name},
 toString:function(){return "I'm jack."}
}
for(var atr in obj) {
 alert(atr);
}

会输出什么呢?

1、IE6/7/8 下和没有重写toString一样,仍然只输出name,getName

2、IE9/Firefox/Chrome/Opera/Safari下则输出name,getName,toString

如果给内置原型添加属性/方法,那么for in时也是可遍历的

Object.prototype.clone = function() {}
var obj = {
 name: 'jack',
 age: 33
}
// name, age, clone
for (var n in obj) {
 alert(n)
}

给Object.prototype添加了方法clone,for in时所有浏览器都显示了clone。

这或许还没什么,因为一般不建议去扩展内置构造器的原型,这也是Prototype.js走向没落的原因之一。jQuery和Underscore没有扩展自原型,前者在jQuery对象上做文章,后者索性将所有方法都挂在下划线上。

但有时我们为了兼容ES5或后续版本,会在不支持ES5的浏览器上(IE6/7/8)去扩展内置构造器的原型,这时for in在各浏览器中就不同了。如下

if (!Function.prototype.bind) {
 Function.prototype.bind = function(scope) {
 var fn = this
 return function () {
 fn.apply(scope, arguments)
 }
 }
}
function greet(name) {
 alert(this.greet + ', ' + name)
}
for (var n in greet) {
 alert(n)
}

IE6/7/8输出了bind,其它浏览器则无。因为现代浏览器中bind是原生支持的,for in不到,IE6/7/8则是给Function.prototype添加了bind。

总结下:在跨浏览器的设计中,我们不能依赖于for in来获取对象的成员名称,一般使用hasOwnProperty来判断下。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多Javascript for in的缺陷总结相关文章请关注PHP中文网!

热心网友 时间:2022-05-16 06:23

p是从str中遍历出的属性名,是个字符串,不是数组,要调用它直接用p即可,而str[p]则是遍历出的每个属性值:

for(p in str){
    console.log("属性名:"+p);
    console.log("属性值:"+str[p]);
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么我腌制的辣椒有一股臭味 枸杞干燥的方法介绍 枸杞怎样干燥 ...这么严了吗?体检左边精索静脉曲张2.4mm算轻微了,还必须要做手术... ...出,哪个不是科技类网站(单选) A、虎嗅 B、猫扑 C、i黑马? 宁波到宁海的车汽车南站最早几点? 一群河马有多少只? 一群是指多少个人以上 有什么办法屏蔽不良网站? 北京二手房网签之后还要多久过户 北京二手房网签后多久能过户? 北京二手房如何过户 坏的内存条多少钱一条,回收? 为什么有人要坏的内存条 有人回收内存条吗一代的 有人知道布姓起源于哪朝吗?? 布开贤是个名字吗? 硕士学历去大学当老师 必须从助教干起吗? 一般几年才能评上讲师? 刚开始工资多少? 试用期可以跳槽么? 中职助理讲师到讲师要几年 佳能600D与650D有什么差别,买哪个更好一些?不是专业摄影,旅游照着玩的! 佳能600d和650d哪个成像效果更好啊? 怎么太平洋评测照片对比650D还不如600D色彩成像好? js中为什么不能为值类型的变量动态添加属性呢? 招联借3万,36个月还清,每月还920元利息高吗? 只有一个手机号,如何注册两个 成人体温37·3度正常吗 大人温度37度正常吗 成人体温37度以上,正常么? 电脑如何登陆两个 电脑如何登录两个 同一部手机怎样申请第二个? 电脑怎么登陆双 电脑怎么登录两个 财会人员个人简历的模式 老式美的牌冰箱上面和下面一样都是冷冻,是冰箱坏了吗? WIN10想关机 出现更新并更新真麻烦,怎么设为关机,不用更新 大家对DELL的电脑怎么看?(最好是用过的) Win10强制更新如何关机呢? 冰箱以旧换新2016,是美的冰箱 关于js里的for in 。 感情上遇到跟不遇到有啥关系? 黄州快哉亭记为什么引用楚襄王和宋玉的典故 面对怀才不遇、仕途险恶,北宋文人怎样何调整心态? 文学史上的贾谊、李白、杜甫等都应算得上是怀才不遇者,你如何看待“怀才不遇”这种现象? 王羲之练字除了勤奋之外和他的天赋有关吗? 像韩愈一样怀才不遇的文人,【追+100分】。。 寻隐者不遇的隐者和不遇的意思 仕数不遇是何意?出自于哪? 白年不遇与千载难逢的区别 什么是奔波不遇之情? “怀才不遇”和“是金子总会发光”矛盾吗? 寻隐者不遇和所见的诗意与词意和中心是什么 怀才不遇与江郎才尽哪个更可怕?