使用if-else简写时省略第二个表达式

时间:2012-06-17 06:00:36

标签: javascript ternary-operator conditional-operator shorthand

我可以在没有if else的情况下编写else简写吗?

var x=1;

x==2 ? dosomething() : doNothingButContinueCode();   

我注意到将null用于其他工作(但我不知道为什么或者这是个好主意)。

编辑:你们当中有些人似乎很困惑,为什么我会费心去做。请放心,这纯粹是出于好奇。我喜欢乱搞JavaScript。

8 个答案:

答案 0 :(得分:726)

你所拥有的是对ternary operator的一种相当不寻常的用法。通常它在一些其他操作中用作表达式而不是语句,例如:

var y = (x == 2 ? "yes" : "no");

所以,为了便于阅读(因为你正在做的事情是不寻常的),并且因为它避免了你不想要的“其他”,我建议:

if (x==2) doSomething();

答案 1 :(得分:247)

这也是一个选择:

x==2 && dosomething();
仅当dosomething()评估为true时,才会调用

x==2。这称为Short-circuiting

在这种情况下不常用,你真的不应该写这样的代码。我鼓励这种更简单的方法:

if(x==2) dosomething();

您应该始终编写可读代码;如果你担心文件大小,只需在许多JS压缩器之一的帮助下创建它的缩小版本。 (例如谷歌的Closure Compiler

答案 2 :(得分:59)

另一种选择:

x === 2 ? doSomething() : void 0;

答案 3 :(得分:17)

如果您没有做其他事情,为什么不这样做:

if (x==2) doSomething();

答案 4 :(得分:11)

使用null适用于三元表达式的一个分支。并且三元表达式可以作为Javascript中的语句。

但是,作为一种风格问题,如果您想要调用一个过程,那么使用if..else来编写它会更清楚:

if (x==2) doSomething;
else doSomethingElse

或者,在您的情况下,

if (x==2) doSomething;

答案 5 :(得分:5)

这个非常非常老的线程的一个小小的补充..

让我们在for循环中说出您需要使用三元运算符评估truthy/falsy值的变量,以防万一falsy continue { {1}}你想要Uncaught SyntaxError: Unexpected token continue - 你会遇到问题,因为你没有返回表达式,而是返回语句而没有任何问题值。

这将产生 for (var i = 0; i < myArray.length; i++) { myArray[i].value ? alert('yay') : continue; }

  for (var i = 0; i < myArray.length; i++) {
      if (myArray[i].value) alert('yay') ; else continue;
  }

所以,如果你确实想要返回一个语句并且仍然为你的代码使用一行,虽然乍一看似乎有些奇怪而且可能不遵循严格的语言使用,你可以这样做:

    CC = g++49

#General Flags
CFLAGS =

#debug flags
CFLAGS +=

#Target Liker Flags
CFLAGS +=


TARGET  = ../game

INCDIR += -I
LIBDIR += -L
LIBS += -l


##############################################

INCDIR += -I
LIBDIR += -L
LIBS += -l  
##############################################
CPP_FILE =


OBJDIR =../../Object's
CPPOBJS = $(CPP_FILE:%.cpp=$(OBJDIR)/%.o)

default: $(TARGET)

$(OBJDIR)/%.o: %.cpp
    @echo compile $<
    @$(CC) $(CFLAGS) $(INCDIR) -c $< -o $@

$(TARGET): $(CPPOBJS)
    @echo linking....
    @$(CC) $(CFLAGS) $(LIBDIR) $(CPPOBJS) $(LIBS) -o $(TARGET)
  • P.S - 此代码可能难以阅读或理解,因此它并不总是最佳选择。只是说.. :))

答案 6 :(得分:3)

从技术上讲,将null或0或只是一些随机设置为有效(因为您没有使用返回值)。但是,为什么使用此构造而不是if构造?当你以这种方式编写代码时,你试图做的事情就不那么明显了,因为你可能会把人们与no-op混淆(在你的情况下为null)。

答案 7 :(得分:0)

可能最短

x-2||dosomething()

let x=1, y=2;
let dosomething = s=>console.log(s); 

x-2||dosomething('x do something');
y-2||dosomething('y do something');