【问题标题】:Can typeof return a falsey value?typeof 可以返回虚假值吗?
【发布时间】:2021-03-01 13:18:21
【问题描述】:

我在 react 中偶然发现了一些有趣的代码。 Link to code

if (typeof data[Symbol.iterator]) { ... }

在我的理解中,typeof[data[Symbol.iterator]] 应该是真实的,因为 typeof 返回一个字符串。 喜欢:

const obj = {}
if(typeof(obj.x)){
  console.log("hello world");
}

给出“hello world”,因为即使 typeof(undefined) => "undefined" => truthy

tldr: typeof 是否有任何可能的错误结果?

【问题讨论】:

标签: javascript reactjs typeof


【解决方案1】:

如here 所述:

错误 在 ECMAScript 2015 之前,typeof 总是保证返回 提供给它的任何操作数的字符串。即使未声明 标识符,typeof 将返回“未定义”。使用 typeof 永远不可能 产生错误。

但是添加了块范围的 let 和 Statements/const using 在 let 和 const 变量上使用 typeof(或在类上使用 typeof) 在声明它们之前阻塞将抛出一个 ReferenceError。堵塞 作用域变量从一开始就处于“时间死区”中 阻塞,直到初始化被处理,在此期间,它将 访问时抛出错误。

typeof undeclaredVariable === 'undefined';

typeof newLetVariable; // ReferenceError
typeof newConstVariable; // ReferenceError
typeof newClass; // ReferenceError

let newLetVariable;
const newConstVariable = 'hello';
class newClass{};

一般来说,typeof() 将返回一个字符串,因此如果单独检查一个条件将始终为真。如果您想检查变量并验证其是否未定义(或任何其他状态),您可以使用如下条件:typeof(undefinedvariable) == "undefined"

【讨论】:

  • 您能解释一下这里的时间死区是如何应用的吗?如果 typeof 本身抛出错误.. if (typeof data[Symbol.iterator]) { ... } 将如何有效?
  • 我找不到这种情况的任何原因,因为 typeof 总是正确的。似乎这段代码是 2 年前在 commit 中添加到 react 存储库的,以添加对不可序列化类型(例如 Set/Map、Immutable)的支持。
  • 是的,事实证明这种情况确实是荒谬的。谢谢你的帮助! github.com/facebook/react/issues/20905#issuecomment-788032294
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
相关资源
最近更新 更多