【问题标题】:Understanding Number functions in JavaScript了解 JavaScript 中的数字函数
【发布时间】:2014-05-27 13:35:12
【问题描述】:

我在 Mozilla Developer Network 上阅读了有关 JavaScript Number 对象的信息。我是新来的。以下是我的脚本:

var number = 16;
console.log( Number.prototype.toExponential(number) );
console.log( Number.prototype.toFixed(number) );
console.log( Number.prototype.toPrecision(number) );
// DON'T UNDERSTAND WHAT THIS DOES
// console.log( Number.prototype.toSource(number) );
console.log( Number.prototype.valueOf(number) );  

和输出:

0.0000000000000000e+0 
0.0000000000000000 
0.000000000000000 
0   

我想知道为什么尽管有number = 16,但我得到的都是零。 请帮助我理解这一点。 :)

【问题讨论】:

    标签: javascript


    【解决方案1】:

    你必须有:

    var number = 16;
    console.log(number.toExponential());
    console.log(number.toFixed());
    console.log(number.toPrecision());
    

    使用原型,您可以定义自己的方法和对象的属性

    原型基本上是扩展对象

    这是一个简单的原型示例:

    Number.prototype.isPrime = function() {
        if ( this === 0 || this === 1 ) {
            return false;
        }
        for ( var i = 2; i < this; i++ ) {
            if ( this % i === 0 ) {
                return false;
            }
        }
        return true;
    };
    
    var arr = [2,4,5,13,15,121];
    
    for ( var i = 0; i < arr.length; i++ ) {
        console.log(arr[i].isPrime());
    }
    

    在此示例中,this 关键字指的是数字对象(因此您不必在函数中传递任何参数进行操作)

    JSFIDDLE

    看看prototype

    【讨论】:

    • 但请不要在现实生活中更改 Host 对象。
    • @phylax 这是什么意思? :)
    • 主机对象是NumberArrayString ...改变它们的行为被认为是不好的做法。在此处阅读更多信息:stackoverflow.com/questions/6223449/…
    • @phylax:这些不是 Host 对象,在现实生活中扩展它们的原型可能很有用。不同的人对这件事有不同的意见,但本质上并没有错。它更具情境性。
    • @phylax 像 cookie 怪物说我没有看到任何问题,反正我只是展示了一个例子 prototype 是如何工作的
    【解决方案2】:

    Number.prototype 函数基于实际数字(原型是特定类型的定义。字符串变量具有基于 String.prototype 的函数,数组具有基于 Array.prototype 定义的函数等。http://javascript.crockford.com/prototypal.html 是一个很好的选择了解原型继承的起点),所以只需调用number.toFixed()number.toFixed() 等。你甚至可以调用(16).toString() 等。

    您通过调用原型函数而不是“on 16”来调用函数“on nothing”。

    【讨论】:

    • 请向我解释.prototype的概念:)我以前从未见过:)
    • 它是面向对象 javascript 的全部基础... =) 对象具有由原型定义的类型,并且实例共享所有原型函数。你肯定想用“JavaScript:好的部分”之类的东西来阅读它,以熟悉 JavaScript 工作原理的核心 =)
    • 到目前为止,我所学到的是如何使用 JavaScript 而不是工作原理。就像我说的,我是新手。有什么好书推荐吗? :)
    • 我用一个有用的链接更新了答案,如果你正在学习 JavaScript,Crockford 关于 JavaScript 的其余文章通常也值得一读
    • @LittleChild 看看我的例子
    【解决方案3】:

    试试这个:

    var number = 16;
    console.log( Number.prototype.toExponential.call(number) );
    

    注意call() 调用实例上Number 对象的toExponential 方法。

    【讨论】:

      【解决方案4】:

      如果你做到以下几点,你会有更好的运气:

      var number = new Number(16);
      console.log(number.toExponential());
      console.log(number.toFixed());
      console.log(number.toPrecision());
      console.log(number.valueOf());
      

      注意* 最好不要以这种方式在 javascript 中使用数字,除非您特别需要避免使用原语。

      你得到 0 的原因是,如果 Number 原型没有实例化,它默认为零。

      Number 是一个原型,在语义上设计用于生成继承这些方法的新对象。这些方法并非设计为直接从 Number 原型调用,而是从数字本身调用。请尝试以下操作:

      (16).toExponential();
      

      您必须将数字括在括号中,以便解释器知道您正在访问方法而不是定义浮点数。

      这里要理解的重要一点是,数字原型提供了所有数字将在javascript中继承的所有方法。

      为了进一步解释为什么你得到一个 0,Number 原型上的方法旨在“绑定”到一个数字对象。他们将使用绑定对象作为输入,并忽略任何参数。由于它们绑定到默认的 Number 对象,因此默认数字为 0,因此所有方法都将返回其版本 0。

      在 javascript 中有一种方法可以使用“调用”方法将方法重新绑定到对象(还有绑定和应用):

      Number.prototype.toExponential.call(16);
      

      【讨论】:

      • 您不应该提倡使用new Number。一些经验较少的开发人员可能会在以后遇到各种问题。不过我喜欢其余的答案:)
      • 我只是用它来演示如何实例化 Number 原型。当然,我也提供了访问关联方法的“原始”方式。
      • 但是,如果我可能会问,为什么不赞成使用 new Number
      • 主要是比较不一致。例如。 new Number(16) === new Number(16)falsenew Number(0) &lt; new Number(16)true。使用对象而不是原始值的副作用。
      猜你喜欢
      • 2011-11-11
      • 1970-01-01
      • 2022-01-17
      • 2014-08-03
      • 1970-01-01
      • 2020-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多