什么是代码返回val +''=== numVal +''为?

什么是代码返回val +''=== numVal +''为?

问题描述:

我正在看一本书并看到一个函数,但我无法理解这些行var numVal = + val;返回val +''=== numVal +'';。任何人都可以帮助解释一下吗?提前致谢!什么是代码返回val +''=== numVal +''为?

<!DOCTYPE html> 
<html> 
<body> 
<script> 

function isNumeric(val) { 
    var numVal = +val; // what's this for? 
    return val + '' === numVal + ''; // what's this for? 
} 

function filterNumeric(arr) { 
    var result = []; 

    for(var i=0; i<arr.length; i++) { 
    var val = arr[i]; 
     if (isNumeric(val)) { 
      result.push(val); 
     } 
    } 

    return result; 
} 


var arr = ["a",1, 2, "b"]; 

arr = filterNumeric(arr); 
alert(arr); 


</script> 

</body> 
</html> 

var numVal = +val; 

val是一个字符串,numVal将字符串转换为数字。(类似于parseInt(),没有基数魔法)

val + '' === numVal + ''; 

这使用了恒等算===,并检查是否的valnumval和字符串值(通过添加一个空字符串创建)是相同的。基本上,如果numValNaN,它将评估为false===确实没有任何需要,==可以满足相同的操作。

+0

感谢Manishearth! – Dennisboys 2013-02-25 08:11:39

+在Javascript中有很多含义。第一个一元组+适用于数值。第二&第三与空字符串catenating得到数的字符串表示

的代码实际上是:

return (val + '') === (numVal + '') ; 

其转换为A === B IE是严格等于B,具有相同的数据类型和值。 这里valnumVal是两个整数,通过向它们添加'',它们的结果被转换为一个字符串。

该语句比较两个数字字符串,并根据它们是否相等返回truefalse

例如;

'1' === 1  // false 
'1' == 1 // true 
1 + '' === '1' // true 
2 + '' === (1+1) + '' // true 

这些是基本上用于类型转换(强制转换)的JavaScript技巧。

  • +val是数字一元+操作者施加到val,这迫使它被解释为一个数字。如果有帮助,用英文我总是认为这是“积极val”(不要与绝对值混淆)。另见What's the significant use of unary plus and minus operators?

  • val + ''是二元运算符+适用于两个对象val和字符串''。即,这是字符串连接运算符。这迫使val被解释为一个字符串,然后与空字符串(它什么都不做)连接。 numVal也一样。

  • ===是“严格等于”相等运算符,它测试值和类型。请注意,这被解析为(val + '') === (numVal + '')。因为在这种情况下,你总是会比较两个字符串,这并不是必须的。 ==就足够了。


的代码是等效于以下psudocode:

//var numVal = +val 
var numVal = numeric.Parse(val) or NaN; 

//return val + '' === numVal + '' 
return val.ToString().Equals(numVal.ToString()); 

综观一些例子:

 
val  numVal (val + '') (numVal + '') return 
------------------------------------------------------ 
23  23  '23'   '23'   true 
'23' 23  '23'   '23'   true 
'23x' NaN  '23x'  'NaN'   false 
'junk' NaN  'junk'  'NaN'   false 
'1E23' 1e+23 '1E23'  '1e+23'   false 
'1e+23' 1e+23 '1e+23'  '1e+23'   true 
1e+23 1e+23 '1e+23'  '1e+23'   true