【问题标题】:What does (+var) means [duplicate](+var) 是什么意思
【发布时间】:2014-01-06 19:28:02
【问题描述】:

我是 javascript 世界的新手,我还没有找到任何关于这个符号的信息。 我在那个主题中找到了它(见答案):Convert HH:MM:SS string to seconds only in javascript

// minutes are worth 60 seconds. Hours are worth 60 minutes.
var seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); 

我还想使用该代码将“HH:MM:SS”字符串转换为秒。但是,这对我来说似乎不安全。如果用户插入“XX:03:SS”,则该值将是不正确的 NaN(至少对我而言)。所以我决定改进它:

function convertHHMMSSToSeconds(time) {

// initialize seconds
var seconds = 0;

//ensure time
if (!time) {
    return seconds;
}


try {
    var hmsTab = time.split(':'); // split it at the colons

    // ensure that the hmsTab contains 3 values (hh,mm,ss)
    if (!hmsTab || hmsTab.length !== 3) {
        return seconds;
    }

    // initialize hh, mm and ss
    var hh = hmsTab[0] > 0 && hmsTab[0] < 60? +hmsTab[0] : 0;
    var mm =  hmsTab[1] > 0 && hmsTab[1] < 60 ? +hmsTab[1] : 0;
    var ss =  hmsTab[2] > 0 && hmsTab[2] < 60 ? +hmsTab[2] : 0;

    // return 0 if one variable is not valid 
    if(+hmsTab[0] !== hh ||+hmsTab[1] !== mm || +hmsTab[2] !== ss) {
        return seconds;
    }

    // minutes are worth 60 seconds. Hours are worth 60 minutes.
    seconds = (hh * 60 * 60) + (mm * 60) + ss;
}catch (error)
{
    seconds = 0;
}
return seconds && seconds>0 ? seconds : 0;

}

所以我的问题仍然存在,(+var) 是什么意思。

问候,

【问题讨论】:

  • 转换为数字的最短形式

标签: javascript


【解决方案1】:

变量前面的+ 符号会将变量转换为数字。示例:

var x = "3";
var y = x + 10; // 310
var z = +x + 10 // 13

【讨论】:

  • 没想到答案这么快。谢谢。
  • 但与 parseInt(..) 不同的是,它不会转换非真数的 val,例如'10px'
  • @YuriyGalanter 精度表示赞赏。你说得对,它与“parseInt()”不同。
【解决方案2】:

+var 是一元identity operatorvar 值的应用。恒等运算符可以被认为是类似于一个返回其唯一参数的函数:

function identity(operand) {
    return operand;
}

但是,恒等运算符只作用于数值。由于 Javascript 是一种弱类型语言,因此将数值函数应用于非数值会导致非数值被强制转换为等效数值。在使用恒等运算符进行强制转换的最常见情况下,将包含数字的字符串解析为数字。

虽然可以快速键入且易于记忆,但使用身份运算符进行强制转换并不是很可靠。以下是一些示例输出:

+'150'  // 150
+'150z' // NaN
+'z150' // NaN
+'015'  // 15 -- note that it doesn't interpret as octal*
+'015z' // NaN
+'z015' // NaN
+'0xf'  // 15 -- note that it interprets as hexadecimal
+'0xfz' // NaN
+'z0xf' // NaN
+'NaN'  // NaN
+'undefined' // NaN

将相同的输入与parseInt进行比较:

parseInt('150')   // 150
parseInt('150z')  // 150
parseInt('z150')  // NaN
parseInt('015')   // 15 -- note that it still doesn't interpret as octal*
parseInt('015z')  // 15
parseInt('z015')  // NaN
parseInt('0xf')   // 15 -- note that it still interprets as hexadecimal
parseInt('0xfz')  // 15
parseInt('z0xf')  // NaN
parseInt('NaN')   // NaN
parseInt('undefined') // NaN

parseInt 还让您可以更好地控制结果:

parseInt('015', 8)   // 13
parseInt('z0xf', 36) // 1634163
parseInt('1010', 2)  // 10

* 在 EMCAScript 5 中。以前的版本在处理前导零时默认为八进制。

字符串并不是唯一可以用恒等运算符强制转换为数字的东西,尽管它们是最常见的,并且转换是最明智的。其他强制可能有意义,也可能没有。示例:

+[]        // 0
+[150]     // 150
+['150']   // 150
+['150z']  // NaN
+[1, 2]    // NaN
+{}        // NaN
+null      // 0
+true      // 1
+false     // 0
+NaN       // NaN
+undefined // NaN
+function(){} // NaN

【讨论】:

  • +1 表示这是一元身份运算符和示例。
【解决方案3】:

数字转换的一种方式:

+n === Number(n)

【讨论】:

    【解决方案4】:

    将变量转换为数字的最短形式

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-20
      • 2018-11-24
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多