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

时间:2017-11-15 16:21:58

标签: javascript android arrays cordova

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

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

将webpack(v 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(v 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还很绿,我很难过。

编辑:此外,查看App的userAgent:

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 

我看到Cordova使用Chrome 33的原因有些奇怪。这可能就是问题所在。

附录:

由于我确认Cordova应用程序确实使用Chrome 33,这可能是Array方法无法正常工作的原因。

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

2 个答案:

答案 0 :(得分:1)

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

您唯一的选择是升级平台或不在代码中使用Array.prototype.keys。如果你采用后一种方式,我会对ES2015中的许多其他新东西持怀疑态度。

作为Andy points out,无论如何都没有理由在那里使用Array#keys。刚

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

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

已足够(前提是平台支持letArray.from)。

答案 1 :(得分:1)

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

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

对于Android,根据您使用的设备,webview组件的引擎会有所不同。它可能基于旧的Android浏览器,设备制造商的浏览器或使用Android比4.4更新的设备的设备。对于大多数设备,无法更新webview。

因此每个设备的应用行为都不同:html5支持,css支持,严格模式,js版本,是否需要配置Content-Security-Policy ......

每次用户在新设备上使用您的应用时,您都可能会对cordova感到惊讶。

您必须使用您定位的最旧平台版本支持的javascript / css / html(您可以参考canIuse)并同时符合最新要求(例如内容安全策略)强制启动android 4.4)。

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

如果您想确保您的应用在所有设备上的行为方式相同(屏幕尺寸除外),我认为目前最好的选择是使用Crosswalk

Crosswalk是基于最新版Chromium的webview。

如果您将Crosswalk Cordova plugin添加到您的应用中,cordova将使用人行横道引擎而不是系统webview,因此您的应用将在所有设备上使用相同的引擎,并且您对使用javascript线工作没有更多惊喜设备但不在另一个设备上。

使用Crosswalk的唯一缺点是你在你的apk中嵌入了Chromium引擎,这使得它更大(一旦安装了应用程序,apk为+ 17Mb,设备上为+ 50Mb)。

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