在 JavaScript 中,有人可以解释以下 2 个表达式的结果:
"4" + 4 和 4 + "4"
谢谢!
两者都将导致String
:
"44"
这是因为+
运算符有两个目的——加法和连接。而且,如果任一操作数是 a String
(或被String
内部转换为 a ToPrimitive()
),它们将被连接起来。
这在规范中被描述为:
7) 如果Type ( lprim ) 是 String 或Type ( rprim ) 是 String,那么
a) 返回作为连接ToString ( lprim ) 后跟ToString ( rprim )的结果的 String
8) 返回对ToNumber ( lprim ) 和ToNumber ( rprim ) 应用加法运算的结果。请参阅下面的注释11.6.3。
如果你想确保加法,你可以在每个上使用parseFloat()
或一元+
:
var a = "4", b = 4;
console.log(parseFloat(a) + parseFloat(b)); // 8;
console.log((+a) + (+b)); // 8, extra parenthesis for clarity
他们都是'44'。'4' 作为字符串的存在将整个操作转换为字符串,因此这两个字符被连接起来。
1+'1'+1 = '111'
1+1+'1' = '21'
'1'+(1+1) = '12'
'1'+1+1 = '111'
Javascript 执行数学运算,直到遇到一个字符串,然后切换到连接,它还遵循常规公式规则首先运行 () 操作。
引自:http: //javascript.about.com/od/variablesandoperators/a/vop10.htm
让初学者感到困惑的一件事是,JavaScript 使用 + 和文本字符串来表示与数字完全不同的含义。而带数字 + 表示将数字与文本相加 + 表示将它们连接在一起。连接基本上意味着将一个文本字符串连接到第一个字符串的末尾,这样“my”+“book”就会得到“mybook”。初学者容易混淆的地方是,虽然 3+3 给出了 6,但“3”+“3”给出了“33”。
您还可以将 += 与文本字符串一起使用,将右侧的变量或文本直接添加到左侧文本字符串变量的末尾。
混合数据类型
当您使用不同类型的变量时,可能会出现额外的混乱。所有操作都要求它们所操作的变量具有相同的类型。在 JavaScript 能够执行涉及两种不同数据类型的任何操作之前,它必须首先将其中一个变量从一种类型转换为另一种类型。如果不先将数字转换为文本或将文本转换为数字,则无法将数字添加到文本字符串中。
在数据类型之间进行转换时,我们有两种选择。我们可以允许 JavaScript 自动为我们进行转换,或者我们可以告诉 JavaScript 我们要转换哪个变量。
在执行减法、乘法、除法和取余数时,JavaScript 将尝试将任何文本字符串转换为等值的数字。您的文本字符串实际上需要包含 JavaScript 可以转换为数字的内容(即,像“10”这样的字符串),以便转换工作。
如果我们使用 + 那么这可能意味着我们想要将字符串转换为数字并添加 then 或者我们想要将数字转换为字符串并将它们连接起来。JavaScript 只能执行这两种选择之一。它总是将数字转换为字符串(因为无论字符串是否包含数字都可以)。
这里有些例子。
“5” - 3 = 2;
"5" + 3 = "53"
2 + “7” = “27”
5 + 9 + “1” = “141”
由于减法仅适用于数字 1 在进行减法之前将文本字符串转换为数字。
在 2 和 3 中,数字在连接(连接)到另一个文本字符串之前转换为文本字符串。
在 4 中,最左边的加法首先完成。由于这些都是数字,因此它们实际上是加在一起的,而不是作为文本处理的。第一个加法的结果给我们留下了与第三个示例类似的情况,因此该加法的结果被转换为文本并连接起来。
要真正强制 JavaScript 将文本字符串转换为数字,我们可以使用 Number("3") 或者强制 JavaScript 将数字转换为文本字符串,我们可以使用 String(5)。
JS 中的表达式有两个主要原则。
然而,它并不直截了当
只要遇到数字,它将使用从左到右的执行进行数学加法,但是,一旦遇到字符串,它就会将结果(计算到遇到字符串)与表达式的其余部分连接起来。
//left to right execution
console.log(10+10+"10") //2010, (10+10) of numtype + "10" of stringtype concat(20+"10")
console.log(10+10+"10"+10+10) //20101010,
//(10+10) of number type + "10" stringtype(now since a string is enc.) + (10+10) of number type would act as strings and get concatenated = 20+"10"+"1010"
console.log("10"+[10,10,10]+10) //1010,10,1010
//"10"of stringtype + array of numtypes + 10 of numtype
// "10" concats with first element of array, last number 10 concats with last element of array.
如果所有出现都是数字/数字作为字符串,它将执行相应的数学运算,将“数字作为字符串”视为数字。
console.log("10"-10) //0
console.log("10"/10) //1
console.log("10"*10) //100
console.log(10+"10"*10) //110 //BODMAS
console.log(Math.pow(10,"10")) //10000000000
如果表达式中间出现涉及 (-,*,/,^...) 数学运算的非数字字符串、数组、对象,它将始终返回 NaN
console.log(10-{id:1,name:"hey"}-10) //NaN
console.log(10-10-"hey"-10-10-10) //NaN
console.log("hey"/10) //NaN
console.log("hey"* 3) //NaN
console.log(["hey","hey"]*"3") //NaN
console.log("10"/[10,10,10]/10) //NaN