কোডম্যাশ ২০১২-এর জন্য 'ওয়াট' আলোচনায় উল্লিখিত এই উদ্ভট জাভাস্ক্রিপ্ট আচরণগুলির ব্যাখ্যা কী?


753

CodeMash 2012 জন্য 'ওয়াত' আলাপ মূলত রুবি এবং JavaScript সঙ্গে কয়েক উদ্ভট quirks পয়েন্ট আউট।

আমি http://jsfiddle.net/fe479/9/ এ ফলাফলের একটি জেএসফিডেল তৈরি করেছি ।

জাভাস্ক্রিপ্টের সাথে সম্পর্কিত আচরণগুলি (যেমন আমি রুবি জানি না) নীচে তালিকাভুক্ত করা হয়েছে।

আমি জেএসফিডেলে দেখতে পেলাম যে আমার কিছু ফলাফল ভিডিওর সাথে মিলে না এবং আমি কেন তা নিশ্চিত নই। তবে আমি জানতে আগ্রহী যে কীভাবে জাভাস্ক্রিপ্ট প্রতিটি ক্ষেত্রে পর্দার আড়ালে কাজ করছে।

Empty Array + Empty Array
[] + []
result:
<Empty String>

+জাভাস্ক্রিপ্টে অ্যারে ব্যবহার করার সময় অপারেটর সম্পর্কে আমি বেশ কৌতূহলী । এটি ভিডিওর ফলাফলের সাথে মেলে।

Empty Array + Object
[] + {}
result:
[Object]

এটি ভিডিওর ফলাফলের সাথে মেলে। এখানে কি হচ্ছে? কেন এটি একটি জিনিস। +অপারেটর কী করে ?

Object + Empty Array
{} + []
result:
[Object]

এটি ভিডিওর সাথে মেলে না। ভিডিওটি প্রস্তাব দেয় যে ফলাফলটি 0, যদিও আমি পেয়েছি [অবজেক্ট]।

Object + Object
{} + {}
result:
[Object][Object]

এটি ভিডিওর সাথেও মেলে না এবং কীভাবে একটি দুটি ভেরিয়েবলের আওতায় আনা যায়? হতে পারে আমার জেএসফিডেল ভুল।

Array(16).join("wat" - 1)
result:
NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN

এর মধ্যে +1 ফলাফল করা হচ্ছে wat1wat1wat1wat1...

আমার সন্দেহ হয় এটি কেবল সরল আচরণ যা NaN এর স্ট্রিং ফলাফল থেকে একটি সংখ্যা বিয়োগ করার চেষ্টা করছে।


4
আমি এখানে যেমন বর্ণনা করছি The} + [] মূলত একমাত্র কৌশল এবং বাস্তবায়ন নির্ভরশীল , কারণ এটি বিবৃতি হিসাবে বা একটি অভিব্যক্তি হিসাবে পার্স হওয়ার উপর নির্ভর করে। আপনি কোন পরিবেশে পরীক্ষা করছেন (আমি ফায়ারফো এবং ক্রোমে প্রত্যাশিত 0 পেয়েছি তবে নোডজেজে "[অবজেক্ট অবজেক্ট]" পেয়েছি)?
hugomg

1
আমি উইন্ডোজ on-এ ফায়ারফক্স 9.0.1 চালাচ্ছি, এবং জেএসফিডেল এটিকে [অবজেক্ট]
12-

@ মিসিংনো আমি নোডজেএস আরপিএল-এ 0
পেয়েছি

41
Array(16).join("wat" - 1) + " Batman!"
নিক জনসন

1
@ মিসিংনো এখানে প্রশ্ন পোস্ট করেছেন , তবে জন্য {} + {}
আয়নিক বিজাউ

উত্তর:


1479

