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] 第一次有值。让我声明一下,这个顺序是随机的,每次执行都会发生变化。
所以有两件事我想不通:
为什么进入while循环时arr2之间会发生变化?
为什么数组赋值不起作用?
另外:
为什么嵌入到 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
我将 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] 第一次有值。让我声明一下,这个顺序是随机的,每次执行都会发生变化。
所以有两件事我想不通:
为什么进入while循环时arr2之间会发生变化?
为什么数组赋值不起作用?
另外: 为什么嵌入到 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