Ссылка Mdn для использования hasOwnProperty в скобках - PullRequest
0 голосов
/ 04 февраля 2020

Я использую следующий код в javascript:

let group = false;
let internalId = "someString";
let appliedTo = "someOtherString";
let keyToGroupBy = true === group ? internalId : appliedTo;

if(grouped.hasOwnProperty([keyToGroupBy])) {
   ...
}

Может ли кто-нибудь дать ссылку на вопрос, почему использование скобок с keyToGroupBy работает предпочтительно в mdn? Это считается взломом (работает случайно) или это что-то обычно используется? Есть ли лучший способ сделать то же самое?

1 Ответ

1 голос
/ 04 февраля 2020

«Нотация в скобках» не является нотацией в скобках . Вы определили литерал массива для массива с одним элементом:

let group = false;
let internalId = "someString";
let appliedTo = "someOtherString";
let keyToGroupBy = true === group ? internalId : appliedTo;

console.log(Array.isArray([keyToGroupBy]))

Итак, это «работает», потому что свойства объектов - это либо строки, либо символы. Поскольку вы не предоставляете символ, он будет превращен в строку. И когда вы делаете это с массивом, результатом является ... строка, равная первому элементу:

let group = false;
let internalId = "someString";
let appliedTo = "someOtherString";
let keyToGroupBy = true === group ? internalId : appliedTo;

let arr = [keyToGroupBy];

console.log(String(arr) === arr[0]);
console.log(String(arr));

Превращение массива в строку включает внутренний вызов Array#join() и, поскольку других значений нет, разделитель не будет будет произведено, и ничто не будет добавлено к единственной строке, которая находится в массиве.

Итак, вы делаете довольно окольный способ ... просто проверять строку.

Считается ли это хаком (работает случайно)

Это в основном хак. Это не совсем нарушение правил преобразования типов, но, конечно, их обход.

или это что-то обычно используемое?

Нет, это не так. Нет смысла оборачивать строки в массивы ... и затем снова конвертировать их в строку, если все, что вам нужно, это строка в первую очередь.

есть лучший способ сделать то же самое ?

Да, просто нет нигде массива литерала: grouped.hasOwnProperty(keyToGroupBy)

...