আপনি যে ফলাফলগুলি দেখছেন (এবং দেখেছেন বলে মনে করা হচ্ছে) তার ব্যাখ্যাগুলির একটি তালিকা এখানে। রেফারেন্স আমি ব্যবহার করছি থেকে এসেছ ECMA-262 মান

  1. [] + []

    সংযোজন অপারেটরটি ব্যবহার করার সময়, বাম এবং ডান উভয় ক্রিয়াকলাপ প্রথমে আদিম রূপান্তরিত হয় ( .611.6.1 )। অনুযায়ী §9.1 , একটি আদিম আয় একটি বস্তু (এই ক্ষেত্রে একটি অ্যারে) তার ডিফল্ট মান, যা একটি বৈধ সঙ্গে অবজেক্টের জন্য রূপান্তর toString()পদ্ধতি কলিং ফলাফল object.toString()( §8.12.8 )। অ্যারেগুলির জন্য এটি কল করার মতো array.join()( .415.4.4.2 )। একটি ফাঁকা অ্যারে যোগদান করে একটি খালি স্ট্রিংয়ের ফলাফল হয়, সুতরাং সংযোজন অপারেটরের # 7 পদক্ষেপ দুটি খালি স্ট্রিংয়ের সংমিশ্রণটি প্রদান করে, যা খালি স্ট্রিং।

  2. [] + {}

    অনুরূপ [] + [], উভয় অপারেশন প্রথমে আদিমগুলিতে রূপান্তরিত হয়। "অবজেক্ট অবজেক্টস" (§15.2) এর জন্য, এটি আবার কল করার ফলাফল object.toString()যা অ-নাল, অপরিজ্ঞাত অবজেক্টগুলির জন্য "[object Object]"( .215.2.4.2 )।

  3. {} + []

    {}এখানে একটি অবজেক্ট হিসেবে পার্স করা হয় না, কিন্তু এর পরিবর্তে (একটি খালি ব্লক হিসাবে §12.1 দীর্ঘ আপনি যে বিবৃতি অত্যাচার করছি না যেমন একটি অভিব্যক্তি হতে, কিন্তু যে সম্পর্কে আরো পরে, অন্তত)। খালি ব্লকের রিটার্ন মানটি খালি, সুতরাং সেই বিবৃতিটির ফলাফল একই +[]। ইউনারী +অপারেটর ( §11.4.6 ) আয় ToNumber(ToPrimitive(operand))। আমরা ইতিমধ্যে জানেন, ToPrimitive([])খালি স্ট্রিং, এবং অনুযায়ী §9.3.1 , ToNumber("")0।

  4. {} + {}

    পূর্ববর্তী কেসের মতো, প্রথমটি {}খালি রিটার্ন মান সহ একটি ব্লক হিসাবে পার্স করা হয়। আবার, +{}হিসাবে একই ToNumber(ToPrimitive({}))এবং ToPrimitive({})হয় "[object Object]"(দেখুন [] + {})। সুতরাং ফলাফল পেতে +{}, আমরা ToNumberস্ট্রিং উপর প্রয়োগ করতে হবে "[object Object]".39.3.1 থেকে পদক্ষেপগুলি অনুসরণ করার সময় , আমরা NaNফলস্বরূপ পেতে পারি :

    ব্যাকরণ সম্প্রসারণ যেমন স্ট্রিং ব্যাখ্যা না পারেন, তাহলে StringNumericLiteral , তারপর ফল ToNumber হয় NaN

  5. Array(16).join("wat" - 1)

    অনুযায়ী §15.4.1.1 এবং §15.4.2.2 , Array(16)দৈর্ঘ্য 16 সঙ্গে একটি নতুন অ্যারে তৈরি করে যুক্তি যোগদানের জন্য মান পেতে, §11.6.2 # 5 এবং # 6 প্রদর্শনী ধাপ আমরা একটি উভয় operands রূপান্তর করতে আছে নম্বর ব্যবহার করে ToNumberToNumber(1)সহজভাবে হয় 1 ( §9.3 ), যেহেতু ToNumber("wat")আবার NaNঅনুযায়ী §9.3.1.611.6.2 এর 7 ধাপ অনুসরণ করে , §11.6.3 এটি নির্দেশ করে

    অপরেন্দ্র যদি হয় NaN হয় তবে ফলাফলটি NaN হয়

    আর্গুমেন্ট প্রাপ্ত করতে তাই Array(16).joinহয় NaN। .415.4.4.5 ( Array.prototype.join) অনুসরণ করে , আমাদেরকে ToStringআর্গুমেন্টটি কল করতে হবে , যা "NaN"( .89.8.1 ):

    যদি এমএএনএন হয় তবে স্ট্রিংটি ফিরে আসুন"NaN"

    .415.4.4.5 এর দশম ধাপ অনুসরণ করে , আমরা 15 টি পুনরাবৃত্তি "NaN"এবং খালি স্ট্রিংয়ের কনটেন্টেশন পাই যা আপনি যে ফলাফলটি দেখছেন তার সমান। যুক্তি হিসাবে "wat" + 1পরিবর্তে ব্যবহার করার সময় "wat" - 1, সংযোজন অপারেটর একটি সংখ্যায় 1রূপান্তরিত "wat"করার পরিবর্তে একটি স্ট্রিংয়ে রূপান্তর করে, তাই এটি কার্যকরভাবে কল করে Array(16).join("wat1")

