我想知道是否可以直接访问条件的值,例如以下示例。
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
}
答案 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);
在这两种情况下,不要忘记作业周围的括号。这是必需的,因为赋值的优先级低于比较运算符,因此它会将变量设置为true
或false
。
答案 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"))
}