Почему я могу получить доступ к свойству объекта с помощью массива? - PullRequest
5 голосов
/ 12 марта 2019

Может кто-нибудь объяснить поведение следующего кода?

let obj = {a:1, b:2}
let i = ['a']
console.log(obj[i])
>> 1

Почему даже массив может использоваться для доступа к свойству внутри объекта?В качестве примечания, это работает только с массивом длины 1. Я пытался исследовать это, но, насколько мне известно, нет документации, объясняющей, почему это должно работать.

Ответы [ 2 ]

9 голосов
/ 12 марта 2019

Имена свойств всегда являются строками или символами .

Если вы передаете что-то, что не является строкой или символом, оно преобразуется в строку.

Метод toString() по умолчанию для массива примерно равен:

String.prototype.toString = function () { return this.join(","); }

То есть ['a'] преобразуется в 'a'.

В качестве примечания, это работает только с массивом длины 1.

Работает нормально смассивы, которые длиннее.Вам просто нужно соответствующее значение:

const o = {
    "a,b": "Hello"
}
const a = ["a", "b"];
console.log("" + a);
console.log(o[a]);

И поскольку любой объект может быть преобразован в строку, и вы можете настроить метод toString, вы можете делать действительно странные вещи:

const data = {
  "42": "Hello"
}

class Weird {
    constructor(x) {
        this.x = x;
    }
    toString() {
        return this.x + 40;
    }
}

const w = new Weird(2);
console.log(data[w]);

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

0 голосов
/ 12 марта 2019

let obj = {a:1, b:2}

Сначала вы объявляете объект с 2 свойствами, a и b со значениями 1 и 2. соответственно.

let i = ['a']

Затем переменнаяi объявляется со значением, равным строковому массиву с одним элементом, 'a'.

console.log(obj[i])

В этом выражении значение i преобразуется в строку, посколькумассив, как вы упомянули, содержит только один элемент.В связи с этим «a» является допустимым именем свойства для obj, поскольку все свойства объекта являются либо строками, и если вы передаете что-то, например, массив, оно преобразуется в строку.

Если вы ссылаетесь на переменную i, содержащий массив и состоящий из нескольких элементов, он не может преобразоваться в одно имя свойства, если вы не будете более явными, например obj[i[0]].Если у вас есть только одно значение, оно будет преобразовано в это значение.

obj['a'] является допустимым свойством obj['a,b'] не является.

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