代码之家  ›  专栏  ›  技术社区  ›  DeusXMachina

JS:数组没有方法“键”(Cordova,Android)

  •  1
  • DeusXMachina  · 技术社区  · 8 年前

    我正在从可映射函数初始化一个新数组:

    let data = Array.from(Array(20).keys(), new_datum);
    

    它将网页(3.5.5版)打包为:

    var data = Array.from(Array(20).keys(), new_datum);
    

    为了完整性起见,这是一个函数,尽管我怀疑它是否相关:

    function new_datum() {
      return {
        name: Math.floor((Date.now() - START_TIME) / 1000),
        Temperature: Math.random() * 100
      }
    }
    

    这在我桌面上的Chrome浏览器中运行良好。然而,当使用Cordova(7.1.0版)和Android(26)将其编译成SDK并在我的手机(kitkat 4.4.4,Chrome 56.0.2924.87)上运行时,我得到了以下信息:

    Uncaught TypeError: Object [object Array] has no method 'keys' 
    

    我的直觉是“某物ECMA6”,因为 Array.keys() 这个方法很新,但因为我对JS还是很熟悉,所以我很困惑。

    编辑:此外,查看应用程序的用户代理:

    5.0 (Linux; Android 4.4.4; XT1080 Build/SU6-7.7) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36 
    

    我看到科尔多瓦使用Chrome 33是出于一些奇怪的原因。这可能就是问题所在。

    附录:

    看起来有一些 limitations with respect to WebView 因此,Cordova chrome版本。有 workarounds ,但我怀疑最简单的方法就是为Chrome 33安装应用程序。

    2 回复  |  直到 8 年前
        1
  •  1
  •   T.J. Crowder    8 年前

    正确的是,错误告诉您运行代码的平台使用的JavaScript引擎不提供 Array.prototype.keys ,这是截至ES2015年的新功能(因此,并非完全是新功能)。Chrome早在v56之前就有了它,所以你运行代码的环境不是Chrome 56。我认为你可能是对的,你的代码是由Chrome 33运行的。

    您唯一的选择是升级平台或不使用 大堆原型钥匙 在您的代码中。如果你走后一条路,我会对ES2015的许多其他新事物保持警惕。


    Andy points out ,没有理由使用 Array#keys 不管怎么说。只是

    let data = Array.from(Array(20), new_datum);
    

    let data = Array.from({length:20}, new_datum);
    

    足够(前提是平台支撑 let Array.from ).

        2
  •  1
  •   QuickFix    8 年前

    Cordova没有使用任何特定版本的chrome,甚至可能根本没有使用chrome。

    让我解释一下:cordova所做的是使用 Webview 组件将html捆绑到本机应用程序中。

    对于Android,根据您使用的设备,webview组件的引擎是不同的。它可能基于旧的安卓浏览器、设备制造商的浏览器或使用安卓4.4 chrome以上版本的设备。对于大多数设备,网络视图无法更新。

    因此,每个设备的应用程序行为都不同:html5支持、css支持、严格模式、js版本、是否需要配置内容安全策略。。。

    每当用户在新设备上使用你的应用程序时,你可能会对cordova感到惊讶。

    您必须使用目标平台最旧版本支持的javascript/css/html(为此,您可以参考 canIuse )同时符合最新的要求(如android 4.4的强制内容安全政策)。

    从Android 5.0开始,webview(基于chrome)在apk中,并且是可更新的,因此运行在Android 5设备上的cordova应用程序将能够使用最新的html5功能。

    如果你想确保你的应用程序在所有设备上的表现都一样(除了屏幕大小),我认为目前最好的选择是使用 Crosswalk .

    Crosswalk是基于Chromium最新版本的网络视图。

    Crosswalk Cordova plugin 对于你的应用程序,cordova将使用crosswalk引擎而不是系统webview,这样你的应用程序将在所有设备上使用相同的引擎,你就不会对javascript行在一个设备上工作而不是在另一个设备上工作感到惊讶了。

    使用人行横道的唯一缺点是,你将Chromium引擎嵌入到你的apk中,这使得它更大(apk为17Mb,安装应用后设备上为50Mb)。

    编辑:很遗憾听到官方人行横道项目的EOL。版本2.3在Cordova插件中运行完美,希望将来有人会更新它。