Questo codice simula riferimenti (puntatori), come in altre lingue:
Array.prototype.subarray = function(i, j){
var self = this, arr = [];
for(var n = 0;i <= j; i++, n++){
(function(i){
Object.defineProperty(arr, n, { //Array is an Object
get: function(){
return self[i];
},
set: function(value){
self[i] = value;
return value;
}
});
})(i);
}
return arr;
}
//This is the exact code you have in your question
var foo = [1, 2, 3, 4, 5];
var bar = foo.subarray(2, 4);
console.log(bar); // [3, 4, 5]
bar[0] = 'hello, world'; // some magic happens here
console.log(bar); // ['hello, world', 4, 5]
console.log(foo); // [1, 2, 'hello, world', 4, 5]
Demo: http://jsfiddle.net/DerekL/y7z9T/
subarray
fa non creat e un nuovo array copiando l'array originale; crea una matrice vuota con custom getters. Una cosa da tenere a mente è che i valori nel nuovo array sono collegati all'indice dell'array originale, invece della sua posizione di memoria.
index
0 1 2 3 4
┌────────────┐
┌───┬───┬┤───┬───┬───┐│
│ 1 │ 2 ││ 3 │ 4 │ 5 ││
└───┴───┴┤───┴───┴───┘│
└────────────┘
├──── Whole Array ────┤
├─ SubArray ─┤
Il "sub array" fornisce una "finestra" per l'array originale. Puoi modificare e ottenere i valori di contenimento in entrambi gli array come faresti normalmente. Cambiare uno di essi avrà effetto su entrambi. Tuttavia, se provi a inserire nuovi elementi nel "sub array", le cose brutte succedono, quindi non farlo.
Per ulteriori informazioni su defineProperty
per favore visit MDN.
Sì, usare 'slice' non funziona per quello che voglio. L'idea è di ottenere una nuova vista nello * stesso * array (dove l'unica differenza è l'indice iniziale), non crearne uno nuovo. –
In realtà è possibile, usando setter e getter. Non pratico, ma possibile. – Gio