আপনি কেন {} + []মামলার জন্য বিভিন্ন ফলাফল দেখছেন তা: ফাংশন আর্গুমেন্ট হিসাবে এটি ব্যবহার করার সময়, আপনি বিবৃতিটিকে এক্সপ্রেশন স্টেটমেন্ট হিসাবে বাধ্য করছেন , যা {}খালি ব্লক হিসাবে পার্স করা অসম্ভব করে তোলে , তাই এটি পরিবর্তে একটি খালি অবজেক্ট হিসাবে পার্স করা হয়েছে আক্ষরিক।


2
তাহলে [] +1 => "1" এবং [] -1 => -1 কেন?
রব এলসনার

4
@ রোবেসনার []+1ঠিক একইভাবে যুক্তি অনুসরণ করেছেন []+[]ঠিক যেমন আরএইচএস অপারেণ্ডের সাথে 1.toString()। জন্য []-1ব্যাখ্যা দেখুন "wat"-1বিন্দুতে 5. যে মনে রাখুন ToNumber(ToPrimitive([]))0 (বিন্দু 3)।
ভেন্টোরো

4
এই ব্যাখ্যাটি অনুপস্থিত / প্রচুর বিবরণ বাদ দেয়। উদাহরণস্বরূপ "কোনও বস্তুকে (এই ক্ষেত্রে একটি অ্যারে) আদিম রূপান্তরিত করা তার ডিফল্ট মানটি প্রদান করে, যা বৈধ টুস্ট্রিং () পদ্ধতিযুক্ত অবজেক্টের জন্য অবজেক্টকে কল করার ফলস্বরূপ (স্ট্রিং ()) সম্পূর্ণরূপে অনুপস্থিত যে [] এর মান হল প্রথমে বলা হয়, তবে যেহেতু রিটার্ন মান আদিম নয় (এটি একটি অ্যারে), তার পরিবর্তে [] এর টস্ট্রিং ব্যবহৃত হয়। আমি প্রকৃত indepth ব্যাখ্যার পরিবর্তে এটি দেখার পরামর্শ দিচ্ছি 2ality.com/2012/01/object-plus-object.html
jhahav

30

এটি একটি উত্তরের চেয়ে একটি মন্তব্য বেশি, তবে কিছু কারণে আমি আপনার প্রশ্নে মন্তব্য করতে পারি না। আমি আপনার জেএসফিডাল কোডটি সংশোধন করতে চেয়েছিলাম। তবে, আমি এটি হ্যাকার নিউজে পোস্ট করেছি এবং কেউ পরামর্শ দিয়েছে যে আমি এটি এখানে পোস্ট করব ost

জেএসফিডাল কোডে সমস্যাটি হ'ল ({})(বন্ধনীগুলির অভ্যন্তরে বন্ধনীগুলি খোলার) একই নয় {}(কোডের একটি লাইনের সূচনার সাথে ব্রেসিং খোলার )। সুতরাং আপনি টাইপ করার out({} + [])সময় {}আপনি এমন কিছু হতে বাধ্য করছেন যা এটি টাইপ করার সময় নয় {} + []। এটি জাভাস্ক্রিপ্টের সামগ্রিক 'ওয়াট'-নেসের অংশ।

মূল ধারণাটি ছিল সাধারণ জাভাস্ক্রিপ্ট এই দুটি রূপকেই অনুমতি দিতে চেয়েছিল:

if (u)
    v;

if (x) {
    y;
    z;
}

এটি করার জন্য, উদ্বোধনী ধনুর্বন্ধনী দ্বারা দুটি ব্যাখ্যা করা হয়েছিল: 1. এটি প্রয়োজন হয় না এবং এটি যে কোনও জায়গায় প্রদর্শিত হতে পারে ।

