【问题标题】:Better way to use parseInt() to change users' promt() into numbers使用 parseInt() 将用户的 promt() 更改为数字的更好方法
【发布时间】:2015-11-19 22:10:16
【问题描述】:

我设置了一个函数来询问用户一个数字范围,然后给他们一个随机数。第一次尝试没问题。

// function settings
function getRandom(lower, upper) {
  return Math.floor(Math.random()*(upper-lower+1))+lower;
}

// ask users to give a range of numbers
var lowerNum = parseInt(prompt("lower number?"));
var upperNum = parseInt(prompt("upper number?"));

document.write(getRandom(lowerNum, upperNum));


但是,我认为在函数内部使用parseInt() 会更好,这样会更加清晰和语义化。

// function settings
function getRandom(lower, upper) {
  lower = parseInt(lower);
  upper = parseInt(upper);
  return Math.floor(Math.random()*(upper-lower+1))+lower;
}

// ask users to give a range of numbers
var lowerNum = prompt("lower number?");
var upperNum = prompt("upper number?");

document.write(getRandom(lowerNum, upperNum));

两个代码块都可以做得很好并得到相同的结果。但是哪一个是更好的做法,甚至是运行程序时的性能?

【问题讨论】:

  • 您的第一次尝试会更好。第二次尝试导致函数有两个职责,而不是一个。性能上的差异(如果有的话)几乎可以肯定可以忽略不计。
  • 你为什么不测试性能并真正告诉我们
  • @Shomz 我是 Javascript 新手,对性能测试一无所知。所以我在写代码的时候期待一些建议。希望你能帮忙。
  • 哦,我明白了,这是一个测试性能和分享结果的好网站:jsperf.com

标签: javascript performance math random parseint


【解决方案1】:

我会先说我不能确定这个答案的正确性,这只是基于观察的意见。我相信性能可以忽略不计,但是将 int 传递给函数会比传递字符串然后将其解析为 int 稍微快一点。我用来证明这一点的逻辑是,字符串是比 int 更复杂的数据类型。

【讨论】:

  • 这是一个相当大胆的声明,关于将原始类型作为参数传递的成本。
  • 除了他使用prompt作为字符串输入并且需要在函数外部或函数内部调用parseInt,这是原始发布者关于哪种做法更好的问题。
【解决方案2】:

我会说第一个...不是因为 parseInt,而是因为变量查找...在第二个函数中,您正在对全局范围内声明和初始化的变量进行额外查找。

【讨论】:

    【解决方案3】:

    使用对您来说更具可读性的任何内容,但是如果您想获得额外的性能,请尝试在其他地方进行清理,例如删除这两个临时变量,使用按位地板等...(看起来很难看,是的):

    function getRandom(lower, upper) {
      return (Math.random()*(upper-lower+1) | 0) + lower;
    }
    
    alert(getRandom(parseInt(prompt("lower number?"), 10), parseInt(prompt("upper number?"), 10)));

    Performance tests

    您会看到您的两种情况通常彼此接近,我的方法稍微快一些,并且当您不解析整数时会加速。

    【讨论】:

    • 谢谢。以后我会提醒自己“可读”这个词。 :)
    • 不客气,我认为'可读'是这里的关键,因为我们谈论的性能差异是纳秒(我打算稍后再写一个测试)。 :)
    • 是的。但是,我觉得我必须要注意构建代码开始时的微小差异,这样在百万行代码之后会有更好的性能结果。
    • 这是一个很好的观点,但同样,这取决于您的代码的用途 - 因为您使用提示(等待用户输入),您不必担心引擎盖下的性能,但是如果您计划单独维护代码并从其他地方读取数百个输入并为每个输入输出随机值,那么一流的性能应该是首要任务。
    • 如果你想完全删除 parseIntgetRandom 函数可以使用:(Math.random()*((upper-lower)+1) | 0) + +lower,但是应该有一些合适的值已经被验证提供。
    猜你喜欢
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多