জাভাস্ক্রিপ্ট অপরিবর্তিত থাকলে একটি পরিবর্তনশীল সেট করে


172

আমি জানি যে আমি একটি জাভাস্ক্রিপ্ট ভেরিয়েবলের জন্য পরীক্ষা করতে পারি এবং তারপরে এটি সংজ্ঞায়িত করে তবে এটি সংজ্ঞায়িত করতে পারি, তবে বলার কিছু উপায় নেই?

var setVariable = localStorage.getItem ('মান') || 0;

অনেক পরিষ্কার ভাবে মনে হচ্ছে এবং আমি নিশ্চিত যে আমি এটি অন্যান্য ভাষায় দেখেছি।


30
যে না "undefined" জন্য একটি পরীক্ষা করে তা "falsey" এর জন্য একটি পরীক্ষা
ঊষা

3
দ্রষ্টব্য যে localStorage.getItem()ব্যবহারকারী যদি কুকিজ অক্ষম করে থাকে তবে এটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে (কমপক্ষে ক্রোমে), সুতরাং আপনি এটিকে একটি try...catchধারাটির মধ্যে
আবদ্ধ

উত্তর:


304

হ্যাঁ, এটা যে করতে পারেন, কিন্তু কঠোরভাবে বলতে যে ডিফল্ট মান নির্ধারণ হবে যদি উদ্ধার মান falsey যেমন সত্যিই বিরোধিতা undefined । সুতরাং শুধুমাত্র মেলে দিবে undefinedকিন্তু null, false, 0, NaN, "" (কিন্তু না "0" )।

আপনি যদি কেবলমাত্র ভেরিয়েবলটি কঠোরভাবে ডিফল্ট হিসাবে সেট করতে চান undefinedতবে নিরাপদটি লিখতে হবে:

var x = (typeof x === 'undefined') ? your_default_value : x;

নতুন ব্রাউজারগুলিতে এটি লিখতে আসলে নিরাপদ:

var x = (x === undefined) ? your_default_value : x;

তবে সচেতন থাকুন যে পুরানো ব্রাউজারগুলিতে এটি বিভ্রান্ত করা সম্ভব যেখানে undefinedপরীক্ষাটি ব্যর্থ হওয়ার কারণে একটি সংজ্ঞাযুক্ত মান রয়েছে এমন একটি ভেরিয়েবল ঘোষণার অনুমতি দেওয়া হয়েছিল ।


3
আমি অবাক হয়েছি যে এই প্যাটার্নটি আরও জেএস ল্যাবগুলিতে অন্তর্ভুক্ত নয়।
jomaller

var x = (x === undefined ? def_val : x);সামান্য দীর্ঘ হিসাবে ব্যবহার করার একটি খারাপ দিক আছে var x = (typeof x === 'undefined') ? def_val : x;? আচরণ কি আলাদা?
মার্কো পশকভ

3
পুরানো ব্রাউজারগুলিতে @ মার্কো undefinedপুনরায় সংজ্ঞায়িত করা সম্ভব হয়েছিল , যার ফলে সাম্যতা পরীক্ষা ব্যর্থ হয়েছিল।
আলনিটাক

@ অ্যালনিটাক ওপি যেভাবে ব্যবহার করছেন তার অনুরূপ সিনট্যাক্স ব্যবহার করার জন্য এবং এখনও অপরিজ্ঞাত জন্য পরীক্ষা করার জন্য সেরা পন্থাটি কী?
ইভো পেরেইরা

@ আইভোপিরিরা আপনি ||অনির্ধারিত জন্য একটি কঠোর পরীক্ষায় পদ্ধতির ব্যবহার করতে পারবেন না , আপনাকে undefinedশর্তসাপেক্ষে একটি স্পষ্ট পরীক্ষা ব্যবহার করতে হবে ।
আলনিটাক

26

2018 ES6 উত্তরটি হ'ল :

return Object.is(x, undefined) ? y : x;

