javascript उनल स्ट्रिंग संघनन के साथ टर्नरी ऑपरेटर का उपयोग करना




जावास्क्रिप्ट डाउनलोड (5)

alert("test: "+(1==2)?'hello':'world');

यह मुझे स्क्रीन पर 'world' दिखाना चाहिए क्योंकि 1 2 के बराबर नहीं है।

यह 'hello' को कैसे अलर्ट करता है?

https://code.i-harness.com


संचालक वरीयता

सभी ऑपरेटरों ने precedence. रूप में जाना जाता precedence. इस प्रकार भाषा संचालन के क्रम को निर्धारित करती है। कम पूर्वता वाले ऑपरेटरों का मूल्यांकन कम वरीयता वाले लोगों से पहले किया जाएगा। संचालन का क्रम वह है जो अभिव्यक्तियों को सही क्रम में निष्पादित करने की अनुमति देता है।

उदाहरण के लिए,

1 + 2 * 3 == 1 + 6 == 7

क्योंकि * की तुलना में उच्च पूर्वता है। पूर्वता के बिना, आपको मिलेगा

1 + 2 * 3 == 3 * 3 == 9

+ बनाम + ?:

जावास्क्रिप्ट में, + ऑपरेटर की तुलना में अधिक पूर्वता है ?: ऑपरेटर। इसका मतलब यह है कि एक टर्नरी में स्थिति का मूल्यांकन करने से पहले कॉन्फेटेशन होगा। इससे कुछ अजीब परिणाम हो सकते हैं।

नोट: ऑपरेटर समरूपता और पूर्वता भाषाओं के बीच बदल सकते हैं। उदाहरण के लिए, जावास्क्रिप्ट में ?: ऑपरेटर सही सहयोगी है लेकिन यह PHP में सहयोगी है ये समान तुलनाएं इन भाषाओं के बीच अलग-अलग परिणाम उत्पन्न करेंगी।

var variable, str;

// Equality operators have higher precedence than ?: but lower than +
// so the below expression breaks down like this:
//   ("A" + variable) !== undefined ? "B" : ("C" + "D")
//   "Aundefined" !== undefined ? "B" : "CD"
//   true ? "B" : "CD"
//   "B"
str = "A" + variable !== undefined ? "B" : "C" + "D";
console.log(str);

// For the same reason as above, you get a strange result here.
// Here's how we break it down:
//   ("A" + variable) === undefined ? "B" : ("C" + "D")
//   "Aundefined" === undefined ? "B" : "CD"
//   false ? "B" : "CD"
//   "CD"
str = "A" + variable === undefined ? "B" : "C" + "D";
console.log(str);

इस प्रकार की समस्या से कोई फर्क नहीं पड़ता कि क्या स्थिति है:

// Check for undefined
var animal;
// Expected: "The animal does not exist", actual: undefined
console.log("The animal " + animal === undefined ? "does not exist" : animal);

// Expected: "The animal undefined", actual: "does not exist"
console.log("The animal " + animal !== undefined ? "does not exist" : animal);

// Check for null
animal = null;
// Expected: "The animal does not exist", actual: null
console.log("The animal " + animal === null ? "does not exist" : animal);

// Expected: "The animal null", actual: "does not exist"
console.log("The animal " + animal !== null ? "does not exist" : animal);

// Check for property
animal = {};
// Expected: "This animal doesn't have a type", actual: undefined
console.log("The animal " + animal.hasOwnProperty('type') ? animal.type : "doesn't have a type");

animal.type = 'is a dog';
// Expected: "This animal is a dog", actual: "is a dog"
console.log("The animal " + animal.hasOwnProperty('type') ? animal.type : "doesn't have a type");

उपाय

इन्हीं पूर्ववर्ती नियमों का उपयोग करते हुए, हम जानते हैं कि कोष्ठक ( ... ) में किसी भी अन्य ऑपरेटरों की सर्वोच्च पूर्वता है। कोष्ठकों के अंदर संचालन को समूहीकृत करके, उन कार्यों का पहले मूल्यांकन किया जाएगा। यह पुनरावर्ती कार्य करता है, जिससे आपको कोष्ठकों के गहरे सेट के अंदर समूह संचालन को आगे बढ़ाने की अनुमति मिलती है।

इसे देखते हुए, आप वांछित परिणाम प्राप्त करने के लिए कोष्ठक के अंदर अपने टर्नरी भाव लिख सकते हैं।

