Создание ящика для объекта с уникальным ключом в Javascript

#javascript

#javascript

Вопрос:

Я хочу создать объект с уникальным ключом, например:

 let id = Symbol("id");
let id2 = Symbol("id");

const obj = {
      [id]: ()=>  'test'
}


console.log(obj[id]()) 

В приведенном выше случае я могу получить доступ к возвращаемому значению, только если у меня есть Symbol . И это работает.
Вопрос: Как создать условие, чтобы избежать ошибки id is not defined , если я сделаю это:

 //let id = Symbol("id");
//let id2 = Symbol("id");

const obj = {
      [id]: ()=>  'test'
}


console.log(obj[id]()) 

Поэтому в этом случае я не хочу получать ошибку, а просто получить пустой объект или что-то в этом роде. Как с этим справиться?

Комментарии:

1. Почему бы просто не сделать что-то вроде if (typeof id !== "undefined)" ? И вообще, зачем вам пытаться использовать переменную, которая может быть или не быть объявлена?


Ответ №1:

вы можете проверить наличие свойства в этом объекте перед его вызовом, обратитесь к hasOwnProperty

     let id = Symbol("id");
    let id2 = Symbol("id");

    const obj = {
          [id]: ()=>  'test'
    }

    if (obj.hasOwnProperty(id2)) { // false 
      console.log(obj[id2]());
    }
    
    if (obj.hasOwnProperty(id)) { // true
      console.log(obj[id]()); 
    } 

id2 не будет напечатан, потому что это свойство не существует в объекте, но id существует

Комментарии:

1. Предполагая, что в OP даже не объявлена переменная id (я до сих пор не знаю, почему) hasOwnProperty , это не помогает, поскольку он по-прежнему считывает отсутствующую переменную и выдает исключение.

Ответ №2:

Вы можете использовать блок try-catch.

 try {
    const obj = {
      [id]: ()=>  'test'
    }
} catch(err) { console.log('test error catched. Do what you want to do here.'); }
 

Ответ №3:

Нет смысла проверять наличие необъявленных ошибок переменных или около того, это просто дерьмово.

Если ваша цель — просто создать объект с помощью какого-либо метода, создайте его просто как:

 const test = () => 'test';

const obj1 = { somethingYouWant: test };
const obj2 = { id: test };
const obj3 = { otherThing: test };