Почему множественное присваивание в массиве здесь происходит именно так?

Из того, что я понимаю и как я подхожу,

Интерфейс подобен спецификации / контракту, любой класс, реализующий класс интерфейса, должен реализовать все методы, определенные в абстрактном классе (кроме методов по умолчанию ( введенный в java 8))

В то время как я определяю абстрактный класс, когда знаю реализацию, требуемую для некоторых методов класса и некоторых методов, я до сих пор не знаю, какова будет реализация (мы могли бы знать функцию но не реализация). Я делаю это так, чтобы позже в той части разработки, когда я знаю, как эти методы должны быть реализованы, я могу просто расширить этот абстрактный класс и реализовать эти методы.

Примечание. Вы не можете иметь тело функции в интерфейсе если метод не является статическим или по умолчанию.

1
задан Arjon Cahani 29 March 2019 в 11:37
поделиться

1 ответ

Вы передаете ссылку на массив, и каждый элемент использует одну и ту же ссылку на объект для данного массива.

Вы можете использовать функцию, которая возвращает новый массив для каждого вызова.

Array.dim = function(dimensions, init) {
    var a = [],
        i;
    for (i = 0; i < dimensions; i++) {
        a[i] = typeof init === 'function' ? init() : init;
    }
    return a;
}

var p = Array.dim(20, 0),
    q = Array.dim(10, () => []);

q[0][0] = 0;

console.log(p);
console.log(q);

Немного более короткий подход.

Array.dim = function(length, init) {
    return Array.from({ length }, typeof init === 'function' ? init : () => init);
}

var p = Array.dim(20, 0),
    q = Array.dim(10, () => []);

q[0][0] = 0;
console.log(p);
console.log(q);

0
ответ дан Nina Scholz 29 March 2019 в 11:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: