You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/02-object-copy/article.md
+17-18
Original file line number
Diff line number
Diff line change
@@ -12,14 +12,13 @@ let message = "Hello!";
12
12
let phrase = message;
13
13
```
14
14
15
-
As a result we have two independent variables, each one is storing the string `"Hello!"`.
16
15
এর ফলে আমরা দুটি স্বাধীন ভেরিয়েবল আছে, প্রতিটি "হেলো" স্ট্রিংটি সংরক্ষণ করছে ।
17
16
18
17

19
18
20
19
অবজেক্ট রা এমন নয়।
21
20
22
-
** একটি ভেরিএবল অবজেক্ট কে সংরক্ষণ করে না, বরং এর ঠিকানা সংরক্ষণ করে, অন্য কথায় এটির একটি "রেফারেন্স" *
21
+
** একটি ভেরিএবল অবজেক্ট কে সংরক্ষণ করে না, বরং এর ঠিকানা সংরক্ষণ করে, অন্য কথায় এটির একটি "রেফারেন্স" **
23
22
24
23
অবজেক্ট এর ছবিঃ
25
24
@@ -33,35 +32,35 @@ let user = {
33
32
34
33
এখানে, বস্তুটি মেমোরির কোথাও সংরক্ষণ করা হয়েছে। এবং ভেরিয়েবল `user` এর কাছে এর রেফারেন্স আছে।
35
34
36
-
** যখন কোনও বস্তুর ভেরিয়েবল কপি করা হয় - রেফারেন্সটি কপি হয়, বস্তুটি নকল হয় না ***
35
+
** যখন কোনও বস্তুর ভেরিয়েবল কপি করা হয় - রেফারেন্সটি কপি হয়, বস্তুটি নকল হয় না ।**
37
36
38
37
যেমন :
39
38
40
39
```js no-beautify
41
40
let user = { name:"John" };
42
41
43
-
let admin = user; // রেফারেন্স করই হলো
42
+
let admin = user; // রেফারেন্স কপি হলো
44
43
```
45
44
46
45
এখন আমাদের দুটি ভেরিয়েবল রয়েছে, প্রত্যেকেই একই বস্তুর রেফারেন্স:
47
46
48
47

49
48
50
-
আমরা এই দুটি ভেরিএবল এর যেকোনো টি ব্যাবহার করে অবজেক্ট টি এক্সেস করতে পারি ও এর ভেতরের কন্টেন্ট বা ডেটা গুলি পরিবর্তন করতে পারি।
49
+
আমরা এই দুটি ভেরিয়েবল এর যেকোনো টি ব্যাবহার করে অবজেক্ট টি এক্সেস করতে পারি ও এর ভেতরের কন্টেন্ট বা ডেটা গুলি পরিবর্তন করতে পারি।
51
50
52
51
```js run
53
52
let user = { name:'John' };
54
53
55
54
let admin = user;
56
55
57
56
*!*
58
-
admin.name='Pete'; // এডমিন রেফারেন্সে এর মাদ্ধ্যমে পরিবর্তন হোল
57
+
admin.name='Pete'; // এডমিন রেফারেন্সের এর মাধ্যমে পরিবর্তন হলো
59
58
*/!*
60
59
61
-
alert(*!*user.name*/!*); //'Pete', changes are seen from the "user"reference
60
+
alert(*!*user.name*/!*); //'Pete', পরিবর্তন টি "user"রেফারেন্স থেকে দেখা যাচ্ছে
62
61
```
63
62
64
-
উপরের উদাহরণটি প্রমাণ করে যে এখানে কেবল একটি অবজেক্ট রয়েছে।যেন আমাদের একি কক্ষের দুটি চাবি আছে আর আমরা একটি চাবি (`admin`) দিয়ে কক্ষে প্রবেশ করেছি ও অন্যটি (`user`) দিয়ে কক্ষের ভেতরে উকি দিয়েছি।
63
+
উপরের উদাহরণটি প্রমাণ করে যে এখানে কেবল একটি অবজেক্ট রয়েছে।যেন আমাদের একি কক্ষের দুটি চাবি আছে আর আমরা একটি চাবি (`admin`) দিয়ে কক্ষে প্রবেশ করেছি ও অন্যটি (`user`) দিয়ে কক্ষের ভেতরে উকি দিয়েছি।
65
64
66
65
## রেফারেন্স এর মাধ্যমে তুলনা
67
66
@@ -88,7 +87,7 @@ let b = {}; // দুটি স্বাধীন অবজেক্ট
88
87
alert( a == b ); // false
89
88
```
90
89
91
-
`obj1 > obj2` এর মত তুলনা এর জন্য or অথবা কোন প্রিমিটিভ এর সাথে তুলনা করার জন্য `obj ==5`, অবজেক্ট কে প্রিমিটিভ এ রূপান্তর করা হয়। অবজেক্ট গুলোকে কিভাবে তুলনা করা হয় তা সম্পর্কে আমরা শিগ্রই জানব, কিন্তু সত্যি বলতে এই ধরনের তুলনা খুব কমি করা হয়, সাধারণত ভুলক্রমে।
90
+
`obj1 > obj2` এর মত তুলনা এর জন্য অথবা কোন প্রিমিটিভ এর সাথে তুলনা করার জন্য `obj ==5`, অবজেক্ট কে প্রিমিটিভ এ রূপান্তর করা হয়। অবজেক্ট গুলোকে কিভাবে তুলনা করা হয় তা সম্পর্কে আমরা শিগ্রই জানব, কিন্তু সত্যি বলতে এই ধরনের তুলনা খুব কমই করা হয়, সাধারণত ভুলক্রমে।
92
91
93
92
## ক্লোন করা ও মিলিত করা, Object.assign
94
93
@@ -99,7 +98,7 @@ alert( a == b ); // false
99
98
তাও সম্ভব কিন্তু একটু কঠিন, কারণ এই কাজ করার জন্য জাভাস্ক্রিপ্ট এর কোন অন্তর্নির্মিত মেথড নেই।
100
99
আসলে এটি খুব কমই প্রয়োজন হয়। রেফারেন্সে কপি করাই বেশিরভাগ সময় যথেষ্ট।
101
100
102
-
কিন্তু আমরা যদি আসলেই এটি চাই তাহলে আমাদের নতুন একটি অবজেক্ট বানাতে হবে, ও মুল অবজেক্ট তির সম্পূর্ণ কাঠামো কে নকল করে এর সকল প্রপার্টির প্রিমিটিভ স্তরে প্রতিলিতি তৈরি করতে হবে।
101
+
কিন্তু আমরা যদি আসলেই এটি চাই তাহলে আমাদের নতুন একটি অবজেক্ট বানাতে হবে, ও মুল অবজেক্ট টির সম্পূর্ণ কাঠামো কে নকল করে এর সকল প্রপার্টির প্রিমিটিভ স্তরে প্রতিলিতি তৈরি করতে হবে।
- এটি মুল অবজেক্ট এর সকল প্রপার্টি `src1, ..., srcN` টার্গেট `dest` এ কপি করে। অন্য কথায়, দ্বিতীয় আর্গুমেন্ট থেকে বাকি সকল আর্গুমেন্ট এর প্রপার্টি গুলো প্রথম অবজেক্ট এ কপি হয়।
139
138
- এই কল টি `dest` কে রিটার্ন করে।
140
139
141
-
আমরা এটি ব্যাবহার করে একাধিক অবজেক্ট এ একটি অবজেক্ট এ মিলিত করতে পারে:
140
+
আমরা এটি ব্যাবহার করে একাধিক অবজেক্টকে একটি অবজেক্ট এ মিলিত করতে পারি:
142
141
```js
143
142
let user = { name:"John" };
144
143
145
144
let permissions1 = { canView:true };
146
145
let permissions2 = { canEdit:true };
147
146
148
147
*!*
149
-
//copies all properties from permissions1 and permissions2 into user
148
+
//permissions1 ও permissions2 এর সকল প্রপার্টি কে user এ কপি করে
কপি করা প্রপার্টি যদি ইতিমধ্যেই থেকে থাকে থাকলে এটি ওভাররাইট হয়ে যাবে:
@@ -160,7 +159,7 @@ let user = { name: "John" };
160
159
161
160
Object.assign(user, { name:"Pete" });
162
161
163
-
alert(user.name); //now user = { name: "Pete" }
162
+
alert(user.name); //এখন user = { name: "Pete" }
164
163
```
165
164
166
165
আমরা `for..in` এর জায়গায় `Object.assign` ব্যাবহার করে সাধারণ ক্লোনিং করতে পারি :
@@ -180,7 +179,7 @@ let clone = Object.assign({}, user);
180
179
181
180
## অভ্যন্তরীণ ক্লোনিং (Nested cloning)
182
181
183
-
এতখ্যন পর্জন্ত আমরা ধরে নিয়েছিলাম যে `user` এর সকল প্রপার্টি ই প্রিমিটিভ । কিন্তু প্রপার্টি গুলো তো অন্যান্য অবজেক্ট এর রেফারেন্স ও হতে পারে । সেক্ষেত্রে আমরা কি করবো?
182
+
এতক্ষণ পর্যন্ত আমরা ধরে নিয়েছিলাম যে `user` এর সকল প্রপার্টি ই প্রিমিটিভ । কিন্তু প্রপার্টি গুলো তো অন্যান্য অবজেক্ট এর রেফারেন্স ও হতে পারে । সেক্ষেত্রে আমরা কি করবো?
184
183
185
184
যেমন:
186
185
```js run
@@ -217,14 +216,14 @@ user.sizes.width++; // একটি জায়গা থেকে প্র
217
216
alert(clone.sizes.width); // 51, অন্য জায়গায় রেসাল্ট দেখা
218
217
```
219
218
220
-
এটি সমাধান করার জন্য আমাদের একটি ক্লোনিং লুপ ব্যাবহার করা লাগবে যা `user[key]` এর প্রত্যেক মান কে প্রিক্ষা করবে, এবং যদি এটি অবজেক্ট হয়, তাহলে এর স্ট্রাকচার কেও কপি করবে। একে বলে "ডিপ ক্লোনিং".
219
+
এটি সমাধান করার জন্য আমাদের একটি ক্লোনিং লুপ ব্যাবহার করা লাগবে যা `user[key]` এর প্রত্যেক মান কে পরীক্ষা করবে, এবং যদি এটি অবজেক্ট হয়, তাহলে এর স্ট্রাকচার কেও কপি করবে। একে বলে "ডিপ ক্লোনিং"।
221
220
222
221
আমরা রিকার্সন ব্যাবহার করে এটি তৈরি করতে পারি অথবা ইতিমধ্যেই বাস্তবায়িত একটি ব্যাবহার করতে পারি, যেমন [lodash](https://lodash.com) এর [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep) ফাংশন।
223
222
224
223
## সংক্ষিপ্ত
225
224
226
225
অবজেক্ট গুলো রেফারেন্স এর মাধ্যমে কপি হয়। অন্য কথায়, একটি ভেরিয়েবল অবজেক্ট এর মান সংরক্ষণ করে না , বরং একটি রেফারেন্স (মেমোরি এড্রেস) সংরক্ষণ করে। সুতরাং এই ধরনের ভেরিয়েবল কে কপি করলে অবজেক্ট কপি হয় না বরং রেফারেন্স কপি হয়।
227
226
228
-
রেফারেন্সে এর মাধ্যমে করে সকল কাজ (যেমন প্রপার্টি যোগ করা/মোছা) একই অবজেক্ট এ সম্পাদিত হয়।
227
+
কপি করা রেফারেন্সে এর মাধ্যমে করে সকল কাজ (যেমন প্রপার্টি যোগ করা/মোছা) একই অবজেক্ট এ সম্পাদিত হয়।
229
228
230
-
একটি "আসল কপি" (ক্লোন) তৈরি করতে আমরা ব্যাবহার করতে পারি `Object.assign` যাকে "শ্যালো কপি"(অভ্যন্তরীণ অবজেক্ট রেফারেন্সের মাধ্যমে কপি হয়) বলা হয় অথবা আমরা ব্যাবহার করতে পারি [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep) এর মত "ডিপ ক্লোনিং" ফাংশন।
229
+
একটি "বাস্তব কপি" (ক্লোন) তৈরি করতে আমরা ব্যাবহার করতে পারি `Object.assign` যাকে "শ্যালো কপি"(অভ্যন্তরীণ অবজেক্ট রেফারেন্সের মাধ্যমে কপি হয়) বলা হয় অথবা আমরা ব্যাবহার করতে পারি [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep) এর মত "ডিপ ক্লোনিং" ফাংশন।
0 commit comments