如何评估JavaScript表达式?

时间:2013-07-30 21:58:52

标签: javascript

在JavaScript中,有人可以解释以下两个表达式的结果:

“4”+ 4和4 +“4”

谢谢!

5 个答案:

答案 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)

他们都是'44'。将'4'作为字符串存在将整个操作转换为字符串,因此连接两个字符。

答案 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只能执行其中一个   这两种选择。它总是将数字转换为字符串(因为   无论字符串是否包含数字,它都将起作用。)

     

以下是一些例子。

     
      
  1. “5” - 3 = 2;

  2.   
  3. “5”+ 3 =“53”

  4.   
  5. 2 +“7”=“27”

  6.   
  7. 5 + 9 +“1”=“141”

  8.         

    由于减法仅适用于数字1,因此转换文本字符串   在做减法之前变成一个数字。

         

    在2和3中,数字在被转换为文本字符串之前   连接(连接)到另一个文本字符串。

         

    在4中,最左边的添加首先完成。因为这些都是数字   它们实际上是加在一起而不是文本。结果   这第一次加法让我们遇到与第三次相似的情况   示例,因此添加的结果将转换为文本和   级联。

         

    实际上强制JavaScript将文本字符串转换为我们的数字   可以使用数字(“3”)或强制JavaScript转换   数字到文本字符串我们可以使用String(5)。

答案 4 :(得分:0)

JS中的表达遵循两个主要原则。

  1. B O D M A(包括concat)S
  2. 从左到右的执行顺序

但是,它并不简单

用于+运算符

只要遇到数字,它就会使用从左到右的执行方式进行数学加法运算。但是,一旦遇到一个字符串,它将把结果(直到遇到一个字符串为止计算)与表达式的其余部分连接起来。

//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