JS中三目运算符和if else的区别分析与示例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS中三目运算符和if else的区别分析与示例相关的知识,希望对你有一定的参考价值。

1 if() else()和 三目运算符两个写法不一样,但是表达的意思是一样的,实际开发中比较简单的会用三目运算符,大多数的逻辑判断还是用if()else()因为清晰明了,有利于开发人员读懂程序。

2 语法格式的不同 :

三目运算符语法格式: 

表达式A?表达式1:表达式2       意思是说表达式A(就是?前面的部分)是成立的话,就执行表达式1的部分,如果不成立的话就执行表达式2的部分。

if() else()的语法: 意思就是说如果表达式A条件成立的话就执行 代码部分1 如果 表达式A条件不成立的话 执行代码部分2

if(表达式A)

//执行代码部分1

else

//执行代码部分2

3 语法格式和具体的意思了解了,下面用实际的代码来掩饰,这里用的Java代码: System.out.print(c>0?a:b)  ;和 

if(c>0)

System.out.print(a)  ;

else

System.out.println(b)  ;

这两段代码表达的意思是一样的。

public class HelloWorld

public static void main(String []args)

int a=1;

int b=2;

int c=0;

System.out.print(c>0?a:b)  ;//三目运算符 c>0条件成立执行输出a

if(c>0)

System.out.print(a)  ;

else

System.out.println(b)  ;

3 下面是案例实际运行的截图,左边是代码,右边是结果:

参考技术A 今天写了一个图片轮播的小demo,用到了判断

先试了一下if else,代码如下:

复制代码 代码如下:
if(n >= count-1)
n =0;
else
n ++;


随后代码写完了,准备优化一下代码,将此段改成了三目运算符的写法

复制代码 代码如下:
n = n >= (count-1) ? n=0 : n++

结果完全不同

随后研究了一下这两者的区别,总结为一句话:三目运算有返回值,if else没有返回值

做了如下测试:

复制代码 代码如下:
var n=1;
if(n>1)
n=0;
else
n++;

console.log(n);

输出结果:2

if-else和三目运算符 ? : 的对比

今天的地铁思考让我想起一个之前学C语言的时候一直没有验证的事情:既生瑜何生亮?

  • 平时写代码的时候,似乎并没有太多的关注我应该选用什么条件判断语句,感觉判断条件或者两条支路语句复杂就本能地if-else。
    遇到一些数值,字符的按条件赋值输出,就感觉if-else与这些简短语句气质不符,于是就用了三目运算符,使代码更简洁舒服。那么为什么有了if-else还要用?:呢,只是为了代码更简洁吗,还是有什么不为人知的秘密[/嘿嘿]
  • 我打算稍稍探寻一下,从两个方面来聊聊:效率和三目运算符的表达式特性

关于执行效率

  • 我在网上一直没有找到可靠的说辞或指南,有的说三目运算符效率高,还有的说一样的,所以我来测测(测试环境可能由于我的电脑性能,给定参数原因,不能得出确切的结论,仅供参考)
    - if-else
    public static void main(String[] args) {
        int num=1000;
        System.out.println("if-else 运行时间:");
        long totalTime=0L;
        for (int i = 1; i <=10 ; i++) {
            long startTime = System.nanoTime();
            if (num>500&&num%3!=0&&num/10==100){
                num=1001;
            }else{
                num=0;
            }
            long endTime = System.nanoTime();
            long result = endTime - startTime;
            totalTime+=result;
            System.out.println("第"+i+"次: " + result + " 纳秒");
        }
        System.out.println("平均时间为:"+totalTime/10+"纳秒");
}
  • 执行结果:
    技术图片

  • 三目运算符 ? :

public static void main(String[] args) {
        int num = 1000;
        System.out.println("? : 运行时间:");
        long totalTime = 0L;
        for (int i = 1; i <= 10; i++) {
            long startTime = System.nanoTime();
            num = num > 500 && num % 3 != 0 && num / 10 == 100 ? 1001 : 0;
            long endTime = System.nanoTime();
            long result = endTime - startTime;
            totalTime += result;
            System.out.println("第" + i + "次: " + result + " 纳秒");
        }
        System.out.println("平均时间为:" + totalTime / 10 + "纳秒");
}
  • 执行结果:
    技术图片
  • 从结论上来看,平均执行时间并没有太大差距,毕竟这里是以纳秒为单位,所以,暂且以为 ? :仅仅是简化代码的吧
  • 如果哪位大佬有专业的权威的见解,请一定来“拍一拍”我,让我的石头落下。


表达式特性(BNP : binary numeric promotion)

  • 二进制数值提升
    - 在三目运算符中的第二和第三表达式的类型依据数值范围大的那个,将一个小数值的类型范围扩大,比如16位提升到32位,32位到64位,直观一点就是short提升到int,int提升到long,不同类型之间也可以提升,但是不一定是往两个其中的一个走,也有short和char,最终表达式是int的情况。

  • 举几个栗子就比较清楚了
    - 1,参数是int和byte,但是整个表达式的类型却是int
    技术图片

    - 2,参数:int,char  表达式类型:int
    ![](https://img2020.cnblogs.com/blog/1900950/202007/1900950-20200710014429504-750530626.png)
    
    - 3,参数:short,char  表达式类型:int
    ![](https://img2020.cnblogs.com/blog/1900950/202007/1900950-20200710014735763-1827387039.png)
    
    - 4,参数:int,float  表达式类型:float (如果字节数相同,会提升到浮点数)
    ![](https://img2020.cnblogs.com/blog/1900950/202007/1900950-20200710014805770-916117378.png)
    
    
    - 5,参数:int,long   表达式类型:long
    ![](https://img2020.cnblogs.com/blog/1900950/202007/1900950-20200710014944472-1952654095.png)
    
    
    - 6,参数:long,double  表达式类型:double (如果字节数相同,会提升到浮点数)
    ![](https://img2020.cnblogs.com/blog/1900950/202007/1900950-20200710015004272-720659868.png)
    
    - 7,同上的包装类,包装类在运算时自动拆箱,和基本数据类型结果无异
    ![](https://img2020.cnblogs.com/blog/1900950/202007/1900950-20200710015130391-625091652.png)
    
    - 8,更具体一点
    ```
    int number = 1000;
    System.out.println(number<0?10.0:9);
    ```
    console:
    ![](https://img2020.cnblogs.com/blog/1900950/202007/1900950-20200710020252217-1846785275.png)
    

总的来看,if-else和三目运算符并没有在今天分出胜负,我们依然可以按照之前的习惯写代码,只是让我们之后写代码的不用再犹豫和纠结用什么好,不用再想起他们俩之间的纠葛。在实际生产环境中按照各自团队规范来就好。这些也是最近才发现的,虽然感觉很少用到,但这不是目的。我们遇到的东西那么多,不会每样都能用到你的程序里,只是为了在下次遇到此类问题Bug时,能够游刃有余,这就是我们程序员鸭,突然感觉这篇文章啥也没做,但是却也不是啥也没做,哈哈奇怪咧。


至此,若有纰漏,望各位不吝赐教








以上是关于JS中三目运算符和if else的区别分析与示例的主要内容,如果未能解决你的问题,请参考以下文章

条件语句和三目运算符的区别

C语言中三目运算符是啥?

Java中与if else相比三元运算符的弊端?

Python——三目运算符

JavaSE7基础 用if-else解释三目运算符

面试官:你写的if、else太多啦