আমি এই প্রশ্নটি "কমা অপারেটর" সম্পর্কে এক্সপ্রেশন ( ,
) এবং এমডিএন ডক্স সম্পর্কে পড়েছি তবে এটি কোন পরিস্থিতিতে কার্যকর তা আমি ভাবতে পারি না।
সুতরাং, কমা অপারেটর কখন কার্যকর?
আমি এই প্রশ্নটি "কমা অপারেটর" সম্পর্কে এক্সপ্রেশন ( ,
) এবং এমডিএন ডক্স সম্পর্কে পড়েছি তবে এটি কোন পরিস্থিতিতে কার্যকর তা আমি ভাবতে পারি না।
সুতরাং, কমা অপারেটর কখন কার্যকর?
,
অপারেটরের সাথে কিছু করার আছে । সেই লাইনটিও বৈধ C#
, তবে ,
অপারেটরটি সেখানে নেই।
,
সবসময় ,
অপারেটর হয় না (এবং এটি ,
সি # তে অপারেটর কখনও হয় না )। সুতরাং সি # এর সিনট্যাক্সের অংশ হিসাবে ,
অবাধে ব্যবহার করার সময় সি # এর অপারেটরের অভাব থাকতে পারে ,
।
,
বহুল ব্যবহৃত হয় না (এবং ক এর প্রতিটি ঘটনা ,
কমা অপারেটর নয়) । তবে আপনি এটি এবং একটি অ্যারে অস্থায়ী ভেরিয়েবল তৈরি না করে ভেরিয়েবল অদলবদল ইনলাইন করতে ধার নিতে পারেন। আপনি যে মানগুলি পরিবর্তন করতে চান তা দেওয়া a
এবং b
আপনি করতে পারেন a = [b][b = a,0]
। এটি b
অ্যারেতে বর্তমান রাখে । দ্বিতীয়টি []
সম্পত্তি অ্যাক্সেস স্বরলিপি। সূচক অ্যাক্সেস করা হয় 0
, কিন্তু বরাদ্দ আগে a
থেকে b
, যা এখন নিরাপদ, যেহেতু b
অ্যারের মধ্যে বজায় রাখা হয়। ,
আমাদের মধ্যে একাধিক এক্সপ্রেশন করতে দেয় []
।
উত্তর:
নীচে আপনি নিজেরাই এটি লেখেন নি বলে সম্ভবত খুব কার্যকর নয় তবে একটি মিনিফায়ার কমা অপারেটর ব্যবহার করে কোড সঙ্কুচিত করতে পারে। উদাহরণ স্বরূপ:
if(x){foo();return bar()}else{return 1}
হবে:
return x?(foo(),bar()):1
? :
অপারেটর, এখন ব্যবহার করা যেতে পারে যেহেতু কমা অপারেটর (একটি নির্দিষ্ট পরিমাণ) অনুমতি দেয় দুটি বিবৃতি এক বিবৃতি হিসেবে লেখা হবে।
এই হল (-> 24 এখানে বাইট 39) যা কিছু ঝরঝরে কম্প্রেশন জন্য করতে পারবেন দরকারী।
আমি যে কমার জোর করতে চাই var a, b
হয় না কমা অপারেটর কারণ এটি একটি মধ্যে বিদ্যমান নয় অভিব্যক্তি । var
বিবৃতিতে কমাটির একটি বিশেষ অর্থ রয়েছে ।a, b
একটি অভিব্যক্তি দুটি ভেরিয়েবল উল্লেখ করা হবে এবং মূল্যায়ন b
, যা ক্ষেত্রে হয় না var a, b
।
if (condition) var1 = val1, var2 = val2;
আমি ব্যক্তিগতভাবে মনে করি বন্ধনীগুলি এড়ানো সম্ভব যেখানে কোডটি আরও পাঠযোগ্য।
কমা অপারেটর আপনাকে এমন একাধিক অভিব্যক্তি রাখার অনুমতি দেয় যেখানে একটি অভিব্যক্তি প্রত্যাশিত। একটি কমা দ্বারা পৃথক একাধিক এক্সপ্রেশন এর ফলে প্রাপ্ত মানটি সর্বশেষ কমা দ্বারা পৃথক হওয়া এক্সপ্রেশনটির মান হবে।
আমি ব্যক্তিগতভাবে এটি প্রায়শই ব্যবহার করি না কারণ এমন অনেকগুলি পরিস্থিতি নেই যেখানে একাধিক এক্সপ্রেশন আশা করা যায় এবং কমা অপারেটর ব্যবহারের চেয়ে কোডটি লেখার কম বিভ্রান্তিকর উপায় নেই। একটি আকর্ষণীয় সম্ভাবনা for
লুপের শেষে যখন আপনি চান একাধিক ভেরিয়েবল বৃদ্ধি করা:
// j is initialized to some other value
// as the for loop executes both i and j are incremented
// because the comma operator allows two statements to be put in place of one
for (var i = 0; i < items.len; i++, j++) {
// loop code here that operates on items[i]
// and sometimes uses j to access a different array
}
এখানে আপনি এটি দেখুন i++, j++
এমন এক জায়গায় স্থাপন করা যেতে পারে যেখানে একটি অভিব্যক্তি অনুমোদিত। এই বিশেষ ক্ষেত্রে, একাধিক অভিব্যক্তি পার্শ্ব প্রভাবের জন্য ব্যবহৃত হয় সুতরাং এটি যৌগিক এক্সপ্রেশনগুলি সর্বশেষটির মান গ্রহণ করে তা বিবেচ্য নয়, তবে এমন অন্যান্য ক্ষেত্রে রয়েছে যা বাস্তবে গুরুত্বপূর্ণ।
জাভাস্ক্রিপ্টে ফাংশনাল কোড লেখার সময় কমা অপারেটর প্রায়শই দরকারী।
এই কোডটি বিবেচনা করুন আমি কিছুক্ষণ আগে এসপিএর জন্য লিখেছিলাম যা নীচের মত কিছু ছিল
const actions = _.chain(options)
.pairs() // 1
.filter(selectActions) // 2
.map(createActionPromise) // 3
.reduce((state, pair) => (state[pair[0]] = pair[1], state), {}) // 4
.value();
এটি ছিল মোটামুটি জটিল, তবে বাস্তব-জগতের দৃশ্য। আমি কী ঘটছে তা বর্ণনা করার সময় আমার সাথে থাকুন এবং প্রক্রিয়াটিতে কমা অপারেটরের ক্ষেত্রে মামলা করুন।
ব্যবহার অপশন এই ফাংশন প্রেরণ করা সব পৃথক্ নিন pairs
যা চালু হবে { a: 1, b: 2}
মধ্যে[['a', 1], ['b', 2]]
সম্পত্তি জোড়গুলির এই অ্যারেটি ফিল্টার করা হয় যার দ্বারা এটি সিস্টেমে 'ক্রিয়া' বলে গণ্য হয়।
তারপরে অ্যারেতে দ্বিতীয় সূচকটি একটি ফাংশন দ্বারা প্রতিস্থাপন করা হবে যা সেই ক্রিয়াকে প্রতিনিধিত্ব করে প্রতিশ্রুতি দেয় (ব্যবহার করে map
)
পরিশেষে কলটি reduce
প্রতিটি "সম্পত্তি অ্যারে" ( ['a', 1]
) কে একটি চূড়ান্ত অবজেক্টে ফিরিয়ে আনবে ।
শেষ ফলাফলটি options
আর্গুমেন্টের রূপান্তরিত সংস্করণ , যাতে কেবল উপযুক্ত কী থাকে এবং যার মানগুলি কলিং ফাংশন দ্বারা ভোগ্য হয়।
শুধু তাকানো
.reduce((state, pair) => (state[pair[0]] = pair[1], state), {})
আপনি হ্রাস ফাংশনটি খালি রাষ্ট্রীয় অবজেক্টের সাথে শুরু দেখতে পাবেন state
এবং প্রতিটি জোড়ের জন্য কী এবং মান উপস্থাপন করা হয় তবে ফাংশনটি একই করে দেয়state
জন্য, কী / মান জুটির সাথে সম্পর্কিত বস্তুটিতে কোনও সম্পত্তি যুক্ত করার পরে অবজেক্টটি প্রদান করে। ECMAScript 2015 এর তীর ফাংশন সিনট্যাক্সের কারণে, ফাংশন বডিটি একটি অভিব্যক্তি এবং ফলস্বরূপ, কমা অপারেটর একটি সংক্ষিপ্ত এবং দরকারী "পুনরাবৃত্তি" এর অনুমতি দেয় ফাংশনটিকে অনুমতি দেয়।
ECMAScript 2015 + তীর ফাংশন সহ আরও কার্যকরী শৈলীতে জাভাস্ক্রিপ্ট লেখার সময় ব্যক্তিগতভাবে আমি অসংখ্য মামলা জুড়ে এসেছি। এটি বলার পরেও, তীরের ক্রিয়াকলাপগুলির মুখোমুখি হওয়ার আগে (যেমন প্রশ্নের লেখার সময়), আমি কখনই কোনও ইচ্ছাকৃতভাবে কমা অপারেটরটি ব্যবহার করতাম না।
reduce
.reduce((state, [key, value]) => (state[key] = value, state), {})
। এবং আমি বুঝতে পারি যে এটি উত্তরের উদ্দেশ্যকে পরাস্ত করে তবে .reduce((state, [key, value]) => Object.assign(state, { [key]: value }), {})
কমা অপারেটরের প্রয়োজন সম্পূর্ণরূপে মুছে ফেলবে।
কমা অপারেটরের জন্য আরেকটি ব্যবহার হ'ল ফলগুলি লুকানো যা আপনি রেপ বা কনসোলে মোটেই যত্নবান নন, নিখুঁত সুবিধার্থে।
উদাহরণস্বরূপ, আপনি যদি myVariable = aWholeLotOfText
Repl বা কনসোলে মূল্যায়ন করেন তবে এটি সবেমাত্র নির্ধারিত সমস্ত ডেটা মুদ্রণ করবে। এটি পৃষ্ঠাগুলি এবং পৃষ্ঠাগুলি হতে পারে এবং আপনি যদি এটি দেখতে না চান তবে আপনি তার পরিবর্তে মূল্যায়ন করতে পারবেন myVariable = aWholeLotOfText, 'done'
এবং repl / কনসোলটি কেবল 'সম্পন্ন' মুদ্রণ করবে।
Oriel সঠিকভাবে তুলে ধরে † যে কাস্টমাইজড toString()
বা get()
ফাংশন এমনকি এই দরকারী করা হতে পারে।
কমা অপারেটর জাভাস্ক্রিপ্টের জন্য সুনির্দিষ্ট নয়, এটি সি এবং সি ++ এর মতো অন্যান্য ভাষায় উপলভ্য । বাইনারি অপারেটর হিসাবে এটি কার্যকর যখন প্রথম অপারেন্ড, যা সাধারণত একটি অভিব্যক্তি, দ্বিতীয় অপারেন্ডের জন্য প্রয়োজনীয় পার্শ্ব প্রতিক্রিয়া পছন্দ করে। উইকিপিডিয়া থেকে একটি উদাহরণ:
i = a += 2, a + b;
স্পষ্টতই আপনি দুটি ভিন্ন ভিন্ন লাইন কোড লিখতে পারেন, তবে কমা ব্যবহার করা অন্য বিকল্প এবং কখনও কখনও আরও পাঠযোগ্য।
আমি ফ্লানাগানের সাথে একমত নই, এবং বলি যে কমাটি সত্যই কার্যকর এবং আরও পাঠযোগ্য এবং মার্জিত কোড লিখতে দেয়, বিশেষত যখন আপনি জানেন যে আপনি কী করছেন:
এখানে বিস্তৃত বিস্তারিত নিবন্ধকমা ব্যবহারের হয়েছে:
বিক্ষোভের প্রমাণের জন্য সেখান থেকে বেশ কয়েকটি উদাহরণ:
function renderCurve() {
for(var a = 1, b = 10; a*b; a++, b--) {
console.log(new Array(a*b).join('*'));
}
}
একটি ফিবোনাচি জেনারেটর:
for (
var i=2, r=[0,1];
i<15;
r.push(r[i-1] + r[i-2]), i++
);
// 0,1,1,2,3,5,8,13,21,34,55,89,144,233,377
JQuery .parent()
ফাংশনের অ্যানালগ, প্রথম প্যারেন্ট উপাদানটি সন্ধান করুন :
function firstAncestor(el, tagName) {
while(el = el.parentNode, el && (el.tagName != tagName.toUpperCase()));
return el;
}
//element in http://ecma262-5.com/ELS5_HTML.htm
var a = $('Section_15.1.1.2');
firstAncestor(a, 'div'); //<div class="page">
while ((el = el.parentNode) && (el.tagName != tagName.toUpperCase()))
সে প্রসঙ্গে ঠিকঠাক হয়ে উঠবেন।
আমি এটির ব্যতীত এর ব্যবহারিক ব্যবহার খুঁজে পাইনি তবে এখানে এমন একটি দৃশ্যে দেখা গেছে যে জেমস প্যাডলসই আই ল সনাক্তকরণের জন্য কিছুক্ষণ লুপটিতে এই কৌশলটি সুন্দরভাবে ব্যবহার করেছেন :
var ie = (function(){
var undef,
v = 3,
div = document.createElement('div'),
all = div.getElementsByTagName('i');
while ( // <-- notice no while body here
div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
all[0]
);
return v > 4 ? v : undef;
}());
এই দুটি লাইন কার্যকর করতে হবে:
div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
all[0]
এবং কমা অপারেটরের অভ্যন্তরে উভয়কেই মূল্যায়ন করা হয় যদিও কেউ তাদের আলাদাভাবে বিবৃতি দিতে পারে।
do
- while
লুপ হতে পারে ।
জাভা স্ক্রিপ্টে কমা অপারেটর ব্যবহার করে অপ্রত্যক্ষভাবে কোনও ফাংশন কল করার জন্য জাভাস্ক্রিপ্টে কিছু করা যায় "
এখানে একটি দীর্ঘ বিবরণ রয়েছে: জাভাস্ক্রিপ্টে পরোক্ষ ফাংশন কল
এই বাক্য গঠন ব্যবহার করে:
(function() {
"use strict";
var global = (function () { return this || (1,eval)("this"); })();
console.log('Global === window should be true: ', global === window);
var not_global = (function () { return this })();
console.log('not_global === window should be false: ', not_global === window);
}());
আপনি গ্লোবাল ভেরিয়েবলের অ্যাক্সেস পেতে পারেন কারণ eval
সরাসরি বনামকে পরোক্ষভাবে ডাকা হলে আলাদাভাবে কাজ করে।
এই জাতীয় সাহায্যকারীদের লেখার সময় আমি কমা অপারেটরটিকে সবচেয়ে দরকারী বলে মনে করেছি।
const stopPropagation = event => (event.stopPropagation(), event);
const preventDefault = event => (event.preventDefault(), event);
const both = compose(stopPropagation, preventDefault);
আপনি কোনও একটি দিয়ে কমা প্রতিস্থাপন করতে পারেন || এবং&&, তবে তার পরে আপনাকে ফাংশনটি কী দেয় তা জানতে হবে।
তার চেয়েও গুরুত্বপূর্ণ, কমা বিভাজক অভিপ্রায়টি যোগাযোগ করে - বাম-অপারেন্ড কী মূল্যায়ন করে তা কোডের যত্ন নেয় না , অন্যদিকে বিকল্পগুলি সেখানে থাকার কারণ হতে পারে। এর ফলে এটি বোঝা এবং চুল্লিটিকে আরও সহজ করে তোলে। যদি ফাংশন রিটার্নের ধরনটি কখনও পরিবর্তন হয় তবে উপরের কোডটি প্রভাবিত হবে না।
স্বাভাবিকভাবেই আপনি একই জিনিসটি অন্যান্য উপায়ে অর্জন করতে পারেন তবে সংক্ষিপ্তভাবে নয়। যদি || এবং && সাধারণ ব্যবহারে একটি জায়গা খুঁজে পেয়েছিল, তাই কমা অপারেটরটিও করতে পারে।
tap
( Ramdajs.com/docs/#tap ) রমদা- লোদাশ কী করে তার মতো । মূলত, আপনি একটি পার্শ্ব-প্রভাব কার্যকর করছেন এবং তারপরে প্রাথমিক মানটি ফিরিয়ে দিচ্ছেন; ফাংশনাল প্রোগ্রামিংয়ে খুব দরকারী :)
এটি ব্যবহার করে শেষ হওয়া একটি সাধারণ কেস হ'ল argumentচ্ছিক যুক্তি পার্সিংয়ের সময়। আমি মনে করি এটি এটিকে আরও পঠনযোগ্য এবং আরও সংক্ষিপ্ত করে তোলে যাতে যুক্তিটি পার্সিংটি ফাংশন বডিটিতে প্রভাব ফেলতে পারে না।
/**
* @param {string} [str]
* @param {object} [obj]
* @param {Date} [date]
*/
function f(str, obj, date) {
// handle optional arguments
if (typeof str !== "string") date = obj, obj = str, str = "default";
if (obj instanceof Date) date = obj, obj = {};
if (!(date instanceof Date)) date = new Date();
// ...
}
ধরা যাক আপনার একটি অ্যারে রয়েছে:
arr = [];
যখন আপনি push
এই অ্যারেটিতে যান, আপনি খুব কমই push
রিটার্ন ভ্যালুতে, অর্থাৎ অ্যারের নতুন দৈর্ঘ্যে, তবে অ্যারে নিজেই আগ্রহী:
arr.push('foo') // ['foo'] seems more interesting than 1
কমা অপারেটরটি ব্যবহার করে, আমরা অ্যারেতে চাপ দিতে পারি, অ্যারেটি কমাতে শেষ অপারেন্ড হিসাবে নির্দিষ্ট করতে পারি এবং তারপরে ফলাফলটি - অ্যারে নিজেই ব্যবহার করতে পারি - পরবর্তী অ্যারে পদ্ধতি কলের জন্য, এক ধরণের শৃঙ্খলাবদ্ধ:
(arr.push('bar'), arr.push('baz'), arr).sort(); // [ 'bar', 'baz', 'foo' ]
আর একটি ক্ষেত্র যেখানে কমা অপারেটর ব্যবহার করা যেতে পারে তা হ'ল কোড অবফেসেশন ।
ধরা যাক কোনও বিকাশকারী এই জাতীয় কিছু কোড লিখেছেন:
var foo = 'bar';
এখন, তিনি কোডটি অবলম্বন করার সিদ্ধান্ত নেন। ব্যবহৃত সরঞ্জামটি কোডটি এভাবে পরিবর্তন করতে পারে:
var Z0b=(45,87)>(195,3)?'bar':(54,65)>(1,0)?'':'baz';// Z0b == 'bar'
var i, j, k;
বনামvar i; var j, var k
?