【问题标题】:Why (3).constructor is valid while "constructor" in (3) is not valid?为什么 (3).constructor 有效,而 (3) 中的“constructor”无效?
【发布时间】:2023-04-06 01:39:01
【问题描述】:

(3).constructor 是 Number,但 "constructor" in (3) 是 TypeError,为什么?

【问题讨论】:

  • 我不明白你的问题。你能发布代码示例吗?
  • 我认为这个问题很清楚。表达式 ((3).constructor) 返回 Number 函数,而表达式 ("constructor" in (3)) 抛出 TypeError。关键是 3 就像一个对象,所以它不能与 in 一起工作的事实令人困惑。

标签: javascript constructor javascript-objects


【解决方案1】:

通过使用property accessor,数字3 变成了Number 的对象。该类型的对象具有构造函数,因此具有constructor 属性。

但是as ChaosPandion already pointed outin operator 需要正确的表达式来产生一个对象,但3 不是一个对象,而是一个普通的数字文字。

【讨论】:

    【解决方案2】:

    in 运算符的规范解释了这一点。具体参见语义评估的第 5 步。

    11.8.7 in 运算符

    产生式 RelationalExpression : RelationalExpression 中的 ShiftExpression 评估如下:

    1. 设 lref 为计算 RelationalExpression 的结果。
    2. 设 lval 为 GetValue(lref)。
    3. 设 rref 为计算 ShiftExpression 的结果。
    4. 设 rval 为 GetValue(rref)。
    5. 如果 Type(rval) 不是 Object,则抛出 TypeError 异常。
    6. 返回使用参数 ToString(lval) 调用 rval 的 [[HasProperty]] 内部方法的结果。

    (3).constructor 起作用的原因有点难以理解,但本质上,当您在具有原始基础的引用上使用点运算符时,它会被提升到一个对象中。

    【讨论】:

    • 在 JS 中一切最终不都是对象吗?
    • 我以为是 Java,在 JS 中它只是 var,除非另有说明。再说一次,我对 JS 一无所知。只知道 java 有 100% OOP
    • @cHao, @Proclyon - JavaScript 有一个“原始值”的概念,它包括以下类型:Undefined、Null、Boolean、Number、String。
    猜你喜欢
    • 2023-04-07
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 2018-07-02
    • 2020-03-09
    • 2011-07-05
    相关资源
    最近更新 更多