В чем разница между
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.
И да, я считаю, что он никогда не должен использоваться в реальном коде жизни.
Вот спецификация говорит :
- Позвольте быть 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");
Таким образом, на самом деле нет никакой разницы между обычным объектом и булевым объектом, за исключением того, что последний добавляет некоторую путаницу и не имеет никакой цели.