Object.keys возвращает массив ключей. Ваша переменная name
является массивом с одним элементом ['toys']
. Когда вы обращаетесь к product[name]
, происходит неявное приведение массива имен к строке, что приводит к product["toys"]
. В javascript есть два типа приведения неявное и явное приведение
Когда вы обращаетесь к свойствам объекта, они будут строковыми, в случае массива они будут индексами (числами), но массив также является объектом, когда вы добавляете любое свойство в массивон может выступать в качестве свойства объекта (строки) и не будет учитываться по длине массива.
let arr = [1,3];
arr.val = 20;
console.log(arr.length); // 2
В вашем примере вы обращаетесь к свойству объекта product[name]
здесь name
- это массив. Здесь произойдет неявное приведение массива к строке . Javascript автоматически вызовет метод toString
для вашего объекта, который в данном случае является массивом. Для Array
существует метод toString
, связанный с их прототипом Array.prototype.toString . Вы можете изменить это, если хотите получить другой результат.
Проще говоря, когда вы пытаетесь получить доступ к переменной в if
, условное выражение javascript автоматически приводит к значению Boolean
.
let a = 10;
if(a){
console.log("implicit coercion");
}
if(Boolean(a)){
console.log("explicit coercion");
}
Чтобы узнать больше о грамматике и типах Javascript.