var animal;
console.log( "The animal " + (animal === undefined ? "does not exist" : animal) );
console.log( "The animal " + (animal !== undefined ? "does not exist" : animal) );

animal = null;
console.log( "The animal " + (animal === null ? "does not exist" : animal) );
console.log("The animal " + (animal !== null ? "does not exist" : animal) );

animal = {};
console.log( "The animal " + (animal.hasOwnProperty('type') ? animal.type : "doesn't have a type") );

animal.type = 'is a dog';
console.log( "The animal " + (animal.hasOwnProperty('type') ? animal.type : "doesn't have a type") );

सामान्य तौर पर, अपनी स्थिति को कोष्ठक में भी लपेटना एक अच्छा विचार है। इस तरह से आपको कम मूल्य की स्थिति मिलेगी, जब आप कम वरीयता वाले ऑपरेटरों के साथ स्थिति पैदा करेंगे।

// Assignment without parentheses
var x = 0;
console.log( x += 2 ? 'x is 2' : 'x is not 2' );

// Assignment with parentheses
x = 0;
console.log( (x += 2) ? 'x is 2' : 'x is not 2' );



आपको कुछ अतिरिक्त कोष्ठक जोड़ने की आवश्यकता है:

alert("test: " + ((1 == 2) ? "hello" : "world"));

ऑपरेशन के चारों ओर अपने पैरेंस को लपेटने का प्रयास करें

alert("test: "+ (1 == 2 ? 'hello' : 'world'));

डेमो: http://jsfiddle.net/hunter/K3PKx/

यह क्या कर रहा है:

alert("test: "+(1==2)?'hello':'world');

मूल्यांकन कर रहा है "test: " + (1==2) true रूप में जो 'hello' आउटपुट


प्रस्तुत दोनों उत्तर सही हैं, आपको कोष्ठक जोड़ने की आवश्यकता है। मुझे लगा कि मैं इसके बारे में संक्षेप में बात करूंगा।

alert("test: "+(1==2)?'hello':'world');

जब पार्सर एक बयान का सामना करता है, तो यह पुनरावृत्ति को छोटे और छोटे टुकड़ों में तोड़ना शुरू कर देगा।

इस मामले में, पहली चीज जिसका सामना होता है वह एक फ़ंक्शन है: alert । तुरंत पार्सर alert के तर्कों को देखेगा, और उनमें से प्रत्येक को व्यक्तिगत रूप से पार्स करना शुरू कर देगा। इस फ़ंक्शन में केवल एक तर्क है, "test: "+(1==2)?'hello':'world' , यह एक आसान पहला कदम है।

इस स्तर पर हम अपने बयान को बाइनरी तुलना की एक श्रृंखला में तोड़ सकते हैं। जावास्क्रिप्ट पार्सर बायीं से दाईं ओर बाइनरी जोड़े बनाते हैं (जब ऑपरेशन के मान समान होते हैं)। हमारे संभावित उम्मीदवार "test: " , (1==2) , 'hello' और 'world' संचालक + साथ हैं ? और : पार्सर पहले "test: " और (1==2) को जोड़ने का प्रयास करेगा। ऐसा करने के लिए उसे पहले कथन (1==2) मूल्यांकन करना चाहिए (जो false मूल्यांकन करता false )। + ऑपरेटर स्ट्रिंग्स के साथ तालमेल का कारण बनता है और सभी आदिम चर को स्वयं के रूप में भी स्ट्रिंग्स का प्रतिनिधित्व करने का प्रयास करने के लिए मजबूर करता है। false "false" को "test: false" बनाने वाले स्ट्रिंग के रूप में मूल्यांकन करता है।

पार्सर अब टर्नरी के पहले भाग का मूल्यांकन करने के लिए तैयार है: "test: false"? । जावास्क्रिप्ट में, सभी गैर-खाली स्ट्रिंग्स true मूल्यांकन करते true , टर्नरी ऑपरेटर के परीक्षण को पास करते हुए और पहला विकल्प "hello" उठाते हैं।

मूल विवरण में कुछ अतिरिक्त कोष्ठक फेंककर:

alert("test: " + ((1 == 2) ? 'hello' : 'world'));

हम पार्सर को बताते हैं कि हम टर्नरी ऑपरेटर से पहले के मूल्यांकन का मूल्यांकन करना चाहते हैं।





javascript