在JavaScript中,有人可以解释以下两个表达式的结果:
“4”+ 4和4 +“4”
谢谢!
答案 0 :(得分:3)
两者都会产生String
:
"44"
这是因为+
运算符有两个目的 - 加法和连接。并且,如果任一操作数是String
(或由内部ToPrimitive()
强制转换为String
),则它们将被连接。
将in the specification描述为:
7)如果Type( lprim )是String或Type( rprim )是String,那么
a)返回串联ToString( lprim )后跟ToString( rprim )的结果的字符串)
8)将添加操作的结果返回到ToNumber( lprim )和ToNumber( rprim )。请参阅下面的注释11.6.3。
如果您想确保添加,可以使用parseFloat()
或unary +
:
var a = "4", b = 4;
console.log(parseFloat(a) + parseFloat(b)); // 8;
console.log((+a) + (+b)); // 8, extra parenthesis for clarity
答案 1 :(得分:1)
答案 2 :(得分:1)
1+'1'+1 = '111'
1+1+'1' = '21'
'1'+(1+1) = '12'
'1'+1+1 = '111'
Javascript执行数学直到它遇到一个字符串,然后切换到连接,它也遵循常规公式规则run()操作。
答案 3 :(得分:0)
引自:http://javascript.about.com/od/variablesandoperators/a/vop10.htm
让初学者感到困惑的一件事是JavaScript使用+ 用文本字符串表示与它完全不同的东西 用数字表示。使用数字+表示添加数字 与文本+一起表示将它们连接在一起。级联 基本上是指将一个文本字符串连接到第一个文本字符串的末尾 因此,“我的”+“书”给出了“mybook”。初学者倾向于 混淆是,虽然3 + 3给出6,“3”+“3”给出“33”。
您也可以使用+ =和文本字符串直接添加变量或 右边的文本放在文本字符串变量的末尾上 左
混合数据类型
使用变量时可能会出现其他混淆 这是不同类型的。所有操作都需要变量 他们两个都是同一类型。在JavaScript之前 能够执行涉及两个不同数据的任何操作 类型,它必须首先将一个变量从一种类型转换为 其他。如果没有,则无法在文本字符串中添加数字 将数字转换为文本或将文本转换为数字。
在数据类型之间进行转换时,我们有两种选择。我们可以允许 JavaScript会自动为我们进行转换,或者我们可以告诉您 我们要转换的变量的JavaScript。
JavaScript会尝试将任何文本字符串转换为数字 等效执行减法,乘法,除法和 采取剩余。您的文本字符串实际上需要包含 JavaScript可以转换为数字的东西(即字符串,如 “10”)以便转换工作。
如果我们使用+那么这可能意味着我们想要转换 字符串到一个数字然后添加或我们想要转换数字 到一个字符串并连接它们。 JavaScript只能执行其中一个 这两种选择。它总是将数字转换为字符串(因为 无论字符串是否包含数字,它都将起作用。)
以下是一些例子。
“5” - 3 = 2;
“5”+ 3 =“53”
2 +“7”=“27”
- 醇>
5 + 9 +“1”=“141”
由于减法仅适用于数字1,因此转换文本字符串 在做减法之前变成一个数字。
在2和3中,数字在被转换为文本字符串之前 连接(连接)到另一个文本字符串。
在4中,最左边的添加首先完成。因为这些都是数字 它们实际上是加在一起而不是文本。结果 这第一次加法让我们遇到与第三次相似的情况 示例,因此添加的结果将转换为文本和 级联。
实际上强制JavaScript将文本字符串转换为我们的数字 可以使用数字(“3”)或强制JavaScript转换 数字到文本字符串我们可以使用String(5)。
答案 4 :(得分:0)
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