Cordova / Coffeescript - 当 运行 在 iOS 下时出现奇怪的数组

Cordova / Coffeescript - Weird array when run under iOS

我将 cordova 与 coffeescript 结合使用,并尝试随机排列数组。在调试为什么我的函数不起作用时,我注意到我创建的数组没有正常运行。考虑以下代码:

shuffleArray: (arr) ->

  $log.log("arr:")
  $log.log(arr)

  arr2 = new Array(arr.length)
  $log.log("arr2 at beginning: " + JSON.stringify(arr2))
  i = 0
  while i < arr.length
    $log.log("i: " + String(i))
    $log.log("ARRAY BEFORE ASSIGNING: ")
    $log.log(arr2)

    valueToAssign = arr[i]
    $log.log("value to assign:")
    $log.log(valueToAssign)
    arr2[i] = valueToAssign
    $log.log("array after assigning: ")
    $log.log(arr2)
    i += 1

  $log.log("arr2 at the end: ")
  $log.log(arr2)

  # ...

当使用 arr=[1,2,3] 执行时,我得到以下结果:

[Log] arr: 
[Log] [1, 2, 3] 
[Log] arr2 at beginning: [null,null,null] 
[Log] i: 0 
[Log] ARRAY BEFORE ASSIGNING:  
[Log] [3, 2, 1] 
[Log] value to assign: 
[Log] 1
[Log] array after assigning:  
[Log] [3, 2, 1] 
[Log] i: 1 
[Log] ARRAY BEFORE ASSIGNING:  
[Log] [3, 2, 1] 
[Log] value to assign: 
[Log] 2 
[Log] array after assigning:  
[Log] [3, 2, 1] 
[Log] i: 2 
[Log] ARRAY BEFORE ASSIGNING: 
[Log] [3, 2, 1] 
[Log] value to assign: 
[Log] 3 
[Log] array after assigning: 
[Log] [3, 2, 1]
[Log] arr2 at the end:  
[Log] [3, 2, 1] 

虽然期望 "ARRAY BEFORE ASSIGNING" 是 [null, null, null] 第一次有值。让我声明一下,这个顺序是随机的,每次执行都会发生变化。

所以有两件事我想不通:

  1. 为什么进入while循环时arr2之间会发生变化?

  2. 为什么数组赋值不起作用?

另外: 为什么嵌入到 Android 时不会发生这种情况?

谢谢!

这可能是由于在日志中读取值的确切时间点所致。假设您正在使用 Safari 调试 WebView,您将在日志中找到该数组。如果您打开控制台,将在那个时候读取值。因此,您看到的是最终值,而不是打印到控制台时的值。

解决方案:始终使用JSON.stringify(arr2)查看该时间点的实际值。

如果您使用 $log.log("array after assigning: " + arr2),它也会起作用,因为这会隐式调用 arr2.toString(),从而使值在打印到控制台后不可变。

另见这些问题:

  • Bug in console.log?
  • Is Chrome's JavaScript console lazy about evaluating arrays?
  • Bizarre console.log behaviour in Chrome Developer Tools