এটি একটি ভুল পদক্ষেপ ছিল। রিয়েল কোডের কোথাও মাঝখানে উপস্থিত একটি খোলার ব্রেস নেই, এবং দ্বিতীয় কোডের চেয়ে প্রথম ফর্মটি ব্যবহার করার সময় রিয়েল কোডটি আরও ভঙ্গুর হতে থাকে। (আমার শেষ কাজটিতে প্রায় প্রতি মাসে একবার, আমি আমার সহকর্মীর ডেস্কে কল করব যখন আমার কোডে তাদের পরিবর্তনগুলি কাজ করছে না, এবং সমস্যাটি হ'ল তারা কোঁকড়া যুক্ত না করে "যদি" তে একটি লাইন যুক্ত করতেন) ধনুর্বন্ধনী। আমি অবশেষে কেবল অভ্যাসটি গ্রহণ করেছি যে কোঁকড়ানো ধনুর্বন্ধনী সবসময় প্রয়োজন হয়, এমনকি আপনি যখন কেবল একটি লাইন লিখেন))

ভাগ্যক্রমে অনেক ক্ষেত্রে eval () জাভাস্ক্রিপ্টের পুরো ওয়াট-নেসের প্রতিলিপি তৈরি করবে। জেএসফিডাল কোডটি পড়তে হবে:

function out(code) {
    function format(x) {
        return typeof x === "string" ?
            JSON.stringify(x) : x;
    }   
    document.writeln('&gt;&gt;&gt; ' + code);
    document.writeln(format(eval(code)));
}
document.writeln("<pre>");
out('[] + []');
out('[] + {}');
out('{} + []');
out('{} + {}');
out('Array(16).join("wat" + 1)');
out('Array(16).join("wat - 1")');
out('Array(16).join("wat" - 1) + " Batman!"');
document.writeln("</pre>");

[এছাড়াও অনেক বছরের মধ্যে আমি প্রথমবারের মতো ডকুমেন্ট লিখেছি rit রাইটেলন, এবং ডকুমেন্ট. রাইটেলন () এবং এভাল () উভয়কেই জড়িত কিছু লেখার জন্য আমি কিছুটা নোংরা লেখা অনুভব করছি]]


15
This was a wrong move. Real code doesn't have an opening brace appearing in the middle of nowhere- আমি একমত নই (সাজানো): আমি প্রায়শই এর আগে ব্লকে সি এর স্কোপ ভেরিয়েবলের জন্য প্রায়শই ব্যবহার করেছি । এমবেডেড সি করার সময় এই অভ্যাসটি কিছুক্ষণ পিছনে নেওয়া হয়েছিল যেখানে স্ট্যাকের ভেরিয়েবলগুলি স্থান গ্রহণ করে, তাই যদি তাদের আর প্রয়োজন না হয় তবে আমরা ব্লকের শেষে স্থানটি মুক্ত করতে চাই। তবে ECMAScript কেবল ফাংশন ()।} ব্লকের মধ্যে রয়েছে within সুতরাং, আমি ধারণাটি ভুল হওয়ার সাথে একমত নই, আমি সম্মত হয়েছি যে জেএসের বাস্তবায়ন ( সম্ভবত ) ভুল।
জেস টেলফোর্ড

4
@ জেসটেলফর্ড ES6- এ আপনি letব্লক-স্কোপড ভেরিয়েবলগুলি ঘোষণার জন্য ব্যবহার করতে পারেন ।
ওরিওল

19

আমি ভেন্টোরোর সমাধানটিকে দ্বিতীয় @ আপনি যদি চান তবে +এর অপারেশনগুলিকে কীভাবে রূপান্তরিত করা যায় সে সম্পর্কে আপনি আরও বিশদে যেতে পারেন ।

