zoukankan      html  css  js  c++  java
  • JS-隐士类型转换‘1’+1、‘1’-1、++‘1’为什么不一样?

    当 x=’1’时,
    x+1
    x-1
    +x
    -x
    ++x
    typeof(x+1)
    typeof(x-1)
    typeof(+x)
    typeof(-x)
    typeof(++x)

      的结果分别是多少?

    答案:

    x+1 //’11’
    x-1 //0
    +x//1
    -x//-1
    ++x //2
    typeof(x+1) //’string’
    typeof(x-1) //’number’
    typeof(+x) //’number’
    typeof(-x) //’number’
    typeof(++x) //’number’

      首先,+”和“-”是一元运算符,也是二元运算符

      一元加法(+)

      一元加法运算符把操作数转换为数字(或者NaN),并返回这个转换后的数字。如果操作数本身就是数字,则直接返回这个数字。

    +1  // => 1: 操作数本身就是数字,则直接返回这个数字

    +1 // => 1: 字符串转换为数字

    +-1 // => -1: 字符串转换为数字

     

    一元减法(-

    -”用做一元运算符时,它会根据需要把操作数转换为数字,然后改变运算结果的符号。

     -1 // => -1: 操作数本身就是数字,改变运算结果的符号

    -1 // => -1: 字符串转换为数字,改变运算结果的符号

    -'-1'// => 1: 字符串转换为数字,再改变运算结果的符号

    元加法(+)

    二元加法运算符+”可以对两个数字做加法,也可以做字符串连接操作:

    当两个操作数都是数字或都是字符串的时候,计算结果是显而易见的。然而对于其他情况来说,则要进行一些必要的类型转换,并且运算符的行为依赖于类型转换的结果。加号的转换规则优先考虑字符串连接,如果其中一个操作数是字符串或者转换为字符串的对象,另外一个操作数将会转换为字符串,加法将进行字符串的连接操作。如果两个操作数都不是类字符串(string-like)的,那么都将进行算术加法运算。 从技术上讲,加法操作符的行为表现为: ·如果其中一个操作数是对象,则对象会遵循对象到原始值的转换规则转换为原始类值,在进行了对象到原始值的转换后,如果其中一个操作数是字符串的话,另一个操作数也会转换为字符串,然后进行字符串连接。否则,两个操作数都将转换为数字(或者NaN),然后进行加法操作。

    这里有一些例子:

    1 + 2 // => 3: 加法

    "1" + "2" // => "12": 字符串连接

    "1" + 2 // => "12": 数字转换为字符串后进行字符串连接

    1 + {} // => "1[object Object]": 对象转换为字符串后进行字符串连接

    true + true // => 2: 布尔值转换为数字后做加法

    2 + null // => 2: null转换为0后做加法

    2 + undefined// => NaN: undefined转换为NaN后做加法

      需要特别注意的是,当加号运算符和字符串和数字一起使用时,需要考虑加法的结合性的对运算顺序的影响。也就是说,运算结果是依赖于运算符的运算顺序的,比如: 

    1 + 2 + " blind mice"; // => "3 blind mice"

    1 +2 + " blind mice"; // => "12 blind mice"

      第一行没有圆括号,+”运算符具有从左至右的结合性,因此两个数字首先进行加法计算,计算结果和字符串进行连接。在第二行中,圆括号改变了运算顺序:数字2和字符串连接,生成一个新字符串,然后数字1和这个新字符串再次连接,生成了最终结果。

     

    (-)

    -”用做元运算符时,它会根据需要把操作数转换为数字,然后再进行减运算

    1-0 // => 1:

    '1'-0  => 1: 字符串转为数字后进行减运算

    '1'-'0' => 1: 字符串转为数字后进行减运算

    递增(++

    需要注意的是,++”运算符从不进行字符串连接操作,它总是会将操作数转换为数字并增1。表达式++x并不总和x=x+1完全一样

        var x='1';

        var y=x+1; //y的值是‘11

        var z=++x;//z的值是2

         typeof(y));// "string"

        typeof(z));//"number"

     

    总结:

    JavaScript中的某些运算符会做隐式的类型转换,有时用于类型转换。一元运算符+”,“-”,“++”,二元元算法“-”都会把操作数隐式的转换为数字二元运算符+比较特殊,当有操作数是字符串,它将会把另外一个操作数转换为字符串。

    x + ""   // 等价于Stringx

    +x      // 等价于Numberx

    x=1时,

    x+1

    x-1

    +x

    -x

    ++x

    typeof(x+1)

    typeof(x-1)

    typeof(+x)

    typeof(-x)

    typeof(++x)

    的结果分别是多少?

    答案

    x+1 //11

    x-1 //0

    +x//1

    -x//-1

    ++x //2

    typeof(x+1) //string

    typeof(x-1) //number

    typeof(+x) //number

     

    typeof(-x) //number

     

    typeof(++x) //number

     

     

     

    首先,+”和“-”是一元运算符,也是二元运算符

    一元加法(+)

    一元加法运算符把操作数转换为数字(或者NaN),并返回这个转换后的数字。如果操作数本身就是数字,则直接返回这个数字。

    +1  // => 1: 操作数本身就是数字,则直接返回这个数字

    +1 // => 1: 字符串转换为数字

    +-1 // => -1: 字符串转换为数字

     

    一元减法(-

    -”用做一元运算符时,它会根据需要把操作数转换为数字,然后改变运算结果的符号。

     -1 // => -1: 操作数本身就是数字,改变运算结果的符号

    -1 // => -1: 字符串转换为数字,改变运算结果的符号

    -'-1'// => 1: 字符串转换为数字,再改变运算结果的符号

    元加法(+)

    二元加法运算符+”可以对两个数字做加法,也可以做字符串连接操作:

    当两个操作数都是数字或都是字符串的时候,计算结果是显而易见的。然而对于其他情况来说,则要进行一些必要的类型转换,并且运算符的行为依赖于类型转换的结果。加号的转换规则优先考虑字符串连接,如果其中一个操作数是字符串或者转换为字符串的对象,另外一个操作数将会转换为字符串,加法将进行字符串的连接操作。如果两个操作数都不是类字符串(string-like)的,那么都将进行算术加法运算。 从技术上讲,加法操作符的行为表现为: ·如果其中一个操作数是对象,则对象会遵循对象到原始值的转换规则转换为原始类值,在进行了对象到原始值的转换后,如果其中一个操作数是字符串的话,另一个操作数也会转换为字符串,然后进行字符串连接。否则,两个操作数都将转换为数字(或者NaN),然后进行加法操作。

    这里有一些例子:

    1 + 2 // => 3: 加法

    "1" + "2" // => "12": 字符串连接

    "1" + 2 // => "12": 数字转换为字符串后进行字符串连接

    1 + {} // => "1[object Object]": 对象转换为字符串后进行字符串连接

    true + true // => 2: 布尔值转换为数字后做加法

    2 + null // => 2: null转换为0后做加法

    2 + undefined// => NaN: undefined转换为NaN后做加法

      需要特别注意的是,当加号运算符和字符串和数字一起使用时,需要考虑加法的结合性的对运算顺序的影响。也就是说,运算结果是依赖于运算符的运算顺序的,比如: 

    1 + 2 + " blind mice"; // => "3 blind mice"

    1 +2 + " blind mice"; // => "12 blind mice"

      第一行没有圆括号,+”运算符具有从左至右的结合性,因此两个数字首先进行加法计算,计算结果和字符串进行连接。在第二行中,圆括号改变了运算顺序:数字2和字符串连接,生成一个新字符串,然后数字1和这个新字符串再次连接,生成了最终结果。

     

    (-)

    -”用做元运算符时,它会根据需要把操作数转换为数字,然后再进行减运算

    1-0 // => 1:

    '1'-0  => 1: 字符串转为数字后进行减运算

    '1'-'0' => 1: 字符串转为数字后进行减运算

    递增(++

    需要注意的是,++”运算符从不进行字符串连接操作,它总是会将操作数转换为数字并增1。表达式++x并不总和x=x+1完全一样

        var x='1';

        var y=x+1; //y的值是‘11

        var z=++x;//z的值是2

         typeof(y));// "string"

        typeof(z));//"number"

     

    总结:

    JavaScript中的某些运算符会做隐式的类型转换,有时用于类型转换。一元运算符+”,“-”,“++”,二元元算法“-”都会把操作数隐式的转换为数字二元运算符+比较特殊,当有操作数是字符串,它将会把另外一个操作数转换为字符串。

    x + ""   // 等价于Stringx

    +x      // 等价于Numberx

  • 相关阅读:
    省选模拟47 题解
    省选模拟46 题解
    死磕 java集合之PriorityQueue源码分析
    拜托,面试别再问我堆(排序)了!
    死磕 java集合之ConcurrentSkipListSet源码分析——Set大汇总
    死磕 java集合之CopyOnWriteArraySet源码分析——内含巧妙设计
    死磕 java集合之TreeSet源码分析
    死磕 java集合之LinkedHashSet源码分析
    死磕 java集合之HashSet源码分析
    死磕 java集合之ConcurrentSkipListMap源码分析——发现个bug
  • 原文地址:https://www.cnblogs.com/superlizhao/p/8945432.html
Copyright © 2011-2022 走看看