যদি ভেরিয়েবল এক্স অপরিজ্ঞাত থাকে তবে ভেরিয়েবল y প্রদান করুন ... অন্যথায় যদি ভেরিয়েবল x সংজ্ঞায়িত করা হয় তবে ভেরিয়েবল এক্স প্রেরণ করুন।


4
আমি যতদূর বলতে পারি, এই ক্ষেত্রে এর Object.isচেয়ে ভাল আর ===কিছু নয়। "দ্য === অপারেটর (এবং == অপারেটর) -0 এবং +0 সংখ্যাকে সমান হিসাবে গণ্য করে এবং সংখ্যাটি এনএএন এর সমান নয় বলে গণ্য করে।" ( ডেভেলপার.মোজিলা.আর.ইন- ইউএস / ডকস / ওয়েবে / জাভা স্ক্রিপ্ট / রেফারেন্স / )) এখানে কিছু আসে যায় না।
ট্রেভর ডিকসন

5
আমি একমত নই এগুলি উভয়ই জানুন এবং উপযুক্তটি ব্যবহার করুন। বিশেষত, Object.isউভয় অপারেন্ড হতে পারে ব্যবহার করুন NaN
ট্রেভর ডিকসন

2
যদি অবজেক্ট.ইস () ব্যবহারের 100% ক্ষেত্রে কাজ করে, এবং === 98% ব্যবহারের ক্ষেত্রে কাজ করে তবে আপনি কেন === ব্যবহার করার ঝুঁকি নেবেন? উদাহরণস্বরূপ: কনসোল.লগ (+0 === -0); // আউটপুট সত্য, যখন কনসোল.লগ (অবজেক্ট.ইস (+0, -0)); // আউটপুট মিথ্যা - কোনটি ভাল? Negativeণাত্মক 0 কি ধনাত্মক 0 এর সমান? এই প্রশ্নটি আপনাকে নিজেকে জিজ্ঞাসা করতে হবে তবে আপনি যদি Object.is () ব্যবহার করেন তবে আপনি সর্বদা উত্তরটি জানেন। এগুলি এক নয়, সুতরাং মিথ্যা আউটপুট হ'ল সঠিক এবং প্রত্যাশিত ফলাফল।
স্টার্লিং বোর্ন

2
এখানে নির্দিষ্ট প্রসঙ্গে সর্বদা তুলনা করা হয় undefined। সুতরাং ===শুধুমাত্র 98% নয়, সময়ের 100% কাজ করবে। ===এটির সুবিধা হ'ল পড়া সহজ, বিশেষত এক নজরে, খাটো এবং একটি অপ্রয়োজনীয় পদ্ধতির কল এড়ানো যায়। ব্যক্তিগতভাবে আমি কেবল তখনই ব্যবহার করতে পারি Object.is()যখন পরিস্থিতি এটির প্রয়োজন হয় এবং ===অন্যান্য সমস্ত ক্ষেত্রে পছন্দ করে ।
blubberdiblub

1
একেবারে; আপনি যদি অভিজ্ঞ কোডার হন আপনি যদি দুর্ঘটনাক্রমে কোনও সমান চিহ্নটি ভুলে না যান, তবে ডিবাগিং কেন == কোথাও কাজ করছে না এমন কোনও বিষয় যা আমি কখনই কোনও বিকাশকারীকে কামনা করতে পারি না। দু: খের চেয়ে নিরাপদ এবং সর্বদা অবজেক্ট.ইস () ব্যবহার করা ভাল, কারণটি অনুমানের অন্তর্ভুক্ত ছিল বিশেষত বিকাশকারীদের কম বগি কোড লিখতে সহায়তা করার জন্য।
স্টার্লিং বোর্ন

7

আমার বেশ কয়েকটি জায়গায় "অপরিবর্তিত থাকলে একটি পরিবর্তনশীল সেট" করা দরকার। আমি @ অ্যালনিটাক উত্তরটি ব্যবহার করে একটি ফাংশন তৈরি করেছি। আশা করি এটি কাউকে সাহায্য করবে।

