Object.assign с булевым

В чем разница между

Object.assign({},obj1,obj2);

а также

Object.assign(true,obj1,obj2);

Я знаю, что делает obj.assign, но что использует последний? он возвращает логический тип с объединением obj1 и obj2 в него.

PS: Это был вопрос интервью, поэтому хотелось бы знать, в чем смысл этого.

Всего 2 ответа


Кроме того, boolean должен быть примитивным типом, он имеет обертку типа объекта, которая ... удивляет Boolean.

В случае

Object.assign(true,{a: 1}, {b: 2})

есть такой бокс (термин из Java / C # миров, который мне действительно нравится) происходит. И тогда Object.assign работает над этой оберткой типа объекта, как и должно. Вот почему результат выглядит в консоли, как

Boolean {true, a: 1, b: 2}

Объект Boolean, как и все другие объекты, может быть дополнен пользовательскими ключами / значениями. Результат выглядит запутанным, но если вы расширите его в консоли, вы увидите, что на самом деле нет «значения истины без ключа» - так что это просто сложный вывод.

BTW точно так же происходит со строками, когда вы пытаетесь вызвать какой-то метод на примитивном значении, например

�'.split(/./)

Он преобразуется в объект с помощью конструктора String() а затем вызывает метод String.

И да, я считаю, что он никогда не должен использоваться в реальном коде жизни.

Вот спецификация говорит :

  1. Позвольте быть ToObject (цель).

Таким образом, явное преобразование примитива в объект является первым шагом.


Как указано выше, примитивы получаются «в штучной упаковке», поэтому:

 Object.assign(true, obj1, obj2)

просто такая же, как:

 const bool = Object.assign(new Boolean(true), obj1, obj2)

теперь логические объекты являются просто регулярными объектами, которые возвращают логическое значение, когда на них вызывается valueOf() . Это означает, что вы получаете какое-то смешное поведение:

 bool === true // false
 bool == true // true
 +bool === 1 // true

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

  if(Object.assign(false,{a: 1 }))
   alert("works");

Таким образом, на самом деле нет никакой разницы между обычным объектом и булевым объектом, за исключением того, что последний добавляет некоторую путаницу и не имеет никакой цели.


Есть идеи?

10000