代码之家  ›  专栏  ›  技术社区  ›  Bjorn

为什么数字文本不能访问数字方法?[副本]

  •  27
  • Bjorn  · 技术社区  · 15 年前

    这个问题已经有了答案:

    如果查看ECMAScript 3规范,您将看到基元值类型“空”和“未定义”没有附带的空对象和未定义对象。

    >> Null
    ReferenceError: Null is not defined
    

    其他基元值类型number、string和boolean类型确实有附带的number、string和boolean对象,您可以从全局范围引用这些对象。

    >>Number
    function Number() { [native code] }
    >>Boolean
    function Boolean() { [native code] }
    

    这些原语值类型的目的是提供诸如 toString valueOf 对于各自的原始值类型:

    >>var n = 1;
    >>n.toString();
    "1" 
    

    >>var n = 1;
    >>Number.prototype.toString.call(n);
    "1"
    

    布尔值和字符串也可以这样工作:

    >>var b = true;
    >>b.toString(); 
    "true"
    >>Boolean.prototype.toString.call(b);
    "true"
    

    您可以看到,当您尝试混合类型时,基元值对象正在使用其附带对象的方法:

    >>Boolean.prototype.toString.call(n); 
    TypeError: Boolean.prototype.toString is not generic
    >>Number.prototype.toString.call(b)
    TypeError: Number.prototype.toString is not generic
    

    有趣的是,对于布尔和字符串文字类型,可以直接从文字调用这些方法:

    >>true.toString();
    "true"
    >>Boolean.prototype.toString.call(true)
    "true"
    >>"moo".toString();
    "moo"
    >>String.prototype.toString.call("moo")
    "moo"
    

    基元值为空和未定义,因为它们没有附带的空和未定义对象,因此不能执行以下操作:

    >>Null
    ReferenceError: Null is not defined
    >>null.toString()
    TypeError: Cannot call method 'toString' of null
    

    基元值类型编号的行为类似于二者的混合。你可以打电话 ToString公司 如果直接使用数字的原型对象的方法:

    >>Number.prototype.toString.call(1);
    "1"
    

    但是您不能像使用字符串和布尔值那样从文本本身访问该方法:

    >>1.toString()
    SyntaxError: Unexpected token ILLEGAL
    

    为什么数字文本的行为不同于布尔值和字符串,即使有一个数字对象?

    3 回复  |  直到 15 年前
        1
  •  33
  •   Nick Craver    15 年前

    可以 以同样的方式访问它,这是一个不同的解析问题,要做到这一点,请使用稍微不同的语法:

    (1).toString()
    

    数字可以有小数,所以当您解析代码时,以小数结尾的语法有点含糊不清,请使用括号使其有效。当你看到这同样有效时,你会更清楚一点:

    (1.).toString()
    

    然而,只要 1.toString() 它试图解析为一个数字 带小数点 但是失败了。

        2
  •  5
  •   Community CDub    8 年前

    我想你会在 this answer 到另一个堆栈溢出问题。总结 Theo 的答案:

    解析器期望后面跟着一个数字。 由一个点变为一个浮点 字面意义的。你只要再加一个点就行了。

        3
  •  0
  •   AutoSponge    15 年前

    空(大写N)是变量名。保留字区分大小写。空是对象空。typeof null==“对象”//true