Object.assign с логическим значением - PullRequest
0 голосов
/ 06 октября 2018

Какая разница между

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

и

Object.assign(true,obj1,obj2);

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

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

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

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

 Object.assign(true, obj1, obj2)

- это то же самое, что и *

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

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

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

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

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

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

0 голосов
/ 06 октября 2018

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

В случае

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

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

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

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

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

'12345'.split(/./)

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

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

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

  1. Пусть будет ToObject (target).

Так что явное преобразование примитива в объект - это самый первый шаг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...