【问题标题】:Is a try-catch block a reliable way to use the `in` operator?try-catch 块是使用“in”运算符的可靠方法吗?
【发布时间】:2019-07-12 22:46:28
【问题描述】:

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. hasOwnProperty
    这种方法根本不使用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 方法是否不明智?

【问题讨论】:

  • JavaScript 不支持类型转换。 Object(value) 不是类型转换,它为原始值创建一个正确类型的对象。所有原始类型都可以使用文字来表示,但它们也有扩展 Object 的类型。文档解释说:“在非构造函数上下文中调用时,Object 的行为与 new Object() 相同。” -- developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 类型转换是示例的目的,但是,这感觉像是一个不必要的挑剔。
  • const isObject = value => typeof value === "object" && value!==null, isFoo = value => isObject(value) && 'foo' in value;怎么样

标签: javascript


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    相关资源
    最近更新 更多