繁体   English   中英

JavaScript:console.log('str'+ int + int)意外输出

[英]JavaScript: unexpected output by console.log('str' + int + int)

请参考下面的代码:

var fs = require('fs');
var file = 'test.js';
var search = new RegExp("\n", "g");

function printLineNum(err, fileContents) {
    if (err) return console.error(err.message);
    console.log("Total line(s) of document: %d", fileContents.match(search).length + 1);
}

fs.readFile(file, 'utf8', printLineNum);

// output: Total line(s) of document: 10

这是一段有效的代码。 但是在进行更改之前,第7行如下所示:

console.log("Total line(s) of document: " + fileContents.match(search).length + 1);
// output: 91

意外的错误也可以通过在数字上加上括号来解决:

console.log("Total line(s) of document: " + (fileContents.match(search).length + 1));
// output: 10

我知道如何避免错误,但我无法弄清楚到底出了什么问题。 这是JavaScript还是与console.log

console.log("Total line(s) of document: " + fileContents.match(search).length + 1);

在这种情况下,连接运算符优先于加法运算符,并首先被求值。

该语句的计算方式如下:

// string concatenation happens first
console.log((("string" + 9) + 1));
// resulting in more string concatenation 
console.log(("string9" + 1));
console.log("string91");

这是由于以下事实: +运算符被重载以在JavaScript中执行加法和字符串连接。 如果两个操作数的类型都是字符串,则串联优先。

在规范中对此进行了描述:

加法运算符执行字符串连接或数字加法。

产生的AdditiveExpression:AdditiveExpression + MultiplicativeExpression的评估如下:

  1. 令lref为评估AdditiveExpression的结果。
  2. 令lval为GetValue(lref)。
  3. 令rref为评估MultiplicativeExpression的结果。
  4. 令rval为GetValue(rref)。
  5. 令lprim为ToPrimitive(lval)。
  6. 令rprim为ToPrimitive(rval)。
  7. 如果Type(lprim)是String或Type(rprim)是String,则

    1. 返回由ToString(lprim)和ToString(rprim)串联而成的字符串
  8. 返回对ToNumber(lprim)和ToNumber(rprim)应用加法运算的结果。 请参见下面的注释11.6.3。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM