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

Как насчет:

//deleted constructor
class Foo
{ 
  public: 
    Foo() = delete;     
  public:
    static void foo();
};

void Foo::foo()
{
   Foo f;    //illegal
}

против

//private constructor
class Foo
{ 
  private: 
    Foo() {}     
  public:
    static void foo();
};

void Foo::foo()
{
   Foo f;    //legal
}

Они в основном разные вещи. private сообщает вам, что только члены класса могут вызывать этот метод или обращаться к этой переменной (или, конечно же, к друзьям). В этом случае для метода static этого класса (или любого другого члена) является законным конструктором класса private. Это не выполняется для удаленных конструкторов.

Пример здесь .

2510
задан mrSaraf 11 February 2019 в 10:02
поделиться

2 ответа

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

, Создают помощника TypeOf

const TypeOf = obj => Object.prototype.toString.call(obj).slice(8,-1);

, Это подобно typeof, но теперь возвращается Array для [] и Object для {}. Мне нравится думать о нем как о строгом typeof. Если Вы работаете над приложением Gmail, и производительность является беспокойством тогда, можно сделать что-то вроде этого.

const TypeOf = obj => (
  Array.isArray(obj)
   ? "array"
    : obj === null // catch null edge case.  typeof null is an object :)
   ? null
    : typeof obj
)

Вы могли остановиться здесь и прекратить дело, однако Вы могли сделать это немного более мощным составом использования. Вы извлекаете большую пользу при создании Функтора TypeBox, снова необычное слово для передачи функции к значению вместо того, чтобы передать значение функции.

Создают TypeBox

const TypeBox = (predicate, defaultValue) => {
  const TypePredicate = value => ({
     value,
     map: cb => predicate(value)
                ? TypePredicate(cb(value))
                : TypePredicate(defaultValue)
  });
  return TypePredicate;
}

здесь существует большое продолжение, но это очень мощно. Функция TypeBox использует закрытие и возвращает наш Функтор. Закрытия предоставляют Вам доступ к Lexical_Scope, думают о нем как о рюкзаке, который содержит вещи, к которым Вы хотите получить доступ позже.

Создают ArrayBox

const ArrayBox = TypeOf(obj => TypeOf(obj) === 'Array' ? obj : [obj]);

ArrayBox, передает наш predicate и defaultValue к [1 112] и будет доступен, когда мы вызываем/выполняем ArrayBox (назовите его, вообще имеет смысл для Вашего варианта использования).

Теперь забавная часть

, Если входом является Массив, возвращает его.

ArrayBox(["foo", "bar"]).value; // ['foo', 'bar']

, Если вход не является массивом, возвратите его в одном

ArrayBox("foo").value // ["foo"]

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

существует много других способов, которыми мы могли приблизиться к этому использованию Или или Монады.

0
ответ дан Robby_rob 4 October 2019 в 07:10
поделиться

сначала можно проверить console.log (typeof Объект)

, если вывод является объектом затем var {данные} =object т.е. просто destructure объект согласно объектным ключам. и функция может быть похожей на это.

const abc=(str1,str2=null)=>{


     var result=[];
      result.push(str1);result.push(str2);
      return result.join("");

}
0
ответ дан 22 November 2019 в 19:51
поделиться
Другие вопросы по тегам:

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