[1,2] + [3,4] = "1,23,4" জাভাস্ক্রিপ্টে কেন?


405

আমি একটি অ্যারের উপাদানগুলি অন্যটিতে যুক্ত করতে চেয়েছিলাম, তাই আমি এটি চেষ্টা করেছি:

[1,2] + [3,4]

এটি এর সাথে প্রতিক্রিয়া জানিয়েছিল:

"1,23,4"

কি হচ্ছে?


1
এখানে এই বিষয় সম্পর্কিত একটি প্রশ্ন এখানে রয়েছে: stackoverflow.com/questions/1724255/why-does-2-2-in- javascript
— জাভি

29
আহ-হা-হা, সাধুবাদী সাক্ষাত্কারকারক এমন কিছুর মতো জিজ্ঞাসা করতে পারেন - এটি কী ফিরে আসবে [1,2] + [5,6,7] [1,2]। কেন?
— শাবঙ্ক

9
আমি মনে করি [1,2] + [3,4] সতর্কতার পরে ('কৃপণ') পরে ফায়ারব্যাগে এই সপ্তাহে সর্বাধিক মূল্যায়িত অভিব্যক্তি হয়ে উঠেছে।
— ওকেন

6
তোমার দর্শন লগ মজা ? [] + [], {} + [], {} + {}, এবং [] + {} চেষ্টা করুন
— ইন্ট্রিপিড

1
@ শ্যাবুনক - কেন [5,6,7][1,2]এটি ব্যাখ্যা করার জন্য যত্নশীল 7কারণ এটি দ্বিতীয় অ্যারেতে শেষ আইটেমটি ব্যবহার করে। ওও
— vsync

উত্তর:


518

+অপারেটর অ্যারে জন্য সংজ্ঞায়িত করা হয় না ।

যা ঘটে তা হ'ল জাভাস্ক্রিপ্ট অ্যারেগুলিকে স্ট্রিংগুলিতে রূপান্তরিত করে এবং সেগুলিকে সম্মতি দেয়।

 

হালনাগাদ

যেহেতু এই প্রশ্নটি এবং ফলস্বরূপ আমার উত্তরটি অনেক মনোযোগ পাচ্ছে আমি মনে করি অপারেটরটি সাধারণভাবে কীভাবে আচরণ করে সে সম্পর্কে একটি সংক্ষিপ্ত বিবরণ দেওয়া দরকারী এবং প্রাসঙ্গিক হবে +।

সুতরাং, এখানে এটি যায়।

E4X এবং বাস্তবায়ন-নির্দিষ্ট স্টাফ বাদ দিয়ে জাভাস্ক্রিপ্টে (ES5 হিসাবে) 6 বিল্ট-ইন ডেটা প্রকার রয়েছে :

  1. অনির্দিষ্ট
  2. খালি
  3. বুলিয়ান
  4. সংখ্যা
  5. দড়ি
  6. উদ্দেশ্য

মনে রাখবেন যে typeof কিছুটা বিভ্রান্তিমূলকভাবে object নুল এবং functionকলযোগ্য বস্তুর জন্য ফিরে আসে , নুল আসলে কোনও বস্তু নয় এবং কঠোরভাবে বলা হয়, স্পেসিফিকেশন-অনুসারে জাভাস্ক্রিপ্ট বাস্তবায়নে সমস্ত ফাংশনকে অবজেক্ট হিসাবে বিবেচনা করা হয়।

এটি ঠিক - জাভাস্ক্রিপ্টে এর মতো কোনও আদিম অ্যারে নেই ; Arrayব্যথা কমিয়ে আনার জন্য কেবল কোনও অবজেক্টের উদাহরণ হিসাবে কিছু সিনট্যাকটিক চিনির সাথে ডাকা হয়।

বিভ্রান্তিতে আরও যুক্ত করা, মোড়ক সত্তা যেমন new Number(5), new Boolean(true)এবং new String("abc")সমস্ত objectধরণের, সংখ্যা নয়, বুলিয়ান বা স্ট্রিং যেমন প্রত্যাশা করে। তবুও পাটিগণিত অপারেটরদের জন্য Numberএবং Booleanসংখ্যা হিসাবে আচরণ করুন।

সহজ, হাহ? এই সমস্ত কিছু বাদ দিয়ে, আমরা নিজেই ওভারভিউতে যেতে পারি।

+অপারেন্ড প্রকারভেদে বিভিন্ন ফলাফলের ধরণ

            || undefined | null   | boolean | number | string | object |
=========================================================================
 undefined  || number    | number | number  | number | string | string | 
 null       || number    | number | number  | number | string | string | 
 boolean    || number    | number | number  | number | string | string | 
 number     || number    | number | number  | number | string | string | 
 string     || string    | string | string  | string | string | string | 
 object     || string    | string | string  | string | string | string | 

* Chrome13, FF6, Opera11 এবং IE9 এ প্রযোজ্য। অন্যান্য ব্রাউজার এবং সংস্করণগুলি পরীক্ষা করা পাঠকের জন্য অনুশীলন হিসাবে ছেড়ে গেছে।

দ্রষ্টব্য: সিএমএস দ্বারা নির্দেশিত হিসাবে Number, যেমন বস্তুর কিছু ক্ষেত্রে Booleanএবং কাস্টমগুলি +অপারেটর অগত্যা স্ট্রিং ফলাফল তৈরি করে না। এটি আদিম রূপান্তর থেকে বস্তুর প্রয়োগের উপর নির্ভর করে পৃথক হতে পারে। উদাহরণস্বরূপ var o = { valueOf:function () { return 4; } };মূল্যায়নের o + 2;উত্পাদন করে 6, একটি number, মূল্যায়ন o + '2'উত্পাদন করে '42', একটি string।

ওভারভিউ টেবিলটি কীভাবে উত্পন্ন হয়েছিল তা দেখতে http://jsfiddle.net/1obxuc7m/ দেখুন


244

জাভাস্ক্রিপ্টের +অপারেটরের দুটি উদ্দেশ্য রয়েছে: দুটি সংখ্যা যুক্ত করা, বা দুটি স্ট্রিংয়ে যোগদান করা। অ্যারেগুলির জন্য এটির একটি নির্দিষ্ট আচরণ নেই, সুতরাং এটি তাদের স্ট্রিংগুলিতে রূপান্তর করে এবং তারপরে যোগদান করে।

আপনি যদি একটি নতুন উত্পাদন করতে দুটি অ্যারে যোগ দিতে চান তবে পরিবর্তে এই .concatপদ্ধতিটি ব্যবহার করুন:

[1, 2].concat([3, 4]) // [1, 2, 3, 4]

আপনি যদি দক্ষতার সাথে এক উপাদান থেকে অন্য অ্যারেতে সমস্ত উপাদান যুক্ত করতে চান তবে আপনাকে .push পদ্ধতিটি ব্যবহার করতে হবে :

var data = [1, 2];

// ES6+:
data.push(...[3, 4]);
// or legacy:
Array.prototype.push.apply(data, [3, 4]);

// data is now [1, 2, 3, 4]

+অপারেটরের আচরণটি ECMA-262 5e ধারা 11.6.1 এ সংজ্ঞায়িত করা হয়েছে :

১১..6.১ সংযোজন অপারেটর (+)

সংযোজন অপারেটর হয় স্ট্রিং কনটেনটেশন বা সংখ্যাসূচক সংযোজন করে। উত্পাদন AdditiveExpression : AdditiveExpression + MultiplicativeExpressionনিম্নলিখিত হিসাবে মূল্যায়ন করা হয়:

  1. আসুন lrefমূল্যায়ন ফলাফল AdditiveExpression।
  2. যাক lvalহতে GetValue(lref)।
  3. আসুন rrefমূল্যায়ন ফলাফল MultiplicativeExpression।
  4. যাক rvalহতে GetValue(rref)।
  5. যাক lprimহতে ToPrimitive(lval)।
  6. যাক rprimহতে ToPrimitive(rval)।
  7. যদি Type(lprim)হয় Stringবা Type(rprim)হয় String, তবে
    1. স্ট্রিংটি ফিরিয়ে আনুন যা ToString(lprim)অনুসরণ করে সম্মিলিত ফলাফলToString(rprim)
  8. ছাড়াও অপারেশন প্রয়োগের ফলাফলের ফিরুন ToNumber(lprim)এবং ToNumber(rprim)। 11.6.3 নীচের নোট দেখুন।

আপনি দেখতে পাবেন যে প্রতিটি অপারেন্ড রূপান্তরিত হয়েছে ToPrimitive। আরও পড়ার মাধ্যমে আমরা জানতে পারি যে ToPrimitiveএই ফলাফলটি তৈরি করে সর্বদা অ্যারেগুলিকে স্ট্রিংয়ে রূপান্তরিত করে।


7
এই উত্তর হিসাবে +1 সমস্যাটি কেবল ব্যাখ্যা করে না, তবে কীভাবে এটি সঠিকভাবে করা যায় তাও ব্যাখ্যা করে।
— schnaader

3
এখানে একটু টিএমআই আছে, তবে আমি স্ক্যানাডারের সাথে একমত। সর্বোত্তম উত্তরগুলি সেই সমস্যা / ত্রুটি / আচরণ সম্পর্কে ব্যাখ্যা করে যা তারপরে জিজ্ঞাসা করা হয় তার পরে দেখানো হয় যে কীভাবে ফলাফল তৈরি করা যায়। +1
— ম্যাথেজুডনাম

1
আপনি কেন এর Array.prototype.push.apply(data, [3, 4])পরিবর্তে আরও ভার্বোজ ব্যবহার করবেন data.concat([3,4])?
— অ্যাস

5
@ আইভিলসারি: তারা বিভিন্ন উদ্দেশ্যে পরিবেশন করে। concatএকটি নতুন অ্যারে উত্পাদন করে , আর কলটি দক্ষতার সাথে একটি বিদ্যমান অ্যারে প্রসারিত করে ।
— জেরেমি ব্যাংকগুলি

1
আপনি [].push.apply(data, [3,4])সামান্য কম ভার্বোসিটির জন্য ব্যবহার করতে পারেন । এছাড়াও, এর মান পরিবর্তন করে এমন অন্যান্য ব্যক্তির সাথে প্রতিরোধী হওয়ার গ্যারান্টিযুক্ত Array।
— স্যাম টোবিন-হচস্টাড্ট

43

এটি দুটি অ্যারে যুক্ত করে যেন তারা স্ট্রিং করে ।

প্রথম অ্যারের জন্য স্ট্রিং প্রতিনিধিত্ব হবে "1,2" এবং দ্বিতীয়টি হবে "3,4" । সুতরাং যখন +সাইনটি পাওয়া যায়, এটি অ্যারের যোগফল যোগ করতে পারে না এবং তারপরে স্ট্রিং হিসাবে তাদের যুক্ত করতে পারে না।


হ্যাঁ, এটি মনের মধ্যে আগত প্রথম এবং অনন্য ব্যাখ্যা তবে এটি কি খুব অদ্ভুত আচরণ নয়? সম্ভবত কিছু অন্ধকার, অজানা অপারেশন / রূপান্তর হয়েছে এবং আমি অভ্যন্তরগুলি জানতে আগ্রহী: পি
— ওকেন

40

+Concats স্ট্রিং, তাই এটি স্ট্রিং অ্যারে পরিবর্তন করে।

[1,2] + [3,4]
'1,2' + '3,4'
1,23,4

অ্যারে একত্রিত করতে, ব্যবহার করুন concat।

[1,2].concat([3,4])
[1,2,3,4]

21

জাভাস্ক্রিপ্টে, বাইনারি সংযোজন অপারেটর ( +) উভয় সংখ্যাসূচক সংযোজন এবং স্ট্রিং উপসংহার সম্পাদন করে। যাইহোক, যখন এটির প্রথম আর্গুমেন্টটি কোনও সংখ্যা বা স্ট্রিং নয় তখন এটি এটিকে স্ট্রিংয়ে রূপান্তর করে (অতএব " 1,2") তখন এটি দ্বিতীয়টির সাথে একই হয় 3,4এবং তাদের " 1,23,4" এ সংযুক্ত করে।

পরিবর্তে অ্যারেগুলির "কনক্যাট" পদ্ধতিটি ব্যবহার করে দেখুন:

var a = [1, 2];
var b = [3, 4];
a.concat(b) ; // => [1, 2, 3, 4];

19

এটি পৃথক অ্যারেগুলিকে স্ট্রিংয়ে রূপান্তর করে, তারপরে স্ট্রিংগুলিকে একত্রিত করে।


14

দেখে মনে হচ্ছে জাভাস্ক্রিপ্ট আপনার অ্যারেগুলিকে স্ট্রিংগুলিতে পরিণত করছে এবং তাদের সাথে একত্রে যোগ দিচ্ছে। আপনি যদি একসাথে টিপলস যুক্ত করতে চান তবে আপনাকে একটি লুপ বা মানচিত্রের ফাংশন ব্যবহার করতে হবে।


14

[1,2]+[3,4] জাভাস্ক্রিপ্টে মূল্যায়ন সমান:

new Array( [1,2] ).toString() + new Array( [3,4] ).toString();

এবং তাই আপনার সমস্যার সমাধান করার জন্য, ভাল জিনিসটি হ'ল জায়গায় বা নতুন অ্যারে তৈরি না করে দুটি অ্যারে যুক্ত করা:

var a=[1,2];
var b=[3,4];
a.push.apply(a, b);

12

এটি আপনি যা করতে বলেছেন ঠিক তা করছে।

আপনি যা একসাথে যুক্ত করছেন সেটি হ'ল অ্যারে রেফারেন্স (যা জেএস স্ট্রিংগুলিতে রূপান্তর করে), এটি সংখ্যা হিসাবে মনে হয় না। এটি একসাথে স্ট্রিং যুক্ত করার মতো: "hello " + "world"="hello world"


5
হেই, এটি আমি যা চেয়েছিলাম তা সবসময়ই করে। সমস্যাটি হল ভাল প্রশ্ন জিজ্ঞাসা করা। আমারে কী উদ্দীপনা জাগায় তা হ'ল আপনি যখন যুক্ত করবেন তখন অ্যারের টু স্ট্রিং () ব্যাখ্যা।
— ই

8

আপনি জাভাস্ক্রিপ্টে অপারেটরদের ওভারলোড করতে পারলে ভাল হবে তবে আপনি পারবেন না: জাভাস্ক্রিপ্টে আমি কাস্টম অপারেটর ওভারলোডগুলি সংজ্ঞায়িত করতে পারি? আপনি কেবল "==" অপারেটরটিকে হ্যাক করতে পারেন যা তুলনার আগে স্ট্রিংগুলিতে রূপান্তরিত হয়: http://blogger.xs4all.nl/peterned/archive/2009/04/01/462517.aspx


8

এটি কারণ, + অপারেটর ধরে নিচ্ছে যে অপারেণ্ডগুলি স্ট্রিং হয়, যদি তারা সংখ্যা না থাকে। সুতরাং, এটি প্রথমে তাদের স্ট্রিংয়ে রূপান্তর করে এবং চূড়ান্ত ফলাফল দেওয়ার জন্য কনক্যাট করে, যদি এটি একটি সংখ্যা না হয়। এছাড়াও, এটি অ্যারেগুলিকে সমর্থন করে না।


2
অপারেটর অপারেন্ডগুলি স্ট্রিংগুলি ধরে নিতে পারে না, কারণ অন্যদের মধ্যে 1 + 1 == 2। এটি কারণ '+' অ্যারেগুলির জন্য সংজ্ঞায়িত করা হয়নি, সুতরাং এটি স্ট্রিং-এসগুলিতে।
— ই

0

এখানে কিছু উত্তর ব্যাখ্যা করেছে যে কীভাবে অপ্রত্যাশিত অনাকাঙ্ক্ষিত আউটপুট ( '1,23,4') ঘটে এবং কিছু তারা ব্যাখ্যা করে যে কীভাবে তারা প্রত্যাশিত কাঙ্ক্ষিত আউটপুট ( [1,2,3,4]) অর্থাৎ অ্যারে কনটেনটেশন বলে মনে করে তা কীভাবে প্রাপ্ত হবে । তবে প্রত্যাশিত কাঙ্ক্ষিত আউটপুটটির প্রকৃতিটি কিছুটা দ্বিধাহীন কারণ মূল প্রশ্নটি কেবল "আমি একটি অ্যারের উপাদানগুলিকে অন্যটিতে যুক্ত করতে চেয়েছিলাম ..." বলে উল্লেখ করে। যে পারে অ্যারে সংযুক্তকরণের মানে কিন্তু এটি করতে পারে এছাড়াও গড় tuple উপরন্তু (যেমন এখানে এবং এখানে ), অর্থাৎ উপাদানের স্কালে মূল্যবোধ, দ্বিতীয় সংশ্লিষ্ট উপাদানের স্কালে মান এক অ্যারের মধ্যে যোগ করার উদাঃ মিশ্রন [1,2]এবং [3,4]প্রাপ্ত [4,6]।

উভয় অ্যারে একই আধ্যাত্মিকতা / দৈর্ঘ্য অনুমান করে নেওয়া, এখানে একটি সহজ সমাধান রয়েছে:

const arr1 = [1, 2];
const arr2 = [3, 4];

const add = (a1, a2) => a1.map((e, i) => e + a2[i]);

console.log(add(arr1, arr2)); // ==> [4, 6]


-1

একটি সাধারণ "+" চিহ্ন ব্যবহার করে অন্য ফলাফলটি হ'ল:

[1,2]+','+[3,4] === [1,2,3,4]

সুতরাং এর মতো কিছু কাজ করা উচিত (তবে!):

var a=[1,2];
var b=[3,4];
a=a+','+b; // [1,2,3,4]

... তবে এটি ভ্যারিয়েবলটিকে একটি অ্যারে থেকে স্ট্রিংয়ে রূপান্তরিত করবে! এটা মনে রেখো.

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