function setDefaultVal(value, defaultValue){
   return (value === undefined) ? defaultValue : value;
}  

ব্যবহার:

hasPoints = setDefaultVal(this.hasPoints, true);

6

typeofপরিবর্তে চেক করা আরও যুক্তিযুক্ত বলে মনে হচ্ছে undefined? আমি ধরে নিলাম আপনি অপরিবর্তিত হওয়ার 0সময় আপনি ভারটি সেট করার সাথে সাথে একটি সংখ্যা আশা করবেন :

var getVariable = localStorage.getItem('value');
var setVariable = (typeof getVariable == 'number') ? getVariable : 0;

getVariableএক্ষেত্রে যদি কোনও সংখ্যা না থাকে (স্ট্রিং, অবজেক্ট, যাই হোক না কেন), সেট ভার্যিয়েল সেট করা আছে0


5

ES2020 উত্তর

নুলিশ কোলেসিং অপারেটরের সাহায্যে নালিশ বা অপরিজ্ঞাত থাকলে আপনি একটি ডিফল্ট মান সেট করতে পারেন value

const setVariable = localStorage.getItem('value') ?? 0;

তবে আপনার সচেতন হওয়া উচিত যে নালিশ কোলেসিং অপারেটর অন্যান্য ধরণের জালযুক্ত মান যেমন 0এবং এর জন্য ডিফল্ট মান ফেরত দেয় না ''

অপারেটার জন্য ব্রাউজার সমর্থন সীমাবদ্ধ যে নোট নিতে হবে। ক্যানিউজ থেকে প্রাপ্ত তথ্য অনুযায়ী , কেবলমাত্র 48.34% ব্রাউজারই সমর্থিত (2020 এপ্রিল পর্যন্ত)। নোড.জেএস সমর্থন 14 সংস্করণে যুক্ত করা হয়েছিল ।


2

আপনি যদি একটি FP (হন, তাহলে কার্যকরী প্রোগ্রামিং ) অনুরাগী, Ramda বলা জন্য একটি ঝরঝরে সাহায্যকারী ফাংশন আছে defaultTo :

ব্যবহার:

const result = defaultTo(30)(value)

undefinedবুলিয়ান মানগুলি নিয়ে কাজ করার সময় এটি আরও কার্যকর :

const result2 = defaultTo(false)(dashboard.someValue)


1
এটি হ'ল const result = value || 30;, কেবলমাত্র ইন-মধ্যবর্তী ফাংশন এবং +1000 বাইট লিবিব ব্যবহার ব্যতীত
অ্যাডেলিন

1
অ্যাডেলিন সত্য নয়, এটি বুলিয়ান ধরণের ক্ষেত্রেও মিথ্যাচার পরিচালনা করে। যদি আপনি এই লিবটি ইতিমধ্যে ব্যবহার করছেন (আমি যেমন আছি) তবে এটি বেশ কার্যকর এবং ক্ষয়
দামিয়ান গ্রিন


1

আজ এই দৃশ্যে ছুটে এসেছি যেখানে আমি চাই না যে শূন্যটি বেশ কয়েকটি মানের জন্য ওভাররাইট করা হোক। আমাদের মতো দৃশ্যের জন্য কয়েকটি সাধারণ ইউটিলিটি পদ্ধতি সহ একটি ফাইল রয়েছে। দৃশ্যটি পরিচালনা করতে এবং নমনীয় হতে এখানে আমি যা যুক্ত করেছি তা এখানে।

function getIfNotSet(value, newValue, overwriteNull, overwriteZero) {
    if (typeof (value) === 'undefined') {
        return newValue;
    } else if (value === null && overwriteNull === true) {
        return newValue;
    } else if (value === 0 && overwriteZero === true) {
        return newValue;
    } else {
        return value;
    }
}

