Javascript 这样的逻辑可以写成一行吗?

Javascript 这样的逻辑可以写成一行吗?,javascript,Javascript,假设我想做一些类似于检查元素是否分配给变量,从而可以生成缓冲区或创建新的缓冲区,如下所示: if (element) { // may be null or an image / video DOM element scratchBoardContext.drawImage(element, 0, 0, width, height); this.buffer = scratchBoardContext.getImageData(0, 0, width, height).data;

假设我想做一些类似于检查元素是否分配给变量,从而可以生成缓冲区或创建新的缓冲区,如下所示:

if (element) { // may be null or an image / video DOM element
    scratchBoardContext.drawImage(element, 0, 0, width, height);
    this.buffer = scratchBoardContext.getImageData(0, 0, width, height).data;
} else {
    this.buffer = createBlankBuffer(width, height);
}
下面的代码可能(完全)是错误的,但我想知道是否可以使用类似的方法将前面的逻辑缩短为一行:

this.buffer = scratchBoardContext.drawImage(element, 0, 0, width, height) && scratchBoardContext.getImageData(0, 0, width, height).data || createBlankBuffer(width, height);
现在,“为什么你想用一行代码”是一个不同的话题,但我很好奇这是否可以做到,因为我经常看到人们把多行代码缩短成很短的一行代码,这样仍然很容易理解


根据答案,这是一种很好的格式化方法:

this.buffer = (element && scratchBoardContext.drawImage(element, 0, 0, width, height), 
    scratchBoardContext.getImageData(0, 0, width, height).data) 
    || createBlankBuffer(width, height);
我想我是对的,可能需要调整一下。根据环境的不同,这可能更可取,但显然最好使用
if/else
,因为清晰比简洁好。对于只有少数合作者喜欢较短代码的小型项目,这种语法可能很有用。

当然,这是可能的,因为第一个块做两件事,第二个块做一件事,所以您必须使用难看且难以理解的逗号运算符:

this.buffer = element
  ? (
    scratchBoardContext.drawImage(element, 0, 0, width, height),
    scratchBoardContext.getImageData(0, 0, width, height).data
  )
  : createBlankBuffer(width, height)
或者,挤成一行:

this.buffer = element ? ( scratchBoardContext.drawImage(element, 0, 0, width, height), scratchBoardContext.getImageData(0, 0, width, height).data ) : createBlankBuffer(width, height);
但这是不可读的-我更喜欢第一个版本,或者更好的是
if
/
else
版本。

这是可能的,当然,尽管第一个块做两件事,第二个块做一件事,你必须使用难看且难以理解的逗号运算符:

this.buffer = element
  ? (
    scratchBoardContext.drawImage(element, 0, 0, width, height),
    scratchBoardContext.getImageData(0, 0, width, height).data
  )
  : createBlankBuffer(width, height)
或者,挤成一行:

this.buffer = element ? ( scratchBoardContext.drawImage(element, 0, 0, width, height), scratchBoardContext.getImageData(0, 0, width, height).data ) : createBlankBuffer(width, height);
但是那是相当不可读的-我更喜欢第一个版本,或者更好,如果
/
否则
版本。

你可以使用操作符。但是,由于有两条语句,请确保使用运算符

您可以使用运算符。但是,由于有两条语句,请确保使用运算符


所有javascript代码都可以放在一行中。我不明白这个问题。请查看。所有javascript代码都可以放在一行中。我不明白这个问题。看看。是的,有时较长的版本是可行的,但现在我知道了一些方法,如果我遇到其他类似的情况,可以做这种事情。肯定有这样的地方,但这种情况不是一个好机会,因为第一个块需要两个完全不同的语句。(如果
scratchBoardContext.drawImage
返回了
scratchBoardContext
本身,允许链接,但情况可能不是这样,对吗?)您可能会考虑不尝试使用一行,而是尝试使用可能分散在多行上的单个语句,这样可以减少语法噪音,同时(有时)保持相当的可读性。是的,有时较长的版本是可行的,但现在我知道了一些方法,如果我遇到其他类似的情况,可以做这种事情。肯定有地方可以做,但这种情况不是一个好机会,因为第一个块需要两个完全不同的语句。(如果
scratchBoardContext.drawImage
返回了
scratchBoardContext
本身,允许链接,但情况可能不是这样,对吗?)您可能会考虑不尝试使用一行,而是尝试使用可能分散在多行上的单个语句,这样可以减少语法噪音,同时(有时)保持可读性。
Uncaught SyntaxError:uncontracted token,
抱歉,我忘了将其括在括号内。答案已更新。
Uncaught SyntaxError:uncontracted token,
抱歉,我忘了将其括在括号内。答案已更新。