1

I'm writing this JavaScript code expecting the output as

[["o","o","x","o","o"],["o","x","x","x","o"]]

but instead it gives

Received output in the console

<script>
function createArray(x) {
  var array=[];
  var finalArray=[];
  
  for(var i=1;i<=x;i++){
    array[i-1]='O';
  }

  var midIndex=Math.round(x/2)-1;
  
  array[midIndex]='X';


  finalArray.push(array);

  var num1=midIndex-1;
  var num2=midIndex+1;
 
 
  
    array[num1]="X";
    array[num2]="X";
    
    finalArray.push(array);

  console.log(finalArray) ;
  
}

createArray(5);


</script>

please some one show the reason for this.

3
  • 1
    Try finalArray.push(array.slice()); the first time. Commented Jul 28, 2020 at 6:03
  • 1
    .push() doesn't clone the array you're pushing into finalArray. You push the "same array" (a reference to the same array) twice. Commented Jul 28, 2020 at 6:03
  • 2
    Is JavaScript a pass-by-reference or pass-by-value language? Commented Jul 28, 2020 at 6:06

3 Answers 3

3

In Javascript, objects(in your case array) are passed by reference. You push the array into finalArray and then update the array. But you have updated the data from same reference. So you could use spread operator which would effectively create a new array(with new reference) and you can push this array to finalArray

finalArray.push([...array]);
Sign up to request clarification or add additional context in comments.

2 Comments

This is called spread syntax not destructuring
@adiga Was just about to comment the same. Spot ON
2

That's because Javascript objects are passed by reference. You should create a copy of the array and push to the final one

function createArray(x) {
  var arr=[];
  var finalArray=[];
  
  for(var i=1;i<=x;i++){
    arr[i-1]='O';
  }

  var midIndex=Math.round(x/2)-1;
  
  arr[midIndex]='X';


  finalArray.push(arr.slice());

  var num1=midIndex-1;
  var num2=midIndex+1;
 
 
  
    arr[num1]="X";
    arr[num2]="X";
    
    finalArray.push(arr.slice());

  console.log(finalArray) ;
  
}

createArray(5);

Comments

2

It's for JS pointer When you Push array into final u push pointer of array into an index of final and when change array the final changed too.

for resolve it u can use easy Code:

finalArray.push([...array]);

GoodLuck

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.