shift() is not the most efficient method. Sometimes you just need a pointer and clean up the memory periodically.
Could use this to implement one simple Set. (Also a built-in Set in ES6)
.hasOwnProperty("x") checks if this object has a certain property x
delete obj["x"]/ obj.x deletes this property & data
this & arrowfunction
太长不看版：js function中的this与这个function本身有关，即使它被包在object内；然而arrow function的this由外部决定，所以这里要用arrow functinon……之前一定是在哪里看到这个知识点，然而忘了。 补充：可以使用bind函数将某个函数中的this与某个对象绑定
for...in or for...of?
var or let?
var is function scoped while
let is block scoped
so when you declar
var in an if statement, you could get this variable even outside of the block(but not outside of this function), but
var got decleared at the top of each function(even the value assignment is still given at the same line)
Value & Type
null == null // true null === null // true null == undefined // true
When using double equal to check, the value might be
null, so it is better to use triple equal when you really need
However, in generall we don't really need to distinct them, as they are both falsy values, a more common and easier way is to check its value is false or not, see this article：