使用if / else中的条件值

时间:2016-12-30 18:37:54

标签: javascript

我想知道是否可以直接访问条件的值,例如以下示例。

var a = ["pear", "kiwi", "orange", "apple"]
if(a.indexOf("orange") !== -1){
  console.log(this) //as a.indexOf("orange") has been evaluated already above this prints 2
}

这也会使三元运营商不那么臃肿

var a = ["pear", "kiwi", "orange", "apple"]
var b = ((a.indexOf("orange") !== -1) ? this : '') //"this" equals 2

由于

修改 为将来的访问者清除这个问题。 基本上这个问题是关于在if / else语句中检索得到的值的结果值。在

的例子中
var a = ["pear", "kiwi", "orange", "apple"]
if(a.indexOf("orange") !== -1){ //is basically if(2 !== -1)
  console.log(this) //would then be "2" from the already evaluted a.indexOf from above
}

7 个答案:

答案 0 :(得分:6)

如果目标是不评估两次,您可以将其存储在语句之前。你的字面问题的答案是否定的。

const orangeIndex = a.indexOf("orange")

if (orangeIndex !== -1) {
  console.log(orangeIndex)
}

同样的概念适用于三元运算符。

正如其他人所示,你也可以声明一个变量并在if语句本身中进行实际的赋值,但IMO会使你的代码在不添加任何值的情况下具有较低的可读性。

答案 1 :(得分:4)

没有隐含设施,但您可以将比较值分配给变量:

var a = ["pear", "kiwi", "orange", "apple"], result;
if (result = (a.indexOf("orange") !== -1)){
  console.log(result);
}

编辑 - 如果您只想要评估表达式的 part ,则可以应用相同的技术:

var a = ["pear", "kiwi", "orange", "apple"], result;
if ((result = a.indexOf("orange")) !== -1){
  console.log(result);
}

现在.indexOf()返回值保留在result而不是比较结果中。

答案 2 :(得分:2)

如果你想要真正简洁的代码,你可以在条件中分配一个变量。

var orangeIndex;
var a = ["pear", "kiwi", "orange", "apple"];
if ((orangeIndex = a.indexOf("orange")) !== -1) {
  console.log(orangeIndex);
}

你也可以用三元组来完成:

var orangeIndex;
var a = ["pear", "kiwi", "orange", "apple"]
var b = (((orangeIndex = a.indexOf("orange")) !== -1) ? orangeIndex : '');
console.log(b);

在这两种情况下,不要忘记作业周围的括号。这是必需的,因为赋值的优先级低于比较运算符,因此它会将变量设置为truefalse

答案 3 :(得分:0)

我重构你的代码。您可以在变量中保存条件结果。

var a = ["pear", "kiwi", "orange", "apple"];

var isOrange = a.indexOf("orange") !== -1;

if(isOrange){
  console.log(this) //as a.indexOf("orange") has been evaluated already above this prints 2
}

var a = ["pear", "kiwi", "orange", "apple"]
var b = isOrange ? this : '') //"this" equals 2

答案 4 :(得分:0)

是的,这实际上非常简单。实施例

if (yourvariable = yourcondition) {
    //Do something
} else if (yourvariable2 = yourcondition2) {
    //Do something else
} else if ((yourvariable3 = yourcondition3) || true) { //This is an else, but you memorized a condition inside it
    //Do something
}

为变量赋值时,变量将保存该值,并且运算符的结果也是值,因此

if (foo = bar) {
    //Some operations
}

在逻辑上等同于

if (bar) {
    foo = bar;
    //Some operations
}

但它更长,如果bar恰好是一个有很多操作的function,那么对它进行两次评估并不理想。

答案 5 :(得分:0)

这是最接近的

var a = ["pear", "kiwi", "orange", "apple"], result;
if ((result = a.indexOf("orange")) !== -1) {
  console.log(result);
}

这里,@ result =索引而不是Pointy提供的逻辑操作的结果。

答案 6 :(得分:0)

您可以通过记忆完成此操作。 lodash提供了一种称为memoize的方法。

  

创建一个记忆func结果的函数。如果提供了解析器,它将根据提供给memoized函数的参数确定用于存储结果的缓存键。默认情况下,提供给memoized函数的第一个参数用作映射缓存键。使用memoized函数的this绑定调用func。

// your collection
const fruit = ["pear", "kiwi", "orange", "apple"]

/*
 * a basic indexOf function that we can memoize.
 * @example
 * indexOf(fruit)('kiwi') // 1
 */
const indexOf = list => Array.prototype.indexOf.bind(list)

/*
 * a memoized version of IndexOf that is seeded with the list
 * @example
 * memoizedIndexOfA('kiwi') // 1
 */
const memoizedIndexOfA = _.memoize(indexOf(fruit))

// the first time it is called in the `if` it is calculated
if (memoizedIndexOfA("orange") !== -1){

    // the value was previously calculated, so retrieve from the cache.
    console.log(memoizedIndexOfA("orange"))
}