美文网首页
三目运算符(var ? var : @"") OR (a ?:

三目运算符(var ? var : @"") OR (a ?:

作者: 山已几孑 | 来源:发表于2021-01-19 14:50 被阅读0次

好吧,先说最终结论,没有最终结论,我也不知道用啥。

这两个都是三目运算符,在我们给属性或者参数设置非空数据时十分常用,然后,我就十分好奇到底用哪种写法更好(其实我喜欢第二种,更简洁,跟swift ?? 更像,也好理解),
但是吧,感觉不行啊,得有证据,所以简单编写了一个测试代码,并用objdump把中间文件给打印了一下,

代码简单的不要不要的:

-(void)functionOne {
    NSString * a = @"";
    NSString * b = a ? a : @"";
}
-(void)functionTwo {
    NSString * a = @"";
    NSString * b = a ?: @"";
}

中间文件(.o)的位置在/Users/UName/Library/Developer/Xcode/DerivedData/$PROJECTNAME-RandomString/Build/Intermediates.noindex/$PROJECTNAME.build/Debug-iphonesimulator/$PROJECTNAME.build/Objects-normal/x86_64 里面的$PROJECTNAME的位置自己替换
中间文件如下图.0文件

image.png

然后再终端敲kyang@Kyang-3 x86_64 % objdump -S -g DumpTest.o就把编译后的文件打印出来了。

这边就不贴代码了,直接贴个图
简单分析一下就看到 ?:的方式比 ? : 的方式要多了两行指令,说明它并不能直接理解 ?: 这种形式,而是对它做了一定的转换,比直接对比,多了两条指令。

汇编指令对比

是不是就说明 ?:? :要慢????
不过吧,现在cpu都这么屌,这两条肯定不算事儿了,具体用哪个大家还是看个人喜好吧。PS:怎么办,想建议别人换成?:😶😶😶,别急!!!

然后我们换个稍微复杂点的例子,真的是稍微复杂点

-(void)functionOne {
    NSString * b = [self randomString] ? [self randomString] : @"";
}
-(void)functionTwo {
    NSString * b = [self randomString] ?: @"";
}
-(NSString * __nullable)randomString {
    if (arc4random() % 2) {return @"a";}
    return nil;
}

然后重复上面的操作,得到两个方法的汇编指令的对比:


一屏装不下啊,拖了拖

可以看到,指令不止多了一点半点,区别还是很大的,这次,反而是 ?: y以大优势反超。
其实也好理解:

    NSString * b = [self randomString] ? [self randomString] : @"";
    /*
     1. 执行[self randomString]
     2. 判断返回值是不是为空
     3. 如果不为空那么
     4. 继续执行[self randomString]
     5. 返回值赋值给b
     */

    NSString * b = [self randomString] ?: @"";
    /*
     1. 执行[self randomString]
     2. 判断返回值是不是为空
     3. 如果不为空那么 下一步
     4. 返回值赋值给b
     */

第二种方式少执行了一个方法,这里仅仅是一个if else,但如果是是一个其他的方法,比如富文本之类的,差距只会是更大!!

可以给一个不严谨的结论了:

  • 如果是简单判断的话,用a?:b,差距很小,可以忽略,但是好看😄。
  • 如果是条件复杂一点的判断,比如条件是一个方法,用a?:b,能省去一个方法的执行,越复杂越省,关键好看啊😄😄

相关文章

  • 三目运算符(var ? var : @"") OR (a ?:

    好吧,先说最终结论,没有最终结论,我也不知道用啥。 这两个都是三目运算符,在我们给属性或者参数设置非空数据时十分常...

  • 三目运算符

    三目运算符 例子 var score=prompt("请输入您的出生日期"); var result=score>...

  • Dart基本语法学习二

    运算符 算数运算符 +、-、*、/、~/、%、var++、++var、var--、--var 关系运算符 ==、!...

  • Dart学习笔记二

    运算符 算术运算符+,-,*,/,~/,%; 递增递减++var,var++,--var,var--; 关系运算符...

  • JS补充5

    条件云算符 即三目运算符,语法格式如下: 操作数?结果1:结果2 Demo: var a=26; var b=60...

  • 🙃🙃

    条件云算符 即三目运算符,语法格式如下: 操作数?结果1:结果2 Demo: var a=26; var b=60...

  • js..6

    表达式 var a=5; a=a+3; console.log(a); 三目运算符(三元运算符); 1. 语法 ...

  • .3

    表达式 var a=5; a=a+3; console.log(a); 三目运算符(三元运算符); 1. 语法 ?...

  • Dart编程语言入门——运算符和控制语句

    运算符 1.算术运算符 加减乘除:+,-,*,/,~/,% 递增递减:++var,var++,--var,var-...

  • Dart(四)常用四中运算符

    算术运算符 加减乘除:+、-、*、/、~/、% 递增递减:++var、var++、--var、var–-代码: 结...

网友评论

      本文标题:三目运算符(var ? var : @"") OR (a ?:

      本文链接:https://www.haomeiwen.com/subject/jhgqzktx.html