为什么我的原始数组被改变了?

mts*_*701 4 arrays coldfusion user-defined-functions lucee udf

基于Coldfusion文档..." 数组通过值传递给用户定义的函数,因此函数获取数组数据的新副本,并且调用页面中的数组不会被函数更改. "

所以我正在做一个小练习项目.我首先获取一个数字列表,将其转换为数组(我称之为cardArray),然后对数组进行排序,最后将数组传递给几个UDF,这些UDF将查找数字中的各种模式,并进行操作(如果需要) )参数(也就是传递的数组).

我从不在UDF中引用原始数组,我只引用参数名称.仍然...如果我在调用函数后cfdump原始数组,我的原始数组已被更改.谁能告诉我为什么?

我很确定我可以解决这个问题.因此,解决这个问题不是我的大问题.我的问题是,这种行为完全违背了我"认为"这种行为的方式,这让我发疯了!

    function hasPair(pairArray) {
        pairCount = 0;
        for (i=2; i lte arrayLen(pairArray); i++){
            if(pairArray[i] is pairArray[i-1]){
                pairCount++
                arrayDeleteAt(pairArray, i)
                arrayDeleteAt(pairArray, i-1)
                i=2
            }
        }
        return pairCount;
    }

    function hasStraight(straightArray){
        sequenceCards = 0;
        for (i=2; i lte arrayLen(straightArray); i++){
            if(straightArray[i] - straightArray[i-1] is 1){
                sequenceCards++
            }
        }
        if (sequenceCards GTE 4){
            return 1;
        }
        else{
            return 0;
        }
    }

</cfscript>

<cfoutput>
    <cfset cardList = "5,6,7,8,10,8,9">
    <cfset cardArray = listToArray(cardList)>
    <cfdump var="#cardArray#" label="Original Array Before">
    <cfset arraySort(cardArray, "numeric", "desc")>
     #hasPair(cardArray)# <br/> 
     #hasStraight(cardArray)# <br/> 
    <cfdump var="#cardArray#" label="Original Array After">
</cfoutput>
Run Code Online (Sandbox Code Playgroud)

结果是:

原始数组BEFORE函数调用[6,6,7,8,10,8,9].

原始数组AFTER函数调用[10,9,7,6,5]

数组是排序的(我期望,并且是正确的).但是,8s也不见了.我没想到这一点.8s由第一个函数中的arrayDeleteAt(pairArray,i)和arrayDeleteAt(pairArray,i-1)方法删除.但这应该仅从数组参数(pairArray)中删除元素,而不是原始数组(或者我认为).

Tim*_*sko 8

既然你在这里标记了Lucee,我假设你在Lucee上运行它而不是Adobe的实现.Lucee在这种情况下不符合Adobe规范; 数组像所有其他复杂对象一样通过引用传递.