Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 问题在于+&引用;及-&引用;操作员_Javascript_Algorithm - Fatal编程技术网

Javascript 问题在于+&引用;及-&引用;操作员

Javascript 问题在于+&引用;及-&引用;操作员,javascript,algorithm,Javascript,Algorithm,问题是-操作员不工作(在第8行)。请参见下面的我的代码: array = [0,0,0,0,3,0,0,0,0], n = 0; for(var i = 0; i < array.length; i++){ if(n < 9){ //the "n" variable there's only for don't crash the browser with a infinite loop if(array[i] == 3){ arra

问题是
-
操作员不工作(在第8行)。请参见下面的我的代码:

array = [0,0,0,0,3,0,0,0,0],
n = 0;

for(var i = 0; i < array.length; i++){
    if(n < 9){ //the "n" variable there's only for don't crash the browser with a infinite loop
        if(array[i] == 3){
            array[i] = 0;
            array[i - 1] = 3; //I believe that here is the problem
        }
    }
n++;
}

console.log(array);
array=[0,0,0,0,3,0,0,0,0],
n=0;
对于(var i=0;i
所以我想将“3”值移动到数组的开头。但它只有在我使用
+
操作符(第8行)时才起作用。因此,如果我使用
+
一,那么“3”值将到达数组的末尾


有人知道为什么在这种情况下,
-
操作符不起作用,
+
起作用吗?

在循环的第一次迭代中,当i为零时,(i-1)为-1,所以您尝试访问数组[-1],这是无效的。

如果将第8行更改为:

array[i+1] = 3;
然后,数字3将一直延伸到数组的末尾(好吧,超出数组的末尾,我将该死地发现Javascript会做什么!)。这是因为循环以递增的顺序遍历数组,接下来将检查位置
i+1


另一方面,对于当前的第8行,数字3向后移动一个位置(已经检查过),因此它不会一直移动到数组的开头,只移动一个位置。如果你想让它以同样的方式一直运行,你应该反转循环(让它按照位置的降序遍历数组)。

好的,我将回答我认为真正的问题,而不是回答“有人知道为什么-运算符在这种情况下不工作,+工作吗?”,如原始帖子中所述:我想将“3”值移动到数组的开头。我想这就是所希望的:

var array = [0,0,0,0,3,0,0,0,0];
var first_val = 3;

var index = array.indexOf(first_val);
if (index > 0) {
    array.splice(index, 1);
    array.unshift(first_val);
}

console.log(array);
灵感来自

我想将“3”值移动到数组的开头

使用中提供的正确答案。然后使用
.indexOf()
移动它

Array.prototype.move = function (old_index, new_index) {
    if (new_index >= this.length) {
        var k = new_index - this.length;
        while ((k--) + 1) {
            this.push(undefined);
        }
    }
    this.splice(new_index, 0, this.splice(old_index, 1)[0]);
    return this; // for testing purposes
};

var array = [0,0,0,0,3,0,0,0,0];

var result = array.move(array.indexOf(3),0);

console.log(result);

它不是无效的,它从末尾开始倒计时。它可能倒计时,但这几乎肯定不是本例的目的。此外,它是否真的倒计时也是不标准的。在我的解释器中,[1,2,3,4,5,6][-1]未定义。@AShelly否,它创建属性'-1'并赋值。数组基本上是具有特殊长度属性的普通对象。属性是字符串,不是数字,不,我想。你可以看到有这样一个条件:如果(数组[i]==3),那么我将访问“3”索引,在这种情况下,将是:4-1=3。。。有一个循环,因此循环将执行:4-1=3,在3-1=2之后,依此类推。你可以看到,如果你尝试做数组[i+1],就会发生这种情况,因此:4+1=5,5+1=6等等……当
i==0
并且数组是第1行显示的数组时,他不会做
-1
。这种问题可以用纸和笔轻松地调试。跟踪
i
的当前值、数组的内容等,并逐步检查代码。问题是,对于i=0,i-1不是数组的有效索引。在发布问题之前,请测试您的代码并质疑您自己的假设。你在要求别人花宝贵的时间来帮助你,所以在你提出要求之前,要尽一切努力去了解发生了什么。