এরপরে এটি শেষ দুটি পরামিতিগুলির সাথে optionচ্ছিক হিসাবে কল করা যেতে পারে যদি আমি কেবল অপরিজ্ঞাত মানগুলির জন্য সেট করতে চাই বা নাল বা 0 টি মানকে ওভাররাইট করতে চাই। এখানে এটির কলটির একটি উদাহরণ রয়েছে যা আইডিটি অনির্ধারিত বা নাল থাকলে ID -1 এ সেট করবে তবে একটি 0 মানকে ওভাররাইট করবে না।

data.ID = Util.getIfNotSet(data.ID, -1, true);

1

আমাদের দিনগুলিতে আপনি আসলে জেএসের সাথে আপনার পদ্ধতিটি করতে পারেন:

// Your variable is null
// or '', 0, false, undefined
let x = null;

// Set default value
x = x || 'default value';

console.log(x); // default value

সুতরাং আপনার উদাহরণ কাজ করবে:

const setVariable = localStorage.getItem('value') || 0;


0

আমার কাছে মনে হয়, বর্তমান জাভাস্ক্রিপ্ট প্রয়োগের জন্য,

var [result='default']=[possiblyUndefinedValue]

এটি করার একটি দুর্দান্ত উপায় (অবজেক্ট ডিকনস্ট্রাকশন ব্যবহার করে)।


0

লজিকাল নালিশ নিয়োগ, ES2020 + সমাধান

নিউ অপারেটার বর্তমানে ব্রাউজার, যোগ করা হচ্ছে ??=, ||=এবং &&=। এই পোস্টে ফোকাস করা হবে ??=

বাম দিকটি অপরিশোধিত বা নাল, শর্ট সার্কিট যদি ইতিমধ্যে সংজ্ঞায়িত হয় তবে এটি পরীক্ষা করে। যদি তা না হয় তবে ডান দিকটি বাম পাশের ভেরিয়েবলের জন্য বরাদ্দ করা হয়েছে।

পদ্ধতির তুলনা

// Using ??=
name ??= "Dave"

// Previously, ES2020
name = name ?? "Dave"

// Before that (not equivalent, but commonly used)
name = name || "Dave" // name ||= "Dave"

বেসিক উদাহরণ

let a          // undefined
let b = null
let c = false

a ??= true  // true
b ??= true  // true
c ??= true  // false

// Equivalent to
a = a ?? true

বস্তু / অ্যারে উদাহরণ

let x = ["foo"]
let y = { foo: "fizz" }

x[0] ??= "bar"  // "foo"
x[1] ??= "bar"  // "bar"

y.foo ??= "buzz"  // "fizz"
y.bar ??= "buzz"  // "buzz"

x  // Array [ "foo", "bar" ]
y  // Object { foo: "fizz", bar: "buzz" }

?? = ব্রাউজার সমর্থন 2020 জুলাই - .03%

?? = মজিলা ডকুমেন্টেশন

|| = মজিলা ডকুমেন্টেশন

&& = মজিলা ডকুমেন্টেশন


এটা সত্যিই একটি ভাল ধারণা অপর দুই প্রশ্নের উত্তর কপি করতে দিচ্ছে না ( যদি নাল একটি মান প্রতিস্থাপন বা জাভাস্ক্রিপ্ট মধ্যে অনির্দিষ্ট এবং একটি "নাল কোয়ালেসিং" জাভাস্ক্রিপ্ট মধ্যে অপারেটর আছে কি? )? মন্তব্যে ডুপ্লিকেট বা সম্পর্কিত প্রশ্নের সাথে লিঙ্ক হিসাবে ভিটিসির পক্ষে ভাল না?
ব্যবহারকারী4642212

প্রশ্নগুলি সব কিছু ভিন্ন; যেমন উত্তর আছে। উদাহরণগুলি এক নজরে ইনলাইন প্রসঙ্গে উন্নতি করতে সামঞ্জস্যপূর্ণ। সম্ভবত আরও তথ্যের জন্য লিঙ্ক করতে পারত, তবে একটি অতিরিক্ত
হুপের
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.