JQuery / JavaScript:为什么函数会在函数外部搞乱?

时间:2014-04-11 14:25:17

标签: javascript jquery

我不明白! 函数messup()应该改变copy,而不是original。我做错了什么?

<head>
    <script src="../js/jquery-1.11.0.min.js"></script>
    <script>
        function messup(copy) {
            copy[0] ++;
            console.log(original);
            $('.putContentHere').html('<button class="plus">+</button>');
        }

        var original = [1, 1];
        var copy = original;

        $(document).ready(function() {
            messup(copy);

            $('html').on('click', '.plus', function() {
                messup(copy);
            });
        });
    </script>
</head>
<body>
    <div class="putContentHere"></div>
</body>

如何在副本混乱时保留原件?

3 个答案:

答案 0 :(得分:5)

制作数组副本的最简单方法是:

var copy = original.slice(0);

这是一个数组的副本,这对你的目的来说很好。

一个简单的任务:

var copy = original;

导致新变量&#34; copy&#34;引用与&#34;原始&#34;完全相同的数组。数组是对象,变量值引用到对象。

旧版IE中.slice()方法并不存在,但这些方法的相关性正在下降。

答案 1 :(得分:0)

因为var copy = original;没有复制数组。

What it does:
original ----------------------> Array
                                   |
                                   |
copy     --------------------------+      (The reference is copied)
=================================================================================
What you want:
original ----------------------> Array


copy     ----------------------> Array   (The Array itself is copied)

复制数组有3种(实际上是4种):Shallow copyDeep copy,参考副本。

在您的代码中,您只是复制引用。你想要做的是浅拷贝或深拷贝。

var copy = original.slice(); //shallow copy

答案 2 :(得分:0)

您只是通过执行

来使用对原始数组的引用
var copy = original;

假设您的数组只是一组整数,使用

var copy = original.slice (0); 

将复制您的数组及其内容。所以,例如:

var original = [1, 1, 1];
var copy = original.slice (0);

copy[1] = 2;
console.log (original); // This will print [1, 1, 1]
console.log (copy); // This will print [1, 2, 1]