জাভাস্ক্রিপ্টে ",,," == অ্যারে (4) কেন?


119

আপনার দোভাষী / কনসোলটি বুট করুন এবং তুলনাটি চেষ্টা করুন

> ",,," == Array(4)
True

কেন? প্রথমে আমি ভেবেছিলাম সম্ভবত যেহেতু আপনি ",,," চারটি অক্ষরের অ্যারে হিসাবে '\ 0' সমাপ্তির টুকরো দিয়ে ভাবতে পারেন, সে কারণ হতে পারে

> "..." == Array(4)

"মিথ্যা" প্রত্যাবর্তন করে। তাহলে কেন? আমি জানি এটি জাভাস্ক্রিপ্টে হাঁসের টাইপিংয়ের কিছু আইডিয়াসক্র্যাটিক বিট, তবে এই আচরণটি কীভাবে अधोरेखित করে তা কেবল কৌতূহলী। জেড শ এর দুর্দান্ত উপস্থাপনাটি এখানে বিটিডব্লিউ থেকে প্রকাশ করেছেন


14
সি বাদে কয়েকটি ভাষা প্রোগ্রামারকে দৃশ্যমান উপায়ে শূন্য-সমাপ্তি ব্যবহার করে।
জোয়

7
যদি আমি জিজ্ঞাসা করতে পারি, এই আবিষ্কারের কারণ কী?
সোমকিটসন

1
@ সোমিককিটেনস জেড শ আমার ভিডিওতে আমি যুক্ত হওয়া ভিডিওতে এটি স্পষ্টভাবে উল্লেখ করেছেন (জাভাস্ক্রিপ্টের সমালোচনা হিসাবে)। চিয়ার্স!
ZenLikeThat

5
এটাও (চমত্কার সুপরিচিত) "ওয়াত" আলাপ উল্লেখ করা হয় @SomeKittens, রুবি এবং JavaScript মধ্যে কিছু quirks দেখাচ্ছে destroyallsoftware.com/talks/wat
Cronco

5
এটি সর্বদা ===পরিবর্তে ব্যবহার করার অনেকগুলি ভাল কারণগুলির মধ্যে একটি ==
wprl

উত্তর:


178

কারণ ডান হাত অপারেণ্ড একটি স্ট্রিং এবং স্ট্রিং প্রতিনিধিত্ব রূপান্তরিত হয় Array(4) হ'ল ,,,:

> Array(4).toString()
  ",,,"

আপনি যদি অ্যারে কনস্ট্রাক্টর ফাংশনটি ব্যবহার করেন এবং একটি সংখ্যা পাস করেন তবে এটি অ্যারের দৈর্ঘ্যটি সেই সংখ্যায় সেট করে। সুতরাং আপনি বলতে পারেন যে আপনার কাছে চারটি খালি সূচক রয়েছে (একই [,,,]) এবং অ্যারের ডিফল্ট স্ট্রিং উপস্থাপনা হ'ল এর উপাদানগুলির একটি কমা-বিচ্ছিন্ন তালিকা:

> ['a','b','c'].toString()
  "a,b,c"

তুলনা কীভাবে কাজ করে তা বিভাগে বর্ণিত সুনির্দিষ্টতার ১১.৯.৩ । সেখানে আপনি দেখতে পাবেন ( x == y):

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

(অ্যারেগুলি জাভাস্ক্রিপ্টে অবজেক্টস)

এবং আপনি যদি ToPrimitiveপদ্ধতিটি অনুসরণ করেন তবে অবশেষে এটি দেখতে পাবে toString


2
ঠিক আছে, এখন এই সব আমার জন্য বোধগম্য। ধন্যবাদ।
ZenLikeThat

6
কোনটি, পরিবর্তে, কারণ অ্যারেগুলি স্ট্রাইফাই করে যেমন তারা ব্যবহার করছে Array.join(",")
সন্ধ্যা

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


31

ব্যবহার করার চেষ্টা করুন =====জাভাস্ক্রিপ্টে ব্যবহার করার সময় , এটি ভেরিয়েবলগুলি castালার চেষ্টা করবে, সুতরাং এটি এর মতো সমস্যাগুলির দিকে নিয়ে যাবে। কনসোলটি Array(4)স্ট্রিং উপস্থাপনায় (যেমন Array(4).toString) কাস্ট করছে ",,,"। কমাগুলি থাকার কারণটি হ'ল .toString()ফাংশনটি তাদের অ্যারেতে আলাদা আইটেম যুক্ত করে।

নীচে স্নিপেট দেখুন:

document.write( Array(4).toString() );


18

এর কারণ হল Array(4)4 টি খালি মানের অ্যারে সূচনা করে, একটি ==স্পষ্টত রূপান্তরিত হয়, তাই:

 ",,," == Array(4)

 ",,," == Array(4).toString()

 ",,," == ["", "", "", ""] // note 3 commas for 4 values

 ",,," == ["", "", "", ""].toString()

সব একই।

==মানগুলির সাথে তুলনা করার আগে অন্তর্নিহিত ধরণের রূপান্তরগুলি করে, যার ফলে অনাকাঙ্ক্ষিত ফলাফল হতে পারে। ===প্রকার এবং মান পরীক্ষা করতে ব্যবহার করুন ।


5

একটি স্ট্রিংয়ের সাথে একটি অ্যারের তুলনা করা তুলনা করার আগে অ্যারেটিকে একটি স্ট্রিংয়ে জোর করে। একটি খালি 4-এলিমেন্ট অ্যারেকে স্ট্রিংয়ে চাপিয়ে দেওয়া ঠিক সেই স্ট্রিং দেয়।


4

আমি প্রথম ভেবেছিলাম এটি "প্রোটোটাইপ" দিয়ে কিছু ছিল ... তবে কিছুটা তদন্তের পরে আমি একটি দুঃখজনক সিদ্ধান্তে পৌঁছেছি ...

স্পষ্টতই এটি একটি অভ্যন্তরীণ এবং আরও অস্পষ্ট জেএস জিনিস যা অনেক যুক্তিযুক্ত নয় ...

ঠিক করার চেষ্টা করুন

Array(4)==Array(4)

এবং প্রকারভেদে কোনও জোর করে না ...

Array(4)===Array(4)

এবং আপনি মিথ্যা পাবেন

আপনি এটি জানেন null==null, null===nullএবং এমনকি undefined==undefinedএবংundefined===undefined আয় 'সত্য' ... তাই ... একটু অস্পষ্ট হয় ...

Array(4)==[,,,] সত্য হওয়া উচিত


ZEE, অ্যারে (4) == [,,,] সত্য হবে না। আমরা যদি বস্তুর সাথে আদিমতার সাথে তুলনা করি, তবে বস্তুটি আদিম রূপান্তরিত হবে। এটি স্ট্রিংকে () কল করার কারণটি জানায়।
দেবস্যাথিশ

অ্যারে (এক্স) এর কনস্ট্রাক্টরের ঠিকানা হওয়া উচিত ... যাইহোক, কোনও সিস্টেমে (কোন ধরণের সিস্টেমে বিরক্ত করবেন না), <ভিডেন্টিটি_এক্স> === <বিবৃতি_ এক্স> সর্বদা সত্য হতে হবে!
ZEE
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.