Использование массива и объектов в Javascript.Когда массив является объектом и когда он получает методы массива? - PullRequest
3 голосов
/ 31 мая 2019

У меня есть некоторый опыт сборки C / C ++ / PIC и VHDL, но я полностью потерян с javascript.Я создаю одностраничное приложение в React, но этот вопрос важнее для понимания, чем для решения проблемы (поскольку я уже нашел свою проблему).

Мой вопрос в Javascript, когдапеременная массив и когда это объект?Как я могу сказать разницу?(Учитывая, что typeof всегда говорит объект).

В случае, если это кому-нибудь когда-нибудь поможет, моей первоначальной проблемой было то, что в моем состоянии у меня был массив объектов, и мне требовалась длина.Я пытался получить его с помощью Array.length (), но это должен был быть Array.length.За 30 минут, которые я потратил впустую, прежде чем я понял это, у меня появилось больше вопросов.

Это был мой конструктор:

constructor(props, context) {
        super(props, context);

        this.state = {
            activeItem: 'home',
            currentSections: [ { key: 'Home', content: 'Home', link: true } ]
        };

        this.handleItemClick = this.handleItemClick.bind(this);
        this.handleTabChange = this.handleTabChange.bind(this);
    }

Для контекста я работал над созданием цепочки для приложения.Чтобы определить, нужно ли мне выталкивать последний элемент массива перед добавлением нового, мне нужна длина массива currentSections.

handleTabChange = (e, data) => {

        let newSections = [];

        newSections = this.state.currentSections;
        if (newSections.length() > 2) {
            newSections.pop();
        }

        let newSection = {
            key: data.panes[data.activeIndex].name,
            content: data.panes[data.activeIndex].menuItem,
            link: true
        };
        newSections.push(newSection);
                this.setState({currentSections: newSections});

    };

Этот код выдает ошибку: Uncaught TypeError: newSections.length не является функцией

В случае, если вы читаете это, потому что у вас есть похожая проблема, проблема былачто newSections.length () должен быть newSections.length.Я ненавижу себя.Прежде чем я понял это, я почему-то думал, что мой массив в состоянии currentSections на самом деле не является массивом.Что привело меня к моему вопросу, когда массив является массивом в Javascript?Я неправильно понимаю, что возвращает typeof?

let newSections = [];
console.log(typeof newSections); //object
newSections = this.state.currentSections;
console.log(typeof newSections); //object
let newSections = [1,2,3];
console.log(typeof newSections); //object

Я получаю, что массив является объектом, но есть ли способ определить, обрабатывается ли переменная как массив по сравнению с простым объектом?Я не мог найти что-либо обсуждающее это, но это может быть потому, что я не знаю, какие термины искать.

1 Ответ

1 голос
/ 31 мая 2019

Разница между объектами и массивами

Несмотря на то, что массивы просто находятся под капотом, они ведут себя совершенно иначе, чем обычные объекты.Причина в том, что Array.prototype объект имеет все Array специальные методы.Каждый новый массив наследует эти дополнительные методы от Array.prototype.

. Важно отметить, что значение свойства prototype Array.prototype равно Object.prototype.Это означает две вещи:

  1. Массивы - это просто объекты, но с некоторыми дополнительными методами.
  2. Объект не может ничего сделать, чего не может массив.

Чтение: https://www.frontendmayhem.com/javascript-arrays-objects/

...