খালি অ্যারে একই সাথে সত্য এবং মিথ্যা বলে মনে হচ্ছে


201

খালি অ্যারেগুলি সত্য তবে সেগুলিও মিথ্যের সমান।

var arr = [];
console.log('Array:', arr);
if (arr) console.log("It's true!");
if (arr == false) console.log("It's false!");
if (arr && arr == false) console.log("...what??");

আমি অনুমান করি যে এটি সাম্যতা অপারেটর দ্বারা পরিচালিত অন্তর্নিহিত রূপান্তরটির কারণে।

পর্দার আড়ালে কী চলছে কেউ ব্যাখ্যা করতে পারবেন?


1
এখানে একটি অনুরূপ থ্রেড যা এই সমস্যাটিতে কিছুটা আলোকপাত করা উচিত: স্ট্যাকওভারফ্লো
রিওন উইলিয়ামস

2
দ্রষ্টব্য, এটি arr == trueসত্য ;-)
মাইকেল ক্রেলিন - হ্যাকার

5
বাহ ... ঠিক যখন আপনি ভেবেছিলেন আপনার এই সমস্ত কিছু বন্ধ রয়েছে।
হার্পো

3
জাভাস্ক্রিপ্ট টাইপ জবরদস্তি ডাব্লুটিএফ এড়ানোর জন্য, কঠোর সমতা অপারেটরটি ব্যবহার করুন ===। তারপরে যদি আপনি কোনও অ্যারের শূন্যতা পরীক্ষা করতে চান তবে ব্যবহার করুনarr === []
DjebbZ

17
আপনি যদি কোনও অ্যারের শূন্যতার পরীক্ষা করতে চান তবে arr === []এটি কখনই মিথ্যা হিসাবে ফিরে আসবে, যেহেতু ডান দিকটি একটি নতুন অ্যারে ইনস্ট্যান্ট করছে এবং বাম দিকের ভেরিয়েবলটি আপনি সবে তৈরি কিছু উল্লেখ করতে পারে না। শূন্যতার পরীক্ষা করে দেখা উচিত arr.length === 0
কাইল বেকার

উত্তর:


274

আপনি এখানে বিভিন্ন জিনিস পরীক্ষা করছেন।

