Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS默认操作数_Javascript_Google Maps Api 3 - Fatal编程技术网

Javascript JS默认操作数

Javascript JS默认操作数,javascript,google-maps-api-3,Javascript,Google Maps Api 3,我想我了解JavaScript中默认操作数的工作原理,但显然不了解。我试图首先确定用户的地理位置,然后加载以这些坐标为中心的地图。如果设备无法确定这些坐标,它将退回到只加载带有一些默认值的地图 您会注意到,在我的error方法中,我调用的是没有参数的gMap.init(),我认为这意味着变量lat和lon应该分别设置为57.700992和11.893836。相反,我得到的是未捕获的TypeError:无法读取未定义的的属性“coords”。我哪里做错了 另外,如果存在navigator.geol

我想我了解JavaScript中默认操作数的工作原理,但显然不了解。我试图首先确定用户的地理位置,然后加载以这些坐标为中心的地图。如果设备无法确定这些坐标,它将退回到只加载带有一些默认值的地图

您会注意到,在我的error方法中,我调用的是没有参数的
gMap.init()
,我认为这意味着变量
lat
lon
应该分别设置为57.700992和11.893836。相反,我得到的是
未捕获的TypeError:无法读取未定义的
的属性“coords”。我哪里做错了

另外,如果存在
navigator.geolocation
,则在
app.init()中调用map。这是否意味着不支持HTML5地理位置的浏览器甚至不会尝试加载地图

var gMap = {
    init: function (position) {

            var lat = position.coords.latitude || 57.700992,
                lon = position.coords.longitude || 11.893836,
                geocoder =  new google.maps.Geocoder(),
                mapOptions = {
                    zoom: 12,
                    center: new google.maps.LatLng(lat, lon)
                },
                map = new google.maps.Map(document.getElementById('mapcanvas'), mapOptions);

    },
    error: function () {
        console.log('failed to retrieve geoposition');
        gMap.init();
    }
}


var theApp = {
    init: function () {

        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(gMap.init, gMap.error, {timeout:10000});
        }

    }
}

你在那里的
|
应该有效,除非
位置。坐标
位置
未定义。在这种情况下,JavaScript将抛出错误,因为您试图访问未定义对象上的属性。
您必须手动检查对象是否存在:

var lat, lon;
if(position && position.coords){
    lat = position.coords.latitude || 57.700992;
    lon = position.coords.longitude || 11.893836;
}
如果
position
未定义,则
If
将中止,而不尝试检查
position.coords

(如果左参数为false,则
&&
不会计算右参数)

是的,如果未定义
navigator.geolocation
,则不会加载地图:

navigator.geolocation.getCurrentPosition(gMap.init, gMap.error, {timeout:10000});
此^1将不会执行,因此
gMap.init
将不会执行。

您应该尝试

 var lat = position.coords.latitude ? window['position'] != undefined : 57.700992,
 lon = position.coords.longitude ? window['position'] != undefined : 11.893836,

假设您谈论的是
| |

,而不是
| |
,它不是“默认操作数”,而是“逻辑或运算符”。您得到的错误与该运算符无关,因为
position
undefined
所以
position.coords
是一个错误。请尝试
lat=position&&position.coords.latitude | | | | 57.700992
position.coords
position未定义,您无法访问未定义变量的属性。很抱歉,它确实被称为默认操作数。Check and.Defaulting运算符是JavaScript中OR运算符的别名,因为其特殊的行为。它根本不是“操作数”,而是“运算符”。操作数是它所操作的表达式,在您的例子中是
position.coords.latitude
57.700992
。它通常被称为“逻辑OR”运算符,因为在大多数语言中,以及在使用布尔操作数的JS中,它就是这样做的,尽管JavaScript有一种特殊的逻辑OR实现,允许在非布尔型上使用它,这就是为什么在某些情况下可以使用它来帮助设置默认值。
ReferenceError:position未定义
这是一个冲动的回答,我的巴迪是这样写的:
lat=position&&position.coords.latitude | | | | 57.700992
,但答案仍然很好。谢谢我更喜欢在这里使用
if
,因为您只评估
位置
/
位置。坐标
一次。但这两种方法都有效,而且你的更紧凑。谢谢