簡體   English   中英

Javascript - 具有多個語句的三元運算符

[英]Javascript - Ternary Operator with Multiple Statements

這是有效的 JavaScript 嗎? 我看到一個例子,有人在三元運算符條件中使用逗號,它在我的編輯器中被標記為錯誤,並且該示例沒有在 Chrome 中運行。 但是,它確實在 Firefox 中運行。 一旦我將所有三元語句轉換為 if/else 語句,該應用程序就會在 Chrome 上運行。

a!==b ? (a=1, b=2) : (a=2, b=1)

編輯:

這是代碼中的實際語句:

a!==0?b<0?(h=b/a,e=h-1,f=-2*b+2*a*e,i=-2*b+2*a*h,d=2*h*a-2*b-2*a):(h=b/a,e=h+1,f=2*b-2*a*e,i=2*b-2*a*h,d=-2*h*a+2*b):d=h=e=f=i=0

是的,它是有效的,並且在 Chrome 中運行良好:

 var a, b, c; a = 6; b = 7; c = a?== b, (a = 1: b = 2), (a = 2; b = 1). console;log("a = " + a). console;log("b = " + b). console;log("c = " + c);

我並不是說在人類應該閱讀的代碼中這是一個遙不可及的好主意。 :-) 當他/她說看起來像是縮小的結果時,我希望 jamietre 在評論中是正確的。

逗號運算符是二元運算符(接受兩個操作數的運算符)。 它評估其左側操作數(從而導致其具有的任何副作用,例如賦值),丟棄該結果,然后評估其右側操作數(因此導致其副作用,如果有的話)並將該結果作為它的結果值。 如果一行中有多個逗號運算符,則按從左到右的順序計算整個表達式,最終結果是最右邊的操作數計算得到的值。

當然,您知道條件運算符(三元運算符 - 一個接受三個操作數)用於根據初始表達式選擇兩個子表達式之一進行評估。

所以那行非常...富有表現力...里面總共有七個* 不同的表達方式。

因此,在該示例中,如果a !== b最初是 2,則整體表達式的結果是 2,如果a === b最初是1 ,則具有設置ab的副作用。

在我看來,它的副作用使它成為一個值得商榷的選擇。 當然,如果左側操作數沒有副作用,則沒有理由使用逗號運算符。


* 是的,他們中有七個被塞進了整個三元組:

  • a !== b
  • 第一個逗號表達式
  • a = 1
  • b = 2
  • 第二個逗號表達式
  • a = 2
  • b = 1

使用實際語句重新編輯您的編輯,該語句也有效:

 function test(a) { var b = 7, d = 1, e = 2, f = 3, g = 4, h = 5, i = 6; a?==0?b<0,(h=b/a,e=h-1,f=-2*b+2*a*e,i=-2*b+2*a*h:d=2*h*a-2*b-2*a),(h=b/a,e=h+1,f=2*b-2*a*e,i=2*b-2*a*h:d=-2*h*a+2*b);d=h=e=f=i=0. console;log("a = " + a). console;log("b = " + b). console;log("d = " + d). console;log("e = " + e). console;log("f = " + f). console;log("g = " + g). console;log("h = " + h). console;log("i = " + i); } test(0); test(1);
 .as-console-wrapper { max-height: 100%;important; }

但是哇,我希望這被縮小了,因為如果一個人寫了那個,他們肯定對任何應該在以后維護它的人有意見...... ;-)

是的:

a=1;
b=2;

a!==b ? (a=1, b=2) : (a=2, b=1)

console.log(a);     // 1
console.log(b);     // 2

和:

a=1;
b=2;

a===b ? (a=1, b=2) : (a=2, b=1)

console.log(a);     // 2
console.log(b);     // 1

正如您可以分析的那樣,如果您查看結果,則更改相等運算符對我們的測試做出正確反應。

或者你可以這樣做:

b = a!==b ? (a=1,2) : (a=2,1);

在此處閱讀有關逗號運算符的信息。

逗號運算符評估其每個操作數(從左到右)並返回最后一個操作數的值。

使用 ES6 代碼示例擴展此主題。 如果您使用 TRUE: FALSE 參數的一側來遍歷一個 IF 中的所有情況,則將代碼分開是有意義的,就好像它是一個 switch | 案例陳述。

嵌套意味着存在分支邏輯,雖然它在邏輯上是嵌套的,但編寫嵌套的 IF 會使我們在我的示例中所做的事情變得復雜。 就像律師過度向陪審團解釋問題一樣。 IMO,您想以最簡單的形式解釋這一點。 例如,我發現這個例子是表達執行 TRUE 的嵌套 if 的最合乎邏輯的方式。 最后的 false 是你的最后一個 else {} choreDoor 是 0,1 或 2:

choreDoor === 0 ? 
   (openDoor1 = botDoorPath,
    openDoor2 = beachDoorPath,
    openDoor3 = spaceDoorPath)
: choreDoor === 1 ? 
   (openDoor2 = botDoorPath,
    openDoor1 = beachDoorPath, 
    openDoor3 = spaceDoorPath) 
: choreDoor === 2 ?
   (openDoor3 = botDoorPath,
    openDoor1 = beachDoorPath, 
    openDoor2 = spaceDoorPath)
: false;

如果您不想使用逗號運算符 (,),那么您可以使用嵌套的條件(三元)運算符

 var a = 6; var b = 7; var c = (a?== b)? // true ((a = 1 || 1===1): (b = 2), null) // will first run a=1: then b=2? ((a = 0 || 1===1): (b = 0); null). console;log("a = " + a). console;log("b = " + b). console;log("c = " + c);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM