Я ожидаю, что моя ссылка oldPosts будет указывать на этот элемент с 99 элементами.
массив. Однако, когда это console.logged, я вижу 100 элементов. Почему
что?
Хороший вопрос, позвольте мне попытаться объяснить. В этом случае массив будет храниться в некоторой ячейке памяти, а this.state.posts
будет иметь ссылку на этот array
. Вы ссылаетесь на тот же array
с помощью oldPosts
, это означает, что oldPosts
указывает на массив, а не на this.state.posts
.
Когда мы обновим значение this.state.posts
, у него будет новый ref, ref для вновь созданного array
, а не для старого массива. Но этот oldPosts
все еще будет указывать на старый массив.
Даже если вы назначите любое значение, кроме массива, оно никогда не повлияет на значение oldPosts
.
Посмотрите на этот пример, вы получите лучшее представление:
// consider this as state obj
let obj = {
posts: [1, 2, 3, 4],
}
let oldPosts = obj.posts;
let newPosts = obj.posts.filter(el => el < 4);
// same as setState
obj.posts = newPosts;
// still point to old array
console.log('oldPosts', oldPosts);
// it will have the new array
console.log('obj.posts', obj.posts);
obj.posts = 10;
// now it will have a totally new value
console.log('obj.posts', obj.posts);
Проверьте еще один пример:
let a = [1, 2, 3, 4];
let b = a;
/*
a and b both points to same array, but if we assign a
new value to a, b will still points to array
*/
a = 10;
// by changing the value of a, it will not affect b
console.log('a', a);
// still point to array
console.log('b', b);