প্রথম পদক্ষেপ (§9.1): প্রিমিটিভের উভয় operands রূপান্তর করুন (আদিম মান undefined, null, Booleans, সংখ্যা, স্ট্রিং; সব অন্যান্য মান অ্যারে এবং ফাংশন সহ, বস্তু)। যদি কোনও অপারেন্ড ইতিমধ্যে আদিম হয়, আপনি শেষ হয়ে গেল। যদি তা না হয় তবে এটি একটি অবজেক্ট objএবং নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করা হয়েছে:

  1. কল করুন obj.valueOf()। যদি এটি কোনও আদিম ফেরত দেয় তবে আপনি সম্পন্ন হয়ে যান। এর প্রত্যক্ষ দৃষ্টান্ত Objectএবং অ্যারেগুলি নিজেরাই ফিরে আসে, সুতরাং আপনি এখনও শেষ করেন নি।
  2. কল করুন obj.toString()। যদি এটি কোনও আদিম ফেরত দেয় তবে আপনি সম্পন্ন হয়ে যান। {}এবং []উভয় একটি স্ট্রিং ফিরে, তাই আপনি সম্পন্ন।
  3. অন্যথায়, নিক্ষেপ a TypeError

তারিখগুলির জন্য, পদক্ষেপ 1 এবং 2 অদলবদল করা হয়। আপনি নিম্নলিখিত রূপান্তর আচরণ পর্যবেক্ষণ করতে পারেন:

var obj = {
    valueOf: function () {
        console.log("valueOf");
        return {}; // not a primitive
    },
    toString: function () {
        console.log("toString");
        return {}; // not a primitive
    }
}

মিথস্ক্রিয়া ( Number()প্রথমে আদিতে তারপর সংখ্যায় রূপান্তরিত হয়):

> Number(obj)
valueOf
toString
TypeError: Cannot convert object to primitive value

দ্বিতীয় পদক্ষেপ (§11.6.1): অপারেন্ডগুলির মধ্যে একটি স্ট্রিং হয়, অন্য অপারেন্ডও স্ট্রিংয়ে রূপান্তরিত হয় এবং ফলাফল দুটি স্ট্রিংকে সংযুক্ত করে উত্পাদিত হয়। অন্যথায়, উভয় অপারেন্ড সংখ্যায় রূপান্তরিত হয় এবং এগুলি যুক্ত করে ফলাফল উত্পন্ন হয়।

