Understanding console error "TypeError: undefined is not an object" and "Uncaught TypeError: Cannot read property '0' of undefined"

Understanding console error "TypeError: undefined is not an object" and "Uncaught TypeError: Cannot read property '0' of undefined"

我有一个 jQuery 脚本,在 Safari 10 中出现此控制台错误:

TypeError: undefined is not an object (evaluating 'iOSversion()')

和 Chrome 中的这个:

Uncaught TypeError: Cannot read property '0' of undefined

这是有问题的脚本(简体):

$(document).ready(function() {

    //detect iOS version
    function iOSversion() {
        if (/iP(hone|od|ad)/.test(navigator.platform)) {
            // supports iOS 2.0 and later
            var v = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/);
            return [parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)];
        }
    }

    // this causes a console error
    var ver = iOSversion();
    if (ver[0] < 10) {
        alert('this is version 9 or below');
    }

    if (ver[0] >= 10) {
        alert('this is version 10 or above');
    }

});

问题: 我是 JavaScript 的相对初学者,很难理解问题的原因是什么(因为变量似乎已正确定义? ) 而且我不知道 [0] 错误!)。有人可以帮助我了解出了什么问题以及如何解决吗?

(发生这种情况的页面是 here

您的函数将 return 仅在 iOS 平台上运行,因此如果您在 Chrome 或 Safari (macOS) 上测试,您将收到错误消息。 verundefined,因此没有 [0] 键。

一个快速的解决方法是使函数 return 在所有平台上都有效。类似于:

function iOSversion() {
    if (/iP(hone|od|ad)/.test(navigator.platform)) {
        // supports iOS 2.0 and later
        var v = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/);
        return [parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)];
    }
    return [0]; // Return '0' by default
}

也许更好的解决方案(取决于您的具体问题)不进行 OS 检测,而是 feature detection.

您的 iOSVersion() 函数没有默认大小写。如果条件未计算为真,它需要一个 return 值。

//detect iOS version
    function iOSversion() {
        if (/iP(hone|od|ad)/.test(navigator.platform)) {
            // supports iOS 2.0 and later
            var v = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/);
            return [parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)];
        }
        else{
             return [-1];
        }
    }

    var ver = iOSversion();
    if (ver[0] < 10 && ver[0] != -1) {
        alert('this is version 9 or below');
    }
    else if (ver[0] >= 10) {
        alert('this is version 10 or above');
    }
    else{
        alert('this is not iOS');
    }

当您尝试上述操作时会发生什么?