javascript - জাভাস্ক্রিপ্ট ইস্যু() সমতুল্য




isset (12)

যদি আপনি পিএইচপি করতে পারেন if(isset($array['foo'])) { ... } । জাভাস্ক্রিপ্টে যদি আপনি if(array.foo) { ... } ব্যবহার করেন if(array.foo) { ... } এটি ঠিক একই বিবৃতি নয়। array.foo যদি বিদ্যমান থাকে তবে শর্ত মিথ্যাও মূল্যায়ন করবে তবে false বা 0 (এবং সম্ভবত অন্যান্য মানও)।

জাভাস্ক্রিপ্ট মধ্যে পিএইচপি এর isset নিখুঁত সমতুল্য কি?

বিস্তৃত অর্থে, জাভাস্ক্রিপ্টগুলির চলমান ভেরিয়েবলের একটি সাধারণ, সম্পূর্ণ নির্দেশিকা যা বিদ্যমান নেই, একটি মান ছাড়া পরিবর্তনগুলি ইত্যাদি সুবিধাজনক হবে।


SOURCE উল্লেখ

    module.exports = function isset () {
  //  discuss at: http://locutus.io/php/isset/
  // original by: Kevin van Zonneveld (http://kvz.io)
  // improved by: FremyCompany
  // improved by: Onno Marsman (https://twitter.com/onnomarsman)
  // improved by: Rafał Kukawski (http://blog.kukawski.pl)
  //   example 1: isset( undefined, true)
  //   returns 1: false
  //   example 2: isset( 'Kevin van Zonneveld' )
  //   returns 2: true

  var a = arguments
  var l = a.length
  var i = 0
  var undef

  if (l === 0) {
    throw new Error('Empty isset')
  }

  while (i !== l) {
    if (a[i] === undef || a[i] === null) {
      return false
    }
    i++
  }

  return true
}

phpjs.org বেশিরভাগ locutus পক্ষে অবসরপ্রাপ্ত হয় এখানে নতুন লিঙ্ক http://locutus.io/php/var/isset


Wether এইচটিএমএল ব্লক চেক করার জন্য বিদ্যমান বা না, আমি এই কোড ব্যবহার করছি:

if (typeof($('selector').html()) != 'undefined') {
    // $('selector') is existing
    // your code here
}

আমি সর্বদা আদিম ভেরিয়েবলগুলির পাশাপাশি অ্যারে এবং বস্তুর ত্রুটিগুলি প্রতিরোধ করতে এই জেনেরিক ফাংশনটি ব্যবহার করি।

isset = function(obj) {
  var i, max_i;
  if(obj === undefined) return false;
  for (i = 1, max_i = arguments.length; i < max_i; i++) {
    if (obj[arguments[i]] === undefined) {
        return false;
    }
    obj = obj[arguments[i]];
  }
  return true;
};

console.log(isset(obj));                   // returns false
var obj = 'huhu';
console.log(isset(obj));                   // returns true
obj = {hallo:{hoi:'hoi'}};
console.log(isset(obj, 'niet'));           // returns false
console.log(isset(obj, 'hallo'));          // returns true
console.log(isset(obj, 'hallo', 'hallo')); // returns false
console.log(isset(obj, 'hallo', 'hoi'));   // returns true

আমি সাধারণত typeof অপারেটর ব্যবহার করি:

if (typeof obj.foo !== 'undefined') {
  // your code here
}

সম্পত্তিটি অস্তিত্ব না থাকলে বা তার মানটি undefined হলে এটি "undefined" ফিরে আসবে।

(আরও দেখুন: undefined এবং সংজ্ঞায়িত না করা মধ্যে পার্থক্য। )

কোনও বস্তুর উপর একটি সম্পত্তি বিদ্যমান থাকলে এটি সনাক্ত করার অন্য উপায় রয়েছে, যেমন hasOwnProperty পদ্ধতিতে:

if (obj.hasOwnProperty('foo')) {
  // your code here
}

এবং অপারেটর ইন:

if ('foo' in obj) {
  // your code here
}

শেষ দুইটির মধ্যে পার্থক্য হল যে hasOwnProperty পদ্ধতিটি সম্পত্তিটি শারীরিকভাবে বস্তুর উপর বিদ্যমান কিনা তা যাচাই করবে (সম্পত্তি উত্তরাধিকারসূত্রে প্রাপ্ত নয়)।

in অপারেটর প্রোটোটাইপ শৃঙ্খলে পৌঁছানোর সমস্ত বৈশিষ্ট্য পরীক্ষা করবে, উদাহরণস্বরূপ:

var obj = { foo: 'bar'};

obj.hasOwnProperty('foo'); // true
obj.hasOwnProperty('toString'); // false
'toString' in obj; // true

আপনি দেখতে পারেন যে , hasOwnProperty ফেরত toString এবং toString পদ্ধতিটি পরীক্ষা করার সময় in অপারেটরটি true ফেরত দেয়, এই পদ্ধতিটি প্রোটোটাইপ শৃঙ্খলে সংজ্ঞায়িত করা হয়, কারণ obj উত্তরাধিকারটি Object.prototype গঠন করে।


এই সহজ সমাধান কাজ করে, কিন্তু গভীর বস্তু চেক জন্য না।

function isset(str) {
    return window[str] !== undefined;
}

একটি পরিবর্তনশীল বিদ্যমান যদি এটি পরীক্ষার জন্য একটি প্রশংসনীয় বুলেটপ্রুফ সমাধান:

var setOrNot = typeof variable !== typeof undefined ? true : false;

দুর্ভাগ্যবশত, আপনি কেবল একটি ফাংশন এ এটি encapsulate করতে পারবেন না।

আপনি এমন কিছু করার কথা ভাবতে পারেন:

function isset(variable) {
    return typeof variable !== typeof undefined ? true : false;
}

যাইহোক, যদি পরিবর্তনশীল variable সংজ্ঞায়িত না করা হয় তবে এটি একটি রেফারেন্স ত্রুটি উত্পন্ন করবে, কারণ আপনি একটি অ-বিদ্যমান পরিবর্তনশীলের সাথে একটি ফাংশনে যেতে পারছেন না:

Uncaught রেফারেন্স ত্রুটি: Foo সংজ্ঞায়িত করা হয় না

অন্যদিকে, এটি আপনাকে ফাংশন পরামিতিগুলি অনির্ধারিত কিনা তা পরীক্ষা করার অনুমতি দেয়:

var a = '5';

var test = function(x, y) {
    console.log(isset(x));
    console.log(isset(y));
};

test(a);

// OUTPUT :
// ------------
// TRUE
// FALSE

ফাংশন test বরাবর y জন্য কোনও মান প্রেরণ করা হয় না, তবে আমাদের isset ফাংশন এই প্রেক্ষাপটে পুরোপুরি কাজ করে, কারণ ফাংশন test undefined মান হিসাবে পরিচিত।


বয়স পুরানো থ্রেড, কিন্তু এখানে সমতুল্য isset() চালানোর জন্য একটি নতুন উপায়।

উত্তর

ব্যাখ্যা জন্য নিচে দেখুন। উল্লেখ্য আমি StandardJS সিনট্যাক্স ব্যবহার

উদাহরণ ব্যবহার

// IMPORTANT pass a function to our isset() that returns the value we're
// trying to test(ES6 arrow function)
isset(() => some) // false

// Defining objects
let some = { nested: { value: 'hello' } }

// More tests that never throw an error
isset(() => some) // true
isset(() => some.nested) // true
isset(() => some.nested.value) // true
isset(() => some.nested.deeper.value) // false

// Less compact but still viable except when trying to use `this` context
isset(function () { return some.nested.deeper.value }) // false

উত্তর ফাংশন

/**
 * Checks to see if a value is set.
 *
 * @param {Function} accessor Function that returns our value
 */
function isset (accessor) {
  try {
    // Note we're seeing if the returned value of our function is not
    // undefined
    return typeof accessor() !== 'undefined'
  } catch (e) {
    // And we're able to catch the Error it would normally throw for
    // referencing a property of undefined
    return false
  }
}

ব্যাখ্যা

পিএইচপি

মনে রাখবেন যে পিএইচপি-তে আপনি যে কোনও ভেরিয়েবলের যে কোনও ভেরিয়েবলকে রেফারেন্স করতে পারেন - অ্যারে হিসাবে অ-অ্যারে অ্যাক্সেস করার চেষ্টা এমনকি একটি সহজ true বা false :

// Referencing an undeclared variable
isset($some); // false

$some = 'hello';

// Declared but has no depth(not an array)
isset($some); // true
isset($some['nested']); // false

$some = ['nested' => 'hello'];

// Declared as an array but not with the depth we're testing for
isset($some['nested']); // true
isset($some['nested']['deeper']); // false

জাতীয়

জাভাস্ক্রিপ্টে, আমাদের কাছে এই স্বাধীনতা নেই, যদি আমরা একই কাজ করি তবে আমরা সর্বদা একটি ত্রুটি পাবেন কারণ JS আমাদের isset() ফাংশনে এটি isset() আগেই deeper মান অ্যাক্সেস করার চেষ্টা করছে তাই ...

// Common pitfall answer(ES6 arrow function)
const isset = (ref) => typeof ref !== 'undefined'

// Same as above
function isset (ref) { return typeof ref !== 'undefined' }

// Referencing an undeclared variable will throw an error, so no luck here
isset(some) // Error: some is not defined

// Defining a simple object with no properties - so we aren't defining
// the property `nested`
let some = {}

// Simple checking if we have a declared variable
isset(some) // true

// Now trying to see if we have a top level property, still valid
isset(some.nested) // false

// But here is where things fall apart: trying to access a deep property
// of a complex object; it will throw an error
isset(some.nested.deeper) // Error: Cannot read property 'deeper' of undefined
//         ^^^^^^ undefined

আরো ব্যর্থ বিকল্প:

// Any way we attempt to access the `deeper` property of `nested` will
// throw an error
some.nested.deeper.hasOwnProperty('value') // Error
//   ^^^^^^ undefined

Object.hasOwnProperty('value', some.nested.deeper) // Error
//                                  ^^^^^^ undefined

// Same goes for typeof
typeof some.nested.deeper !== 'undefined' // Error
//          ^^^^^^ undefined

এবং কিছু কার্যকরী বিকল্প যা দ্রুত অনাদায়ী পেতে পারে:

// Wrap everything in try...catch
try { isset(some.nested.deeper) } catch (e) {}
try { typeof some.nested.deeper !== 'undefined' } catch (e) {}

// Or by chaining all of the isset which can get long
isset(some) && isset(some.nested) && isset(some.nested.deeper) // false
//                        ^^^^^^ returns false so the next isset() is never run

উপসংহার

অন্যান্য উত্তর সব - যদিও সবচেয়ে কার্যকর ...

  1. ভেরিয়েবলটি অনির্ধারিত নয় কিনা তা যাচাই করার জন্য আপনি কেবলমাত্র চেক করছেন কিনা যা কিছু ব্যবহারের ক্ষেত্রে জরিমানা তবে এখনও একটি ত্রুটি নিক্ষেপ করতে পারে
  2. অনুমান করুন যে আপনি শুধুমাত্র একটি শীর্ষ স্তরের সম্পত্তি অ্যাক্সেস করার চেষ্টা করছেন, যা আবার কিছু ব্যবহারের ক্ষেত্রে জরিমানা
  3. আপনি পিএইচপি এর isset() সম্পর্কিত আদর্শ পদ্ধতির চেয়ে কম ব্যবহার করতে বাধ্য হন isset()
    উদাহরণস্বরূপ isset(some, 'nested.deeper.value')
  4. eval() ব্যবহার করুন eval() যা কাজ করে কিন্তু আমি ব্যক্তিগতভাবে এড়ানো

আমি এটা অনেক আচ্ছাদিত মনে করি। আমার উত্তরগুলিতে কিছু পয়েন্ট রয়েছে যা আমি স্পর্শ করি না কারণ তারা - যদিও প্রাসঙ্গিক - প্রশ্নটির অংশ নয়। প্রয়োজন থাকলে, চাহিদা অনুসারে আমি আরো কিছু প্রযুক্তিগত দিকনির্দেশের লিঙ্কগুলির সাথে আমার উত্তর আপডেট করতে পারি।

আমি এই সময়ে অনেক সময় waäay কাটিয়েছি তাই আশা এটা মানুষের সাহায্য করে।

পড়ার জন্য আপনাকে ধন্যবাদ!


বস্তুর পথটি একটি স্ট্রিং হিসাবে সরবরাহ করুন, তারপরে আপনি এই স্ট্রিংটি একটি পাথে ভাঙ্গতে পারেন এবং প্রত্যেকটি পুনরাবৃত্তির সাথে বস্তুর উপরে ওভাররাইট করার সময় প্রতিটি ধাপে hasOwnProperty সমাধান করুন।

আপনি ES6 পরিবেশে কোডিং করা হয়, এই স্ট্যাকওভারফ্লো Ques দেখুন ।

var a;

a = {
    b: {
        c: 'e'
    }
};

function isset (obj, path) {
    var stone;

    path = path || '';

    if (path.indexOf('[') !== -1) {
        throw new Error('Unsupported object path notation.');
    }

    
    path = path.split('.');
    
    do {
        if (obj === undefined) {
            return false;
        }

        stone = path.shift();
        
        if (!obj.hasOwnProperty(stone)) {
            return false;
        }
        
        obj = obj[stone];
        
    } while (path.length);

    return true;
}

console.log(
    isset(a, 'b') == true,
    isset(a, 'b.c') == true,
    isset(a, 'b.c.d') == false,
    isset(a, 'b.c.d.e') == false,
    isset(a, 'b.c.d.e.f') == false
);


function isset(variable) {
    try {
        return typeof eval(variable) !== 'undefined';
    } catch (err) {
        return false;
    }
}

if (!('foo' in obj)) {
  // not set.
}


(typeof SOMETHING) !== 'undefined'

ব্যবহৃত যখন এটি লিখতে খুব দীর্ঘ। কিন্তু আমরা ফাংশনে typeof কীওয়ার্ড প্যাকেজ করতে পারছি না, কারন ফাংশনটির আগে একটি ত্রুটি নিক্ষিপ্ত হবে, যেমন:

function isdef($var) {
    return (typeof $var) !== 'undefined';
}

isdef(SOMETHING); ///// thrown error: SOMETHING is not defined

তাই আমি একটি উপায় figured:

function isdef($type) {
    return $type !== 'undefined';
}

isdef(typeof SOMETHING);

এটি পৃথক ভেরিয়েবল (ভেরিয়েবলগুলি যা সর্বদাই বিদ্যমান নয়) এবং বস্তুর বৈশিষ্ট্যগুলি (অ-বিদ্যমান বৈশিষ্ট্য) উভয়ের সাথে কাজ করতে পারে। এবং পিএইচপি এর চেয়ে আরও 7 টি অক্ষর isset






isset