首先引出问题
问题代码部分
var temp = '';
var taskscreen = {}
.....
for(var item in taskscreen){
if(taskscreen[item]!=''&&taskscreen[item]!='-万'&&taskscreen[item]!='至'&&taskscreen[item]!='-人'&&taskscreen.hasOwnProperty(item)){
if(temp==''){
temp=item+':'+taskscreen[item];
}
else {
temp=temp+';'+item+':'+taskscreen[item];
}
}
}
最后生成的temp 为 function item() {[native code]}:undefined
[native code]表示浏览器底层实现的c++机器语言代码
for in 在遍历对象包含继承和自身属性,继承属性就有函数引用,
对象在转化为字符串事就是 function item() {[native code]}:undefined
在浏览器中进行如下打印,就会发现问题所在
问题代码中 item+':'进行隐式转换,
item+':' === item.toString()+':' //true
Object.keys(obj)返回obj自身属性的一个数组
本问题总结
- 时刻注意操作符在背后做的事情
- 推荐使用Object.keys(obj).forEach()遍历对象
- 对象遍历缺乏类型判断
- 在Vue源码中通过native code 判断Proxy的构造函数是否是原生的