("Foo" === নতুন স্ট্রিং ("foo")) জাভাস্ক্রিপ্টে মিথ্যা কেন মূল্যায়ন করে?


98

স্ট্রিংয়ের মানগুলির তুলনা করার সময় আমি সমস্ত সময় === (ট্রিপল সমান, কঠোর তুলনা) ব্যবহার শুরু করতে যাচ্ছিলাম তবে এখন আমি এটি দেখতে পেয়েছি

"foo" === new String("foo")

এটি মিথ্যা এবং এর সাথে একই:

var f = "foo", g = new String("foo");
f === g; // false

অবশ্যই:

f == g; // true

সুতরাং, স্ট্রিং তুলনা করার জন্য সর্বদা == ব্যবহার করার পরামর্শ দেওয়া হয়, বা তুলনা করার আগে সর্বদা ভেরিয়েবলগুলিকে স্ট্রিংয়ে রূপান্তর করা হয়?


6
সম্ভবত কারণ fooখাঁটি স্ট্রিং এবং new String("foo")এটি অবজেক্ট স্ট্রিং
ড্যানিলো ভ্যালেন্টে


6
এটি new Stringব্যবহারের পরিবর্তে (সম্পূর্ণ অর্থহীন) দিয়ে স্ট্রিং তৈরি না করার পরামর্শ দেওয়া হয়==
ইসাইলাইল

4
কেন কেউ new String("foo")প্রথমে জাভাস্ক্রিপ্টের মতো কনস্ট্রাক্ট ব্যবহার করতে চাইবে ? আমি
কোডটিতে

4
আপনি String(obj)যখন আপনার "স্ট্রিং" পরামিতিটি পেয়েছেন তখন আপনি একটি বাক্সযুক্ত স্ট্রিংটিকে আদিম হিসাবে রূপান্তর করতে ব্যবহার করতে পারেন । ("foo" === String(new String("foo"))) === true
অরেঞ্জডগ

উত্তর:


126

