为什么传播语法在导航器的位置对象中不起作用?

时间:2019-07-16 02:55:36

标签: javascript

Position对象无法使用扩展语法

navigator.geolocation.getCurrentPosition((position) => {
  console.log(position);

  for( var i in position) {
     console.log(i + ":" + position[i]);
  }

  const d = { ...position };
  console.log(d);
  const { coords } = position;
  console.log(coords);
});

在此代码中,d应该是浅拷贝position

最后,d是一个空对象。

2 个答案:

答案 0 :(得分:0)

Spread语法仅扩展为对象自己的可枚举属性。 Position的属性是在原型中使用getter定义的,它们不是对象本身的普通属性。

如果您执行console.log(Object.keys(position)),出于相同的原因,它将显示一个空数组。

for-in遍历对象的可枚举属性,而不仅限于自己的属性。因此,它包括继承的属性。因此,您必须使用循环来进行浅表复制:

d = {}
for (i in position) {
  d[i] = position[i];
}

答案 1 :(得分:0)

首先,认识到getCurrentPosition的默认超时是infinite(!)。这意味着如果getCurrentPosition挂在后端某处,您的错误处理程序将永远不会被调用。

为确保获得超时,请在对getCurrentPosition的调用中添加可选的第三个参数,例如,如果希望用户等待不超过10秒的时间来告诉他们正在发生的事情,请使用:

navigator.geolocation.getCurrentPosition(successCallback,errorCallback,{timeout:10000});

由于超时原因,可能是您无法获得位置的输出。获得position数据后,您可以尝试进行以下操作:

    navigator.geolocation.getCurrentPosition(function(position) {
        console.log(position);
        var lat = position.coords.latitude;
        var lng = position.coords.longitude;
    }, function(error) {
       console.log(error);
    });

上面的代码正常工作后,您可以将其转换为箭头功能并能够使用您的代码。