রূপান্তর প্রক্রিয়াটির আরও বিশদ ব্যাখ্যা: জাভাস্ক্রিপ্টে?} + {What কী? "


13

আমরা স্পেসিফিকেশনটি উল্লেখ করতে পারি এবং এটি দুর্দান্ত এবং সবচেয়ে নির্ভুল, তবে বেশিরভাগ ক্ষেত্রে নিম্নলিখিত বিবৃতি দিয়ে আরও বোধগম্যভাবে ব্যাখ্যা করা যেতে পারে:

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

সুতরাং আমরা বলতে পারি যে:

  • [] + []একই হিসাবে String([]) + String([])যা একই '' + ''। আমি উপরে উল্লিখিত করেছি যে +(সংযোজন) সংখ্যাগুলির জন্যও বৈধ, তবে জাভাস্ক্রিপ্টে কোনও অ্যারের বৈধ সংখ্যা উপস্থাপনা নেই, সুতরাং তার পরিবর্তে স্ট্রিংগুলির সংযোজন ব্যবহৃত হয়।
  • [] + {}একই হিসাবে String([]) + String({})যা একই'' + '[object Object]'
  • {} + []। এটির আরও ব্যাখ্যা পাওয়ার যোগ্য (ভেন্টোরো উত্তর দেখুন)। সেক্ষেত্রে কোঁকড়ানো ধনুর্বন্ধনীগুলি কোনও বস্তু হিসাবে নয়, খালি ব্লক হিসাবে গণ্য করা হয়, সুতরাং এটি একইরূপে পরিণত হয় +[]। ইউনারি +কেবল সংখ্যা দিয়ে কাজ করে, তাই প্রয়োগটি একটি সংখ্যা বের করার চেষ্টা করে []। প্রথমে এটি চেষ্টা করে valueOfযা অ্যারেগুলির ক্ষেত্রে একই বস্তুটি ফেরত দেয়, তারপরে এটি সর্বশেষ অবলম্বনটি চেষ্টা করে: toStringফলাফলকে সংখ্যায় রূপান্তর করে । আমরা এটি লিখতে পারি +Number(String([]))যা একই হিসাবে +Number('')একই হয় +0
  • Array(16).join("wat" - 1)বিয়োগ -কেবল সংখ্যাগুলির সাথে কাজ করে, সুতরাং এটির Array(16).join(Number("wat") - 1)মতো "wat":, কোনও বৈধ সংখ্যায় রূপান্তর করা যায় না। আমরা গ্রহণ NaN, এবং কোন গাণিতিক অপারেশন NaNসঙ্গে ফলাফল NaN, তাই আমরা আছে: Array(16).join(NaN)

0

পূর্বে ভাগ করা হয়েছে কি বোতাম করতে।

এই আচরণের অন্তর্নিহিত কারণটি আংশিকভাবে জাভাস্ক্রিপ্টের দুর্বল টাইপের প্রকৃতির কারণে। উদাহরণস্বরূপ, ১ + "২" এক্সপ্রেশনটি দ্ব্যর্থক, যেহেতু অপারেন্ড ধরণের (ইনট, স্ট্রিং) এবং (ইনট ইনট) ভিত্তিতে দুটি সম্ভাব্য ব্যাখ্যা রয়েছে:

  • ব্যবহারকারী দুটি স্ট্রিং সংশ্লেষ করতে ইচ্ছুক, ফলাফল: "12"
  • ব্যবহারকারী দুটি সংখ্যা যুক্ত করতে চান, ফলাফল: 3

এভাবে বিভিন্ন ধরণের ইনপুট প্রকারের সাথে আউটপুট সম্ভাবনা বৃদ্ধি পায়।

সংযোজন অ্যালগরিদম

  1. কোরেস আদিম মানগুলিতে কাজ করে

জাভাস্ক্রিপ্টের আদিমগুলি স্ট্রিং, সংখ্যা, নাল, অপরিজ্ঞাত এবং বুলিয়ান (প্রতীক শীঘ্রই ES6 এ আসছে)। অন্য কোনও মান হ'ল একটি অবজেক্ট (যেমন অ্যারে, ফাংশন এবং অবজেক্টস)। বস্তুকে আদিম মানগুলিতে রূপান্তর করার জন্য জবরদস্তি প্রক্রিয়াটি এভাবে বর্ণিত হয়েছে:

  • অবজেক্ট.ভ্যালুওফ () চালু করা হলে যদি কোনও প্রাথমিক মান ফিরে আসে তবে এই মানটি ফিরিয়ে দিন, অন্যথায় চালিয়ে যান

  • অবজেক্ট.টোস্ট্রিং () চালু করা হলে যদি কোনও আদিম মান ফিরে আসে তবে এই মানটি ফিরিয়ে দিন, অন্যথায় চালিয়ে যান

  • একটি টাইপরর ফেলে দিন

দ্রষ্টব্য: তারিখের মানগুলির জন্য, মানটিOf এর পূর্বে অর্ডারটি টুস্ট্রিংয়ের অনুরোধ জানানো হয়।

  1. যদি কোনও অপরেন্ড মান একটি স্ট্রিং হয়, তারপরে একটি স্ট্রিং সংক্ষেপণ করুন

  2. অন্যথায়, উভয় অপারেন্ডকে তাদের সংখ্যাগত মানতে রূপান্তর করুন এবং তারপরে এই মানগুলি যুক্ত করুন

জাভাস্ক্রিপ্টে বিভিন্ন ধরণের জবরদস্তি মূল্যগুলি জানার ফলে বিভ্রান্তিকর ফলাফলগুলি আরও পরিষ্কার করতে সহায়তা করে। নীচে জোর টেবিল দেখুন

+-----------------+-------------------+---------------+
| Primitive Value |   String value    | Numeric value |
+-----------------+-------------------+---------------+
| null            | null            | 0             |
| undefined       | undefined       | NaN           |
| true            | true            | 1             |
| false           | false           | 0             |
| 123             | 123             | 123           |
| []              | “”                | 0             |
| {}              | “[object Object]” | NaN           |
+-----------------+-------------------+---------------+

এটি জেনে রাখা ভাল যে জাভাস্ক্রিপ্টের + অপারেটরটি বাম-সহযোগী হয় কারণ এটি নির্ধারণ করে যে একের বেশি + অপারেশন জড়িত আউটপুট কী হবে।

এইভাবে 1 + "2" এর উপকারটি "12" দেবে কারণ স্ট্রিংয়ের সাথে জড়িত কোনও সংযোজন সবসময় স্ট্রিং কনকেন্টেশনে ডিফল্ট থাকে।

আপনি এই ব্লগ পোস্টে আরও উদাহরণ পড়তে পারেন (আমি এটি লিখেছি তা অস্বীকার)।

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