繁体   English   中英

更简洁的 JavaScript 条件三元运算符替代品?

[英]More concise alternative to JavaScript conditional ternary operator?

在很多情况下,使用conditional ternary operator允许优先使用const不是let

let scaleFactor = 1;
if (prev.scale < 1 && current.scale < 1) {
  scaleFactor = 5;
}

使用三元和常量:

const scaleFactor =
  prev.scale < 1 && current.scale < 1 ? 5 : 1;

我经常看到并使用这种模式。 有没有更简洁的方法来写这个我一直错过的?

更新:一个更短、更易读的三元替代示例

const t =  tX > 0
               ? 0
               : tX < width - width * scale
               ? width - width * scale
               : tX
const t = Math.max(Math.min(tX, 0), width - width * scale)

尽管我完全同意某些人对您的问题的评论如此简短!= 简洁,但我确实认为您的问题是有效的。 在许多情况下,如果将值设置为 X 或将模式设置为 Y,则可以执行包含布尔条件作为因子的表达式。 一些选项:

if (C)
   value = X
else
   value = Y

可以转换为

value = C * X + !C * Y;

同样的事情可以写成:

value = X + !C * (Y - X)

我是一名游戏开发者,我经常需要这样的东西:

// 1 if the right arrow was pressed, -1 for the left, 0 otherwise
var changeInMovementX = hasRightArrowBeenPressed - hasLeftArrowBeenPressed;
// same for up and down
var changeInMovementY = hasTopArrowBeenPressed - hasDownArrowBeenPressed;
// move 1 pixel in the given directions
player.move(changeInMovementX, changeInMovementX);

对于您的具体示例,您可能会考虑以下内容:

const shouldIncreaseScale = prev.scale < 1 && current.scale < 1;
const scaleIncrease = 4;
const scaleFactor = 1 + shouldIncreaseScale * scaleIncrease;

简而言之,Javascript 中还不存在像 switch 表达式这样的语言特性。 但是你可以根据自己的喜好做一些事情

  1. 带有返回的 switch 语句的 IIFE
const a = 5
const c1 = (() => {
  switch (a) {
    case 1: {
      return 2
    }
    case 2: {
      return 3
    }
    default: {
      return 4
    }
  }
})()

console.log(c1)
  1. 带有 if 语句的 IIFE
const c2 = (() => {
  if (a === 1) {
    return 2
  } else if (a < 10 && b > 10) {
    return 3
  } else {
    return 4
  }
})()

console.log(c2)
  1. 自定义助手
// define this once
const conditionalHelper = (cases, defaultValue) => {
  for (let i = 0; i < cases.length; i++) {
    const [predicate, value] = cases[i]
    if (predicate()) {
      return value
    }
  }
  return defaultValue
}

const c3 = conditionalHelper(
  [
    [() => a === 1, 2],
    [() => a < 10 && b > 10, 3],
  ],
  4
)
console.log(c3)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM