尝试捕获块是使用in运算符的可靠方法吗?

时间:2019-07-12 14:36:38

标签: javascript

in operator仅可用于非原始值。尝试在原语上使用in运算符会引发TypeError。

示例功能

function isFoo(value) {
  return value && 'foo' in value;
}
  

TypeError:无法使用'in'运算符在原始值

中搜索'foo'

有几种方法可以避免此问题:

  1. 类型检查
    这种方法似乎是最合适的,因为它可以使原语无效的事实正式化。但这很长。
function isFoo(value) {
  const type = typeof value;

  return value
    && type !== 'string'
    && type !== 'number'
    && type !== 'boolean'
    && 'foo' in value;
}
  1. 类型转换
    这种方法比最后一种方法短,并且可以完成相同的工作,但是会增加性能开销。
function isFoo(value) {
  const obj = Object(value);

  return value && 'foo' in obj;
}
  1. 具有自己的财产
    此方法完全不使用in运算符,而是使用基元上可用的hasOwnProperty方法。但是更长。
function isFoo(value) {
  return value && value.hasOwnProperty('foo');
}

但是,我想知道这种使用try-catch块的最终方法是否可靠或正确。

尝试...捕获

function isFoo(value) {
  try {
    return value && 'foo' in value;
  } catch {
    return false;
  }
}

我担心,例如,某些JS实现可能不会因滥用in运算符而引发可捕获的异常。我也不确定是否故意允许TypeError异常会对性能产生影响。

使用try-catch方法是否不明智?

1 个答案:

答案 0 :(得分:0)

就最佳做法而言,如果您适当地使用异常(即仅在真正异常或意外的错误情况下),则它们不太可能对性能造成重大影响,并且完全可以接受。

但是,在您的情况下,依靠try-catch块进行控制流可能会在程序上产生可观的时间成本,尽管它实现了所需的输出,因此不被视为最佳方法。

我建议您改用之前提到的一种方法,可能是第一种。