if (arr) অবজেক্টে কল করা হয়েছে (অ্যারে হ'ল জেজেটে অবজেক্টের উদাহরণ) বস্তুটি উপস্থিত কিনা তা যাচাই করবে এবং সত্য / মিথ্যা প্রত্যাবর্তন করবে।

আপনি যখন ফোন করবেন তখন এই বস্তুর মান এবং আদিম মানের if (arr == false)তুলনা করুন । অভ্যন্তরীণভাবে বলা হয়, যা খালি স্ট্রিং দেয় ।falsearr.toString()""

এটি toStringঅ্যারে রিটার্নে কল করা কারণ Array.join(), এবং খালি স্ট্রিং জাভাস্ক্রিপ্টের মিথ্যা মানগুলির মধ্যে একটি।


2
আপনি ব্যাখ্যা করতে পারেন কেন Boolean([])ফিরে true?
ডেভি

11
এটি কনভেনশন দ্বারা, জেএসে যদি বস্তুগুলি বুলিয়ানকে জোর করা হয় তবে সেগুলি সর্বদা সত্যে জোর করা হয়। "বুলিয়ান প্রসঙ্গ" টেবিলটি এখানে দেখুন: javascript.info/tutorial/object- রূপান্তর
নিকি

2
@ জাভাস্ক্রিপ্টের সমস্ত বস্তু সত্যবাদী, সুতরাং কোনও বস্তুকে বুলিয়ান রূপান্তরিত করা সত্য। 2ality.com/2013/08/objects-truthy.html
থমসন

62

লাইন সম্পর্কিত:

if (arr == false) console.log("It's false!");

সম্ভবত এগুলি সাহায্য করবে:

console.log(0 == false) // true
console.log([] == 0) // true
console.log([] == "") // true

আমার বিশ্বাস যা ঘটছে তা হ'ল বুলিয়ান একটি বস্তুর (বাম দিকে) তুলনা falseকরার 0জন্য জোর করে । অবজেক্টটি একটি স্ট্রিংয়ের সাথে জোর করা হয় (খালি স্ট্রিং)। তারপরে, খালি স্ট্রিংটি একটি সংখ্যাতে জোর করা হয়, পাশাপাশি শূন্য। এবং তাই চূড়ান্ত তুলনা হয় 0== 0, যা হয় true

সম্পাদনা করুন: ঠিক কীভাবে এটি কাজ করে সে সম্পর্কে বিশদের জন্য বিশিষ্টটির এই বিভাগটি দেখুন ।

নিয়ম # 1 থেকে এখানে কী হচ্ছে তা এখানে:

১. যদি টাইপ (এক্স) প্রকার (y) থেকে পৃথক হয় তবে 14 ধাপে যান।

পরবর্তী নিয়মটি প্রয়োগ হয় # 19:

19. যদি টাইপ (y) বুলিয়ান হয় তবে তুলনাটির ফলাফলটি x == টনবার (y) প্রদান করুন return

ফল ToNumber(false)হয় 0, তাই আমরা এখন আছে:

[] == 0

আবার, নিয়ম # 1 আমাদের # 14 ধাপে উঠতে বলেছে, তবে পরবর্তী পদক্ষেপ যা আসলে প্রয়োগ হয় তা হল # 21:

21. যদি টাইপ (এক্স) অবজেক্ট হয় এবং টাইপ (y) হয় স্ট্রিং বা সংখ্যা হয়, ToPrimitive (x) == y এর তুলনার ফলাফলটি ফিরিয়ে দিন।

এর ফলাফলটি ToPrimitive([])খালি স্ট্রিং, সুতরাং আমাদের কাছে এখন:

"" == 0

আবার, নিয়ম # 1 আমাদের # 14 ধাপে উঠতে বলেছে, তবে পরবর্তী পদক্ষেপ যা আসলে প্রয়োগ হয় তা হল # 17:

17. যদি টাইপ (x) স্ট্রিং হয় এবং টাইপ (y) হয় নম্বর হয়, তবে টনবার (x) == y এর তুলনার ফলাফলটি ফিরিয়ে দিন।

ফল ToNumber("")হল 0, যা আমাদের সঙ্গে ছেড়ে:

0 == 0

এখন, উভয় মানেরই একই ধরণ রয়েছে, তাই পদক্ষেপগুলি # 1 থেকে # 7 অবধি অব্যাহত থাকে যা বলে:

X. x যদি y এর সমান সংখ্যার মান হয় তবে সত্য আসুন।

সুতরাং, আমরা ফিরে true

সংক্ষেপে:

ToNumber(ToPrimitive([])) == ToNumber(false)

2
দুর্দান্ত রেফারেন্স! বিভ্রান্তি এড়ানোর জন্য, এটি উল্লেখ করা সহায়ক হতে পারে যে "পরবর্তী নিয়মটি প্রযোজ্য # 19" যদিও নিয়ম # 1 বলছে "14 ধাপে যান", কারণ 14-18 পদক্ষেপগুলি ধরণের ধরণের সাথে মেলে না মান তুলনা করা হচ্ছে।
শিন শিম

2
সুন্দর ব্যাখ্যা। এটি আমার কাছে বিস্মিত হয় যে খালি অ্যারেগুলিকে সত্যবাদী বলে মনে করা হয়, 0 টি মিথ্যা এবং তবুও [] == 0সত্য। আপনার অনুমানের ব্যাখ্যার ভিত্তিতে এটি কীভাবে ঘটে তা আমি পেয়েছি তবে এটি যৌক্তিক দৃষ্টিকোণ থেকে অদ্ভুত ভাষার আচরণের মতো বলে মনে হচ্ছে।
বিঘ_29

7

ওয়েনের উত্তরের পরিপূরক করতে এবং কেন ToPrimitive([])ফিরে আসে তা ব্যাখ্যা করার চেষ্টা করার ""জন্য, 'কেন' প্রশ্নের দুটি সম্ভাব্য ধরণের উত্তর বিবেচনা করা মূল্যবান। প্রথম ধরণের উত্তরটি হ'ল: "কারণ স্পেসিফিকেশনটি জানায় যে জাভাস্ক্রিপ্টটি এভাবে আচরণ করবে" " ইএস 5 স্পেসে , বিভাগ 9.1 , যা টোপ্রিমিটভের ফলাফলটিকে কোনও অবজেক্টের জন্য একটি ডিফল্ট মান হিসাবে বর্ণনা করে:

Objectচ্ছিক ইঙ্গিত PreferredType পাস করে কোনও অবজেক্টের ডিফল্ট মানটি [[DefaultValue]] অবজেক্টের অভ্যন্তরীণ পদ্ধতিতে কল করে পুনরুদ্ধার করা হয়।

বিভাগ 8.12.8[[DefaultValue]] পদ্ধতিটি বর্ণনা করে । এই পদ্ধতিটি আর্গুমেন্ট হিসাবে একটি "ইঙ্গিত" নেয় এবং ইঙ্গিতটি স্ট্রিং বা সংখ্যা হতে পারে। কিছু বিবরণ দিয়ে বিতরণ করে বিষয়টি সরল করার জন্য, যদি ইঙ্গিতটি স্ট্রিং [[DefaultValue]]হয় toString()তবে তা যদি বিদ্যমান থাকে তবে তার মান প্রদান করে এবং কোনও আদিম মান দেয় এবং অন্যথায় এর মান প্রদান করে valueOf()। ইঙ্গিতটি নম্বর, অগ্রাধিকার হলে toString()এবং valueOf()যাতে বিপরীত হয় valueOf()প্রথম বলা হয় এবং তার মান যদি এটি একটি আদিম আছে। সুতরাং, বস্তুর জন্য নির্দিষ্ট PreferredType [[DefaultValue]]এর ফলাফল প্রদান করে toString()বা valueOf()নির্ভর করে এবং এই ফাংশনগুলি আদিম মানগুলি ফিরিয়ে দেয় কিনা।

ডিফল্ট valueOf()অবজেক্ট পদ্ধতিটি কেবলমাত্র বস্তুকে নিজেই ফেরত দেয়, যার অর্থ যে কোনও শ্রেণি যদি না ডিফল্ট পদ্ধতিটিকে ওভাররাইড না করে কেবল অবজেক্টকেই valueOf()ফেরত দেয়। এই ক্ষেত্রে Array[].valueOf()বস্তু []নিজেই ফেরত দেয়। যেহেতু কোনও Arrayবস্তু আদিম নয়, [[DefaultValue]]ইঙ্গিতটি অপ্রাসঙ্গিক: একটি অ্যারের জন্য ফেরতের মান হবে toString()

ডেভিড ফ্লানাগনের জাভাস্ক্রিপ্ট উদ্ধৃত করার জন্য : সংজ্ঞা নির্দেশিকা , যাইহোক , একটি দুর্দান্ত বই যা এই ধরণের প্রশ্নের উত্তর পাওয়ার জন্য সবার প্রথম স্থান হওয়া উচিত:

এই অবজেক্ট-টু-নম্বর রূপান্তরটির বিশদটি ব্যাখ্যা করে যে একটি খালি অ্যারে 0 নম্বরে রূপান্তর করে এবং কেন একটি একক উপাদান সহ একটি অ্যারে এছাড়াও একটি সংখ্যায় রূপান্তর করতে পারে। অ্যারেগুলি ডিফল্ট মান ওফ () পদ্ধতিতে উত্তরাধিকার সূত্রে প্রাপ্ত যা আদিম মানের পরিবর্তে কোনও বস্তুকে ফেরত দেয়, তাই অ্যারে-টু-নম্বর রূপান্তর টসস্ট্রিং () পদ্ধতিতে নির্ভর করে। খালি অ্যারেগুলি খালি স্ট্রিংয়ে রূপান্তর করে। এবং খালি স্ট্রিং 0 নম্বরে রূপান্তরিত করে একটি একক উপাদান সহ একটি অ্যারে একই স্ট্রিংতে রূপান্তর করে যা একটি উপাদান করে। যদি অ্যারেতে একটি একক সংখ্যা থাকে তবে সেই সংখ্যাটি একটি স্ট্রিংয়ে রূপান্তরিত হয় এবং তারপরে কোনও সংখ্যায় ফিরে আসে।

"কারণ" অনুমান বলে "ব্যতীত" কেন "প্রশ্নের দ্বিতীয় ধরণের উত্তর, কেন নকশার দৃষ্টিকোণ থেকে আচরণটি বোঝায় তা সম্পর্কে কিছু ব্যাখ্যা দেয়। এই ইস্যুতে আমি কেবল অনুমান করতে পারি। প্রথমত, কেউ কীভাবে একটি সংখ্যাকে একটি অ্যারে রূপান্তর করতে পারে? কেবলমাত্র বোধগম্য সম্ভাবনা যা আমি ভাবতে পারি তা হ'ল একটি শূন্য অ্যারে 0 এবং কোনও খালি অरेকে 1 তে রূপান্তর করা। এর বাইরে, অ্যারে.ওয়ালুওফ () এর জন্য একটি বোধগম্য আদিম রিটার্ন মান সম্পর্কে চিন্তা করা শক্ত। সুতরাং যে কেউ তর্ক করতে পারে যে এটি কেবলমাত্র Array.valueOf()ডিফল্ট হওয়া এবং toString()অ্যারেটি নিজেই ফিরিয়ে আনা আরও বেশি বোধ করে, টোপ্রিমিটাইভ দ্বারা ব্যবহৃত ফলাফল হতে পারে। এটি একটি সংখ্যার চেয়ে একটি অ্যারেটিকে স্ট্রিংয়ে রূপান্তর করতে আরও বেশি অর্থবোধ করে।

তদুপরি, ফ্লানাগান উদ্ধৃতি দ্বারা ইঙ্গিত হিসাবে, এই নকশার সিদ্ধান্তটি কিছু ধরণের উপকারী আচরণকে সক্ষম করে। এই ক্ষেত্রে:

var a = [17], b = 17, c=1;
console.log(a==b);      // <= true
console.log(a==c);      // <= false

এই আচরণ আপনাকে সংখ্যার সাথে একটি একক-উপাদান অ্যারের তুলনা করতে এবং প্রত্যাশিত ফলাফল পেতে দেয়।


এই উত্তরের জন্য ধন্যবাদ, এটি যথেষ্ট বিস্তারিত ব্যাখ্যা যে প্রশ্নের অভাব রয়েছে।
এস্তাস ফ্লাস্ক

3
console.log('-- types: undefined, boolean, number, string, object --');
console.log(typeof undefined);  // undefined
console.log(typeof null);       // object
console.log(typeof NaN);        // number
console.log(typeof false);      // boolean
console.log(typeof 0);          // number
console.log(typeof "");         // string
console.log(typeof []);         // object
console.log(typeof {});         // object

console.log('-- Different values: NotExist, Falsy, NaN, [], {} --');
console.log('-- 1. NotExist values: undefined, null have same value --');
console.log(undefined == null); // true

console.log('-- 2. Falsy values: false, 0, "" have same value --');
console.log(false == 0);        // true
console.log(false == "");       // true
console.log(0 == "");           // true

console.log('-- 3. !NotExist, !Falsy, and !NaN return true --');
console.log(!undefined);        // true
console.log(!null);             // true

console.log(!false);            // true
console.log(!"");               // true
console.log(!0);                // true

console.log(!NaN);              // true

console.log('-- 4. [] is not falsy, but [] == false because [].toString() returns "" --');
console.log(false == []);       // true
console.log([].toString());     // ""

console.log(![]);               // false

console.log('-- 5. {} is not falsy, and {} != false, because {}.toString() returns "[object Object]" --');
console.log(false == {});       // false
console.log({}.toString());     // [object Object]

console.log(!{});               // false

console.log('-- Comparing --');
console.log('-- 1. string will be converted to number or NaN when comparing with a number, and "" will be converted to 0 --');
console.log(12 < "2");          // false
console.log("12" < "2");        // true
console.log("" < 2);            // true

console.log('-- 2. NaN can not be compared with any value, even if NaN itself, always return false --');
console.log(NaN == NaN);        // false

console.log(NaN == null);       // false
console.log(NaN == undefined);  // false
console.log(0 <= NaN);          // false
console.log(0 >= NaN);          // false
console.log(undefined <= NaN);  // false
console.log(undefined >= NaN);  // false
console.log(null <= NaN);       // false
console.log(null >= NaN);       // false

console.log(2 <= "2a");         // false, since "2a" is converted to NaN
console.log(2 >= "2a");         // false, since "2a" is converted to NaN

console.log('-- 3. undefined can only == null and == undefined, and can not do any other comparing even if <= undefined --');
console.log(undefined == null);         // true
console.log(undefined == undefined);    // true

console.log(undefined == "");           // false
console.log(undefined == false);        // false
console.log(undefined <= undefined);    // false
console.log(undefined <= null);         // false
console.log(undefined >= null);         // false
console.log(0 <= undefined);            // false
console.log(0 >= undefined);            // false

console.log('-- 4. null will be converted to "" when <, >, <=, >= comparing --');
console.log(12 <= null);        // false
console.log(12 >= null);        // true
console.log("12" <= null);      // false
console.log("12" >= null);      // true

console.log(0 == null);         // false
console.log("" == null);        // false

console.log('-- 5. object, including {}, [], will be call toString() when comparing --');
console.log(12 < {});           // false, since {}.toString() is "[object Object]", and then converted to NaN
console.log(12 > {});           // false, since {}.toString() is "[object Object]", and then converted to NaN
console.log("[a" < {});         // true, since {}.toString() is "[object Object]"
console.log("[a" > {});         // false, since {}.toString() is "[object Object]"
console.log(12 < []);           // false, since {}.toString() is "", and then converted to 0
console.log(12 > []);           // true, since {}.toString() is "", and then converted to 0
console.log("[a" < []);         // false, since {}.toString() is ""
console.log("[a" > []);         // true, since {}.toString() is ""

console.log('-- 6. According to 4 and 5, we can get below weird result: --');
console.log(null < []);         // false
console.log(null > []);         // false
console.log(null == []);        // false
console.log(null <= []);        // true
console.log(null >= []);        // true

2

যদি (আরআর) হয় তবে এটির সর্বদা মূল্যায়ন করা হয় (টুবুলিয়ান) যদি সত্য হয় যদি আরার কোনও বস্তু হয় বস্তু হয় তবে জাভাস্ক্রিপ্টের সমস্ত বস্তু সত্যবাদী । (নাল একটি বস্তু নয়!)

[] == falseপুনরুক্তি পদ্ধতির মূল্যায়ন করা হয়। প্রথমদিকে, যদি এক পাশের ==আদিম হয় এবং অন্যটি বস্তু হয় তবে এটি প্রথমে বস্তুকে আদিম রূপান্তর করে, তারপরে উভয় পক্ষকে দুটি সংখ্যায় রূপান্তর করে যদি উভয় পক্ষের stringস্ট্রিং না থাকে তবে স্ট্রিং তুলনা ব্যবহৃত হয়। সুতরাং তুলনাটি পুনরায় করা হয় - [] == false-> '' == false-> 0 == 0-> এর মতো true


2

উদাহরণ:

const array = []
const boolValueOfArray = !!array // true

কারণ এটি ঘটে

ToNumber(ToPrimitive([])) == ToNumber(false)  
  1. []খালি Arrayঅবজেক্ট → ToPrimitive([])→ "" → ToNumber("")→ →0
  2. ToNumber(false) → 0
  3. 0 == 0 → সত্য

1

উপাদান (নির্বিশেষে যদি 0, মিথ্যা বা অন্য খালি অ্যারে) সহ একটি বিন্যাস, সবসময় কাছে সমাধান করা trueসারাংশ সমতা তুলনা ব্যবহার ==

1. [] == false; // true, because an empty array has nothing to be truthy about
2. [2] == false; // false because it has at least 1 item
3. [false] == false; // also false because false is still an item
4. [[]] == false; // false, empty array is still an item

তবে একটি কঠোর সমতার তুলনা ব্যবহার করে ===আপনি ভেরিয়েবলের সামগ্রীর পাশাপাশি এর ডেটা ধরণের মূল্যায়ন করার চেষ্টা করছেন যে কারণ:

1. [] === false; // false, because an array (regardless of empty or not) is not strictly comparable to boolean `false`
2. [] === true; // false, same as above, cannot strictly compare [] to boolean `true`
3. [[]] === false; // true, because see #1

-1

আপনি বর্তমানে জাভাস্ক্রিপ্ট অ্যারেটিকে একটি নতুন অ্যারে list = []উল্লেখ করে, বর্তমানে রেফারেন্স করা অ্যারের উপাদানগুলি ব্যবহার করে বা মুছে ফেলতে পারেন list.length = 0

উত্স: জাভাস্ক্রিপ্ট খালি অ্যারে


-2

নকআউট.জেএস ম্যাপিং প্লাগইনটি ব্যবহার করার চেষ্টা করার সময় উপরের কোনওটিই আমাকে সাহায্য করেনি, সম্ভবত যেহেতু "খালি অ্যারে" সত্যই খালি নেই।

আমি ব্যবহার করে শেষ করেছি: data-bind="if: arr().length"যা কৌশলটি করেছে।

এটি নকশির জন্য নির্দিষ্ট, ওপির প্রশ্ন নয়, তবে এটি সম্ভবত অন্য কাউকে একই পরিস্থিতিতে ব্রাউজ করতে সহায়তা করবে।


এই উত্তর সম্পর্কিত নয়
fauverism

কেবলমাত্র স্পর্শকাতরভাবে, অস্বীকৃত হিসাবে :)
ডেমোরিগেটো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.