Как проверить, является ли значение массивом или объектом

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

То есть:

class Outer {
  constructor(inner) {
    if (inner is an object) { // this is the statement I don't know how to write
      this.inner=inner
    }
    else {
      this.inner = {"value1":inner}
      this.inner.value2=... blah blah blah
    }
  }

В моем первом черновике я сказал: if (typeof Internal == «object»). Это не сработало, потому что для массивов оно возвращает true. Я предполагаю, что массив — это частный случай объекта.

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

Итак... есть ли способ проверить, является ли значение объектом, а не массивом?

Если это актуально, в новом Outer я хочу передать значение как литерал, т. е. я мог бы сказать new Outer([1,2,3]) или new Outer({"value1":[1,2,3] ,"значение2":[2,3,4]).

И да, я знаю, что могу решить проблему, просто всегда передавая объект, и это то, что я собираюсь делать, по крайней мере, в краткосрочной перспективе. Я думал, что New Outer был бы чище, если бы я мог сказать new Outer([1,2,3]), а не new Outer({"value1":[1,2,3]}). Но это не так уж и важно. Но мне бы хотелось знать, как это сделать, по крайней мере, для дальнейшего использования.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вот что вам нужно сделать.

class Outer {
  constructor(inner) {
    if (Array.isArray(inner)) { 
      this.inner=inner
    }
    else {
      this.inner = {"value1":inner}
      this.inner.value2=... blah blah blah
    }
  }

Массивы — это особый тип объектов только в JavaScript. Итак, когда мы используем оператор typeof, он дает объект.

console.info(type of someArray);
// Will give object

Но класс Array имеет некоторые методы, такие как isArray(), которые можно использовать для определения того, является ли что-либо массивом.

Array.isArray(someArray)

Итак, эта функция возвращает логическое значение.

console.info(Array.isArray(someArray))
// Will give true

Я надеюсь, что это помогает. Приветствую 🤜🏻🤛🏻

Вы можете проверить прототип:

class Outer {
  constructor(inner) {
    if (Object.getPrototypeOf(inner) === Object.prototype) {
      this.inner=inner
    }
    else {
      this.inner = {"value1":inner}
    }
  }
}

console.info(new Outer({value1:[1,2,3]}));
console.info(new Outer([1,2,3]));

Или используйте Array.isArray():

class Outer {
  constructor(inner) {
    if (!Array.isArray(inner)) {
      this.inner=inner
    }
    else {
      this.inner = {"value1":inner}
    }
  }
}

console.info(new Outer({value1:[1,2,3]}));
console.info(new Outer([1,2,3]));

Другие вопросы по теме