声明JavaScript Array后typeof返回object,调用push报错求助
问题拆解与解决方案
兄弟我太懂这种被看似“低级问题”搞疯的感觉了!咱们来一步步解决你的两个核心困惑:
1. 为什么typeof markers返回object?
这其实是JavaScript的固有特性——数组在JS里本质上就是一种特殊的对象类型,所以typeof运算符对数组的返回值永远是object。
如果要准确判断一个变量是不是数组,别用typeof,改用Array.isArray(markers),这个方法会返回布尔值true/false,是判断数组的标准方式。
2. markers.push()报错的真正元凶!
看你代码里的这一行,藏着一个极其隐蔽的语法错误:
markers.push( L.marker([ball[1], ball[0]]) .bindPopup(`Magnitude: ${each["properties"]["mag"]}`); // 这里多了个分号! );
.bindPopup()后面的分号会直接终止这条语句,导致push()的括号里没有合法参数,这才是报错的根源!把这个多余的分号删掉就解决了。
额外提醒:异步操作的坑
另外注意d3.json是异步函数,你原来的最后一行markers = L.layerGroup(markers);会在回调函数执行前就运行,这时候markers还是空数组,大概率会导致图层异常。最好把这行代码移到回调函数的末尾,确保数组已经被填充后再创建图层组。
修正后的完整代码
var markers = new Array(); console.log(Array.isArray(markers)); // 用这个判断数组才准确 d3.json(queryUrl, function(data) { console.log(data.features) data.features.forEach( function(each) { let ball = each["geometry"]["coordinates"] console.log(Array.isArray(markers)) markers.push( L.marker([ball[1], ball[0]]) .bindPopup(`Magnitude: ${each["properties"]["mag"]}`) // 已删掉多余分号 ); }); // 移到回调内,确保数组已填充 markers = L.layerGroup(markers); });
内容的提问来源于stack exchange,提问作者Neph Petrichor
相关产品推荐
相关产品推荐