"foo"একটি স্ট্রিং আদিম । (এই ধারণাটি সি # বা জাভাতে বিদ্যমান নেই)

new String("foo") বক্সড স্ট্রিং অবজেক্ট।

===অপারেটর প্রিমিটিভের এবং বস্তুর উপর ভিন্নভাবে আচরণ করবে
আদিমদের (একই ধরণের) তুলনা করার সময়, ===যদি উভয়েরই একই মান হয় তবে সত্যটি ফিরে আসবে।

বস্তুর তুলনা করার সময়, ===যদি তারা একই বস্তুকে (রেফারেন্সের সাথে তুলনা করে) উল্লেখ করে তবেই সত্যটি ফিরে আসবে। এইভাবে new String("a") !== new String("a"),।

আপনার ক্ষেত্রে, ===মিথ্যা ফেরত দেয় কারণ অপারেশনগুলি বিভিন্ন ধরণের হয় (একটি আদিম এবং অন্যটি একটি বস্তু)।


আদিমরা মোটেও বস্তু নয়। অপারেটর ফিরবে না প্রিমিটিভের জন্য।
typeof"object"

আপনি যখন কোনও আদিম (কোনও বস্তু হিসাবে এটি ব্যবহার করে) কোনও সম্পত্তি অ্যাক্সেস করার চেষ্টা করবেন, জাভাস্ক্রিপ্ট ভাষা এটি একটি বস্তুর সাথে বাক্স করবে এবং প্রতিবার একটি নতুন অবজেক্ট তৈরি করবে। এটি স্পেসিফিকেশন বর্ণিত হয় ।

এ কারণেই আপনি আদিমগুলিতে সম্পত্তি রাখতে পারবেন না:

var x = "a";
x.property = 2;
alert(x.property) //undefined

প্রতিবার আপনি লেখার সময় x.propertyএকটি আলাদা বক্সযুক্ত Stringঅবজেক্ট তৈরি হবে।


33
+1 typeof "foo"; // "string",typeof new String("foo"); // "object"
সাম্পসন

4
আকর্ষণীয়, আমি ভেবেছিলাম স্ট্রিংগুলি জেএসের মধ্যে বস্তু।
ক্যামেরন মার্টিন

4
@ সরফরাজ: প্রায় সব কিছু। nullএবং সম্পর্কে ভুলবেন না undefined

4
if( Object(a) !== a ) { //it's a primitive }
ইসাইলিজা

4
জাভাতে আদিম / .নেট নেই
মার্সেলো দে জেন

34

ব্যবহার ===,

  • একটি বস্তু নিজেই অন্য উল্লেখ ব্যতীত কখনই সমান নয়।

  • একটি আদিম সমান যখন অন্য প্রিমিটের সাথে তুলনা করা হয় যদি তাদের ধরণ এবং মান একই হয়।


4
new String("foo") === new String("foo")হল :false
রকেট হাজমত

10

newশব্দ একটি অপরাধমূলক এখানে ( যথারীতি , আমি পারে) ...

আপনি যখন ব্যবহার করবেন new, আপনি অবজেক্টের সাথে কাজ করার ইচ্ছাটি স্পষ্টভাবে প্রকাশ করুন । এটি আপনার জন্য আশ্চর্যজনক হতে পারে তবে এটি:

var x = new String('foo');
var y = new String('foo');
x === y; 

... তোমাকে একটা শক্তিশালী দেবে false। এটি সহজ: তুলনা করা বস্তুর অভ্যন্তর নয়, তবে বস্তুর উল্লেখগুলি। এবং তারা অবশ্যই সমান নয়, কারণ দুটি পৃথক বস্তু তৈরি হয়েছিল।

আপনি সম্ভবত যা ব্যবহার করতে চান তা হ'ল রূপান্তর :

var x = String('foo');
var y = String('foo');
x === y;

... এবং এটি আপনাকে প্রত্যাশিত trueহিসাবে দেবে, ফলস্বরূপ, যাতে আপনি foosচিরকালের জন্য আপনার সমান নিয়ে আনন্দিত এবং উন্নতি করতে পারেন । )


4
এটি ব্যবহার সম্পর্কে দ্রুত প্রশ্ন। আপনি 'নতুন' কীওয়ার্ড ছাড়াই স্ট্রিংকে (একজন নির্মাণকারী?) কল করছেন এর অর্থ এই নয় যে আপনি স্ট্রিং কনস্ট্রাক্টরের মধ্যে নির্ধারিত কোনও সম্পত্তি সহ সুযোগকে দূষিত করবেন? বা এটি কি ঘটায় না কারণ কনস্ট্রাক্টর স্থানীয় কোড হয়? অন্য কথায়, ধরুন স্ট্রিং ফাংশনটিতে "this.a = 1;" রয়েছে - মানে হল আপনার ফাংশন / বস্তু এখন একটি সম্পত্তি একটি = 1. হবে
মাইকেল বাটলার

আমি মনে করি (বক্সিং কন্সট্রাক্টর) প্রতিটি ফাংশন প্রথমে এর প্রসঙ্গটি পরীক্ষা করে - এবং যদি এটি 'নবীন' না হয় (যেমন, একটি প্রোটোটাইপ অবজেক্ট) না হয়, ঠিক এখনই রূপান্তর পদ্ধতিতে স্যুইচ করে। স্ট্রিংয়ের ক্ষেত্রে এটি toString()পদ্ধতি হবে, উদাহরণস্বরূপ।
রায়না 77 ই


2

নোড.জেএস আরইপিএল থেকে (ইনস্টল করা থাকলে কমান্ড-লাইনের "নোড"):

> "foo" === (new String("foo")).valueOf()
true
> "foo" === new String("foo")
false
> typeof("foo")
'string'
> typeof(new String("foo"))
'object'
> typeof((new String("foo")).valueOf())
'string'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.