温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - Can a JavaScript object return a value AND console log?
console javascript lookup object

其他 - JavaScript对象能否返回值和控制台日志?

发布于 2020-04-19 14:29:33

我有一个看起来像这样的对象:

const CONVERT = {
  a: 1,
  b: 2,
  c: 100,
};

我正在像这样使用它:

let x = 'a';
// some logic that may change x
const value = CONVERT[x];

说我知道x ='c'时这是一个错误情况。当x ='c'时,我想console.error('值限制为100'的限制)

在CONVERT对象分配中是否有一种优雅的方法来做到这一点?我希望我可以做这样的事情:

const CONVERT = {
  a: 1,
  b: 2,
  c: ( ()=> { console.error( 'value clamped at the limit of 100' ); return 100; )(),
};

...但是,这并不会安慰控制台。调用CONVERT ['c']时会出错,而是在实例化CONVERT对象时立即执行此操作。

我能想到的唯一选择是:

let x = 'a';
// some logic that may change x
const value = CONVERT[x];
if( value === 100 ) {
  console.error( 'value clamped at the limit of 100' );
}

但这意味着无论我在哪里使用CONVERT,我现在都需要执行此额外的if-check,以便我可以console.error所需的消息。如果我知道x不等于'c',我想避免完全执行if-check。

我的另一选择是摆脱CONVERT对象,而将if-else或switch这样的代码硬编码:

let value;
if( x === 'a' ) {
  value = 1;
} else if( x === 'b' ) {
  value = 2;
} else if( x === 'c' ) {
  value = 100;
  console.error( 'value clamped at the limit of ', value );
}

同样,我希望我可以绕过查找对象的使用。

查看更多

提问者
MarekKnows.com
被浏览
15
Nick Parsons 2020-02-05 10:09

似乎您可能正在使用getter之后,该函数可以在属性访问时执行。从getter返回的值CONVERT['c']是被评估为的值

const CONVERT = {
  a: 1,
  b: 2,
  get c() { 
    console.error( 'value clamped at the limit of 100' ); 
    return 100; 
  }
};


let x = 'a';
x = 'c'; // some logic that may change x
const value = CONVERT[x];
console.log(value);