You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

声明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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:46:15