Hello friends,
After a period of absence, today I continue to return on a cold day. And to continue the JavaScript tips series, today I would like to continue the second part of this series. If you have not read the first part, you should read it immediately, I bet it will be very interesting:
- [JS tips] JS “tricks” thought not good or not (part 1)
- [JS tips] JS “tricks” thought not good or not (part 2) ==> You’re here!
Now, continue to learn the tips so that we can “control” JS the best gradually. Let’s start!
1. Eliminate duplicate elements in the array
Let’s start with a familiar problem. Looking right at the title, many people will sigh and say, “God, this is so familiar, mom, there are dozens of tricks on the web to do this game!” . Yes, that is. I do not deny that. You can Google now and produce tons of results for this.
But today I want to give you a clearer view of deduplicate arrays in JS.
1.1 With arrays containing elements of type primitives
Yes, this is what most of you know. And obviously there are “a dozen ways” as you said. But in general there are 2 most common ways:
- Use the Set collection:
Admittedly, this is the simplest and most memorable way. We take advantage of the feature of Set that it will not contain duplicates in it, adding the same element to it will not receive any more (of course, primitives, but Objects are different, they are different). I will discuss this section right below so don’t be anxious.) So, we will do this:
1 2 3 | <span class="token keyword">var</span> dedupedArr <span class="token operator">=</span> Array <span class="token punctuation">.</span> <span class="token keyword">from</span> <span class="token punctuation">(</span> <span class="token keyword">new</span> <span class="token class-name">Set</span> <span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">'a'</span> <span class="token punctuation">,</span> <span class="token string">'a'</span> <span class="token punctuation">,</span> <span class="token string">'b'</span> <span class="token punctuation">,</span> <span class="token string">'1'</span> <span class="token punctuation">,</span> <span class="token string">'b'</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> dedupedArr <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// [ 1, 'a', 'b', '1' ]</span> |
- Use loop:
In this way, you can optionally use filter
, or reduce
, or regular forEach
, and so on and remove duplicates as you like. In general, you have to browse the array to perform the type action of the duplicate element.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <span class="token comment">// Use filter</span> <span class="token keyword">var</span> deduped <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">'a'</span> <span class="token punctuation">,</span> <span class="token string">'a'</span> <span class="token punctuation">,</span> <span class="token string">'b'</span> <span class="token punctuation">,</span> <span class="token string">'1'</span> <span class="token punctuation">,</span> <span class="token string">'b'</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> <span class="token function">filter</span> <span class="token punctuation">(</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> el <span class="token punctuation">,</span> i <span class="token punctuation">,</span> arr <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> arr <span class="token punctuation">.</span> <span class="token function">indexOf</span> <span class="token punctuation">(</span> el <span class="token punctuation">)</span> <span class="token operator">===</span> i <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> deduped <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// [ 1, 'a', 'b', '1' ]</span> <span class="token comment">// ------------------------------</span> <span class="token comment">// Use forEach</span> <span class="token keyword">const</span> names <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token string">'John'</span> <span class="token punctuation">,</span> <span class="token string">'Paul'</span> <span class="token punctuation">,</span> <span class="token string">'George'</span> <span class="token punctuation">,</span> <span class="token string">'Ringo'</span> <span class="token punctuation">,</span> <span class="token string">'John'</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">removeDups</span> <span class="token punctuation">(</span> names <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> unique <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> names <span class="token punctuation">.</span> <span class="token function">forEach</span> <span class="token punctuation">(</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> i <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span> unique <span class="token punctuation">[</span> i <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> unique <span class="token punctuation">[</span> i <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">true</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> Object <span class="token punctuation">.</span> <span class="token function">keys</span> <span class="token punctuation">(</span> unique <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">removeDups</span> <span class="token punctuation">(</span> names <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// // 'John', 'Paul', 'George', 'Ringo'</span> <span class="token comment">// ------------------------------</span> <span class="token comment">// bla bla bla</span> |
1.2 With an array containing elements of type object
What about an array containing an Object? Can we simply eliminate duplicates like the above? Of course not after we look at a few small lines of this code:
1 2 3 4 | <span class="token number">1</span> <span class="token operator">===</span> <span class="token number">1</span> <span class="token comment">// true</span> <span class="token string">'a'</span> <span class="token operator">===</span> <span class="token string">'a'</span> <span class="token comment">// true</span> <span class="token punctuation">{</span> a <span class="token punctuation">:</span> <span class="token number">1</span> <span class="token punctuation">}</span> <span class="token operator">===</span> <span class="token punctuation">{</span> a <span class="token punctuation">:</span> <span class="token number">1</span> <span class="token punctuation">}</span> <span class="token comment">// false</span> |
Oh? What’s happening? It’s simple for those who learn JS, right? When we have two separate objects no matter how similar they are inside, they are still two different objects due to different device addresses.
So the solution here will be quite “clumsy” and more complex than we thought.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token keyword">function</span> <span class="token function">dedup</span> <span class="token punctuation">(</span> arr <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> hashTable <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> arr <span class="token punctuation">.</span> <span class="token function">filter</span> <span class="token punctuation">(</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> el <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> key <span class="token operator">=</span> <span class="token constant">JSON</span> <span class="token punctuation">.</span> <span class="token function">stringify</span> <span class="token punctuation">(</span> el <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">var</span> match <span class="token operator">=</span> <span class="token function">Boolean</span> <span class="token punctuation">(</span> hashTable <span class="token punctuation">[</span> key <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> match <span class="token operator">?</span> <span class="token boolean">false</span> <span class="token punctuation">:</span> hashTable <span class="token punctuation">[</span> key <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">true</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">var</span> deduped <span class="token operator">=</span> <span class="token function">dedup</span> <span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> a <span class="token punctuation">:</span> <span class="token number">1</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> a <span class="token punctuation">:</span> <span class="token number">1</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">]</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> deduped <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// [ {a: 1}, [1, 2] ]</span> |
Wow? What just happened? Let me explain a bit.
Considering the hashTable
object, we will use it to distinguish whether the object in the array is a duplicate or not. But because it is just a normal object like any other object, it also means that it cannot distinguish a string and a number when they have the same value.
1 2 3 4 5 | <span class="token keyword">var</span> hashTable <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> hashTable <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">true</span> <span class="token punctuation">;</span> hashTable <span class="token punctuation">[</span> <span class="token string">'1'</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">true</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> hashTable <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// { '1': true }</span> |
Well then, how can we use hashTable
to distinguish duplicate objects? Calm down and pay attention to stringify
. It has done that itself when combined with that hashTable
.
1 2 3 4 5 | <span class="token keyword">var</span> hashTable <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> hashTable <span class="token punctuation">[</span> <span class="token constant">JSON</span> <span class="token punctuation">.</span> <span class="token function">stringify</span> <span class="token punctuation">(</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">true</span> <span class="token punctuation">;</span> hashTable <span class="token punctuation">[</span> <span class="token constant">JSON</span> <span class="token punctuation">.</span> <span class="token function">stringify</span> <span class="token punctuation">(</span> <span class="token string">'1'</span> <span class="token punctuation">)</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">true</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> hashTable <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// { '1': true, ''1'': true }</span> |
The story is now understandable again. See, removing the duplicate element from the array is an old problem but it’s not that simple!
2. Should Object.is () be used for absolute comparison
JS is a loose language, it is lax in many places, but these places sometimes cause quite uncomfortable moments for users. Typically the comparison in JS, is ==
(type – converting comparisons) and ===
(strict comparison).
Great in that:
1 2 3 4 5 | <span class="token number">0</span> <span class="token operator">==</span> <span class="token string">' '</span> <span class="token comment">//true</span> <span class="token number">0</span> <span class="token operator">===</span> <span class="token string">' '</span> <span class="token comment">// false</span> <span class="token keyword">null</span> <span class="token operator">==</span> undefined <span class="token comment">//true</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token boolean">true</span> <span class="token comment">//true</span> |
But annoyed that:
1 2 | <span class="token number">NaN</span> <span class="token operator">===</span> <span class="token number">NaN</span> <span class="token comment">//false</span> |
Should the expert he devised Object.is()
from version ES6 to solve some slightly crazy situation of absolute comparisons ===
. The nature of Object.is()
is the same as ===
, but it works quite well in some special cases that ===
not do.
1 2 3 4 5 | Object <span class="token punctuation">.</span> <span class="token function">is</span> <span class="token punctuation">(</span> <span class="token number">0</span> <span class="token punctuation">,</span> <span class="token string">' '</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">//false</span> Object <span class="token punctuation">.</span> <span class="token function">is</span> <span class="token punctuation">(</span> <span class="token keyword">null</span> <span class="token punctuation">,</span> undefined <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">//false</span> Object <span class="token punctuation">.</span> <span class="token function">is</span> <span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token boolean">true</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">//false</span> Object <span class="token punctuation">.</span> <span class="token function">is</span> <span class="token punctuation">(</span> <span class="token number">NaN</span> <span class="token punctuation">,</span> <span class="token number">NaN</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">//true</span> |
The Mozilla team doesn’t think Object.is()
is a stricter comparison than ===
, saying they should only see this method when used with NaN
, -0
and +0
. But I find it quite useful!
3. Insert the element into the array
“It’s an old one again . “
Do not assert yet when you have not read it, quite useful, believe me! Although the work of inserting elements into arrays is JS dev’s daily job, but here let us drill down on performance a bit!
3.1 Insert element at the end of the array
It is not strange or difficult with the methods that I listed below:
1 2 3 4 5 6 7 | <span class="token keyword">var</span> arr <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">,</span> <span class="token number">5</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token keyword">var</span> arr2 <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> arr <span class="token punctuation">.</span> <span class="token function">push</span> <span class="token punctuation">(</span> <span class="token number">6</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// #1</span> arr <span class="token punctuation">[</span> arr <span class="token punctuation">.</span> length <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">6</span> <span class="token punctuation">;</span> <span class="token comment">// #2</span> arr2 <span class="token operator">=</span> arr <span class="token punctuation">.</span> <span class="token function">concat</span> <span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token number">6</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// #3</span> |
The first two ways will add the element directly to the old array, and the third way it will return a new array. Please try checking again. So, depending on the specific context, choose the appropriate way to use it!
In terms of performance, there are many differences on phones and computers.
- On the phone:
1 2 3 4 5 6 | Final victor <span class="token number">1.</span> arr <span class="token punctuation">[</span> arr <span class="token punctuation">.</span> length <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">6</span> <span class="token punctuation">;</span> <span class="token comment">// with an average of 5 632 856 ops/sec</span> <span class="token number">2.</span> arr <span class="token punctuation">.</span> <span class="token function">push</span> <span class="token punctuation">(</span> <span class="token number">6</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// 35.64 % slower</span> <span class="token number">3.</span> arr2 <span class="token operator">=</span> arr <span class="token punctuation">.</span> <span class="token function">concat</span> <span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token number">6</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// 62.67 % slower</span> |
- On the computer:
1 2 3 4 5 6 | Final victor <span class="token number">1.</span> arr <span class="token punctuation">[</span> arr <span class="token punctuation">.</span> length <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">6</span> <span class="token punctuation">;</span> <span class="token comment">// with an average of 42 345 449 ops/sec</span> <span class="token number">2.</span> arr <span class="token punctuation">.</span> <span class="token function">push</span> <span class="token punctuation">(</span> <span class="token number">6</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// 34.66 % slower</span> <span class="token number">3.</span> arr2 <span class="token operator">=</span> arr <span class="token punctuation">.</span> <span class="token function">concat</span> <span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token number">6</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// 85.79 % slower</span> |
Specific details on each browser you visit the original reference article offline.
3.2 Insert element at the beginning of the array
Insert into the beginning of the array, we will talk about 2 ways:
1 2 3 4 5 | <span class="token keyword">var</span> arr <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">,</span> <span class="token number">5</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> arr <span class="token punctuation">.</span> <span class="token function">unshift</span> <span class="token punctuation">(</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// #1</span> <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> <span class="token function">concat</span> <span class="token punctuation">(</span> arr <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// #2</span> |
And we also get performance results when measuring on computers and phones.
- On the phone
1 2 3 4 5 | Final victor <span class="token number">1.</span> <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> <span class="token function">concat</span> <span class="token punctuation">(</span> arr <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// with an average of 4 972 622 ops/sec</span> <span class="token number">2.</span> arr <span class="token punctuation">.</span> <span class="token function">unshift</span> <span class="token punctuation">(</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// 64.70 % slower</span> |
- On the computer
1 2 3 4 5 | Final victor <span class="token number">1.</span> <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> <span class="token function">concat</span> <span class="token punctuation">(</span> arr <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// with an average of 6 032 573 ops/sec</span> <span class="token number">2.</span> arr <span class="token punctuation">.</span> <span class="token function">unshift</span> <span class="token punctuation">(</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// 78.65 % slower</span> |
Specific details on each browser you visit the original reference article offline.
3.3 Insert element in the middle of the array
Inserting in the middle of the array, I only discuss one way so there is no need to compare performance anymore.
1 2 3 | <span class="token keyword">var</span> items <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token string">'one'</span> <span class="token punctuation">,</span> <span class="token string">'two'</span> <span class="token punctuation">,</span> <span class="token string">'three'</span> <span class="token punctuation">,</span> <span class="token string">'four'</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> items <span class="token punctuation">.</span> <span class="token function">splice</span> <span class="token punctuation">(</span> items <span class="token punctuation">.</span> length <span class="token operator">/</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">,</span> <span class="token string">'hello'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
4. Did you really understand the passing reference mechanism of JS?
As a JS dev, I bet you’ve heard this sentence somewhere before: “JavaScript is pass-by-value” . I would like to excuse myself not to translate this sentence here because of my limited English knowledge. To consider the meaning of this saying, see the following example:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token keyword">var</span> me <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token comment">// #1</span> <span class="token string">'partOf'</span> <span class="token punctuation">:</span> <span class="token string">'A Team'</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">myTeam</span> <span class="token punctuation">(</span> me <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// #2</span> me <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token comment">// #3</span> <span class="token string">'belongsTo'</span> <span class="token punctuation">:</span> <span class="token string">'A Group'</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">myTeam</span> <span class="token punctuation">(</span> me <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> me <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// #4 : {'partOf' : 'A Team'}</span> |
“Fuzzy chicken thread” would ask: “Oh, I thought it must be {'belongsTo' : 'A Group'}
, right? If I met this question, I would have … from the parking lot. .
Come on, let’s analyze together to clarify!
I have marked the numbers on the me
variables so we can follow them easily. First, we declare a variable me#1
, which means that a memory cell (temporarily called me_mem
) is used and me#1
points to that me_mem
.
When we call the function myTeam(me)
transmission me#1
is on, right now, JS will pass reference object me#1
this as one value (passing the reference to me#1
object as value). Because it is an object and the function itself itself, in other words, creates two references to the same object. So me#2
also points to me_mem
.
And in the step of assigning me#2
to me#3
, me#2
has a reference to a new device, the memory of me#3
points to, different from the me_mem
memory that it is pointing. Therefore, me#2
will be changed, not me#1
as many people think. So when the show shows me#1
‘s value, it’s still the original value.
A second example to gain a deeper understanding:
1 2 3 4 5 6 7 8 9 10 11 | <span class="token keyword">var</span> me <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token comment">// #1</span> <span class="token string">'partOf'</span> <span class="token punctuation">:</span> <span class="token string">'A Team'</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">myGroup</span> <span class="token punctuation">(</span> me <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// #2</span> me <span class="token punctuation">.</span> partOf <span class="token operator">=</span> <span class="token string">'A Group'</span> <span class="token punctuation">;</span> <span class="token comment">// #3</span> <span class="token punctuation">}</span> <span class="token function">myGroup</span> <span class="token punctuation">(</span> me <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> me <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// #4 : {'partOf' : 'A Group'}</span> |
After having experience with the above example and reading more closely in this second example, we may not be surprised at the final result.
The working mechanism of JS is still the same. But let us note in the function myGroup(me)
, we make changes to the value of the attribute inside me#2
, that is to change the main me_mem
memory that me#2
is referring to. This results in me#1
being called, as well as changing its value as it is referring to me_mem
.
That’s amazing, aren’t you, “JavaScript is pass-by-value” .
5. Have fun at the end of the lesson with 3 tips
I have reached the end of the lesson, after 4 difficult tricks that are easy to get, strangely strange, this last part I would like to share 3 small but extremely useful tips. They make our code clean and our logic easier.
5.1 Get the array element from the end of the array
This is for those who forget. This approach is quite common and effective, but rarely used.
1 2 3 4 5 6 7 | <span class="token keyword">var</span> newArray <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> newArray <span class="token punctuation">.</span> <span class="token function">slice</span> <span class="token punctuation">(</span> <span class="token operator">-</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// [4]</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> newArray <span class="token punctuation">.</span> <span class="token function">slice</span> <span class="token punctuation">(</span> <span class="token operator">-</span> <span class="token number">2</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// [3, 4]</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> newArray <span class="token punctuation">.</span> <span class="token function">slice</span> <span class="token punctuation">(</span> <span class="token operator">-</span> <span class="token number">3</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// [2, 3, 4]</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> newArray <span class="token punctuation">.</span> <span class="token function">slice</span> <span class="token punctuation">(</span> <span class="token operator">-</span> <span class="token number">4</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// [1, 2, 3, 4]</span> |
5.2 Shorten conditions and execution orders
Suppose, for example, that you have a function that only works when certain conditions are true.
1 2 3 4 | <span class="token keyword">if</span> <span class="token punctuation">(</span> condition <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">dosomething</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Now your code will be shorter and look a lot more dangerous by writing the following:
1 2 | condition <span class="token operator">&&</span> <span class="token function">dosomething</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
It is completely equivalent to the above code only.
1 2 3 4 | <span class="token keyword">let</span> check <span class="token operator">=</span> <span class="token boolean">true</span> <span class="token punctuation">;</span> check <span class="token operator">&&</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">"Wow!"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Wow!</span> |
5.3 Assign default values using ||
This is also a good trick used by JS devs when assigning a default value to a variable in case that variable is valued as falsy value
such as null
, undefined
, false
, NaN
, ….
1 2 3 4 5 6 7 | <span class="token keyword">var</span> a <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> a <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">//undefined</span> a <span class="token operator">=</span> a <span class="token operator">||</span> <span class="token string">'default value'</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> a <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">//default value</span> a <span class="token operator">=</span> a <span class="token operator">||</span> <span class="token string">'new value'</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> a <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">//default value</span> |
And the application of these “double dashes” is a classic. For example, in writing a method for both a string and an argument, it is possible to use:
1 2 3 4 5 6 7 | <span class="token keyword">function</span> <span class="token function">printUpperCase</span> <span class="token punctuation">(</span> words <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> elements <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> <span class="token function">concat</span> <span class="token punctuation">(</span> words <span class="token operator">||</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span> <span class="token keyword">var</span> i <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">;</span> i <span class="token operator"><</span> elements <span class="token punctuation">.</span> length <span class="token punctuation">;</span> i <span class="token operator">++</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> elements <span class="token punctuation">[</span> i <span class="token punctuation">]</span> <span class="token punctuation">.</span> <span class="token function">toUpperCase</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
You all see that the bottom line is ||
right?
1 2 3 4 5 6 7 | <span class="token function">printUpperCase</span> <span class="token punctuation">(</span> <span class="token string">"cactus"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// => CACTUS</span> <span class="token function">printUpperCase</span> <span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token string">"cactus"</span> <span class="token punctuation">,</span> <span class="token string">"bear"</span> <span class="token punctuation">,</span> <span class="token string">"potato"</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// => CACTUS</span> <span class="token comment">// BEAR</span> <span class="token comment">// POTATO</span> |
Conclude
So we went through 5 tips in this article. Pretty long right?
Although there are very familiar things when working with JS such as removing duplicate elements in arrays or adding elements to arrays, passing parameters to functions, or the ways that we still use everyday, I bet that My writing brings more or less knowledge in several aspects of these tips. Hopefully the article will bring some useful things for you.
If you have questions or similar tips, please leave a comment below. Thank you for patiently reading here!
Reference http://jstips.co