1. Have you tried sorting the array elements?
JavaScript uses alphanumeric order by default. Therefore, the result of [1,2,5,10].sort() is [1, 10, 2, 5].
If you want to sort correctly, you should do this: [1,2,5,10].sort((a, b) => a - b)
2. new Date() is very easy to use
new Date() can receive:
- does not receive any parameters: returns the current time;
- Receives a parameter `x`: Returns the value of January 1, 1970 + `x` milliseconds.
- `new Date(1, 1, 1)` returns February 1, 1901.
- However...., `new Date(2016, 1, 1)` does not add 2016 to 1900, but only represents 2016.
#3. The replacement function does not really replace?
let s = "bob" const replaced = s.replace('b', 'l') replaced === "lob" // 只会替换掉第一个b s === "bob" // 并且s的值不会变
If you want to replace all b, use regular expressions:
"bob".replace(/b/g, 'l') === 'lol'
4. Be careful with comparison operations
// 这些可以 'abc' === 'abc' // true 1 === 1 // true // 然而这些不行 [1,2,3] === [1,2,3] // false {a: 1} === {a: 1} // false {} === {} // false
Because [1,2,3] and [1,2,3] are two different arrays, but their elements happen to be the same. Therefore, it cannot be judged simply by `===`.
5. Array is not a basic type
typeof {} === 'object' // true typeof 'a' === 'string' // true typeof 1 === number // true // 但是.... typeof [] === 'object' // true
If you want to determine whether a variable `var` is an array, you need to use `Array.isArray(var)`
.
6. Closure
This is a classic JavaScript interview question:
const Greeters = [] for (var i = 0 ; i < 10 ; i++) { Greeters.push(function () { return console.log(i) }) } Greeters[0]() // 10 Greeters[1]() // 10 Greeters[2]() // 10
Although the expected output is 0,1,2,..., the actual output is But it won't. Do you know how to debug?
There are two ways:
- Use `let` instead of `var`.
- Use the `bind` function.
Greeters.push(console.log.bind(null, i))
Of course, there are many solutions. These two are my favorite!
7. Regarding bind
What will the following code output?
class Foo { constructor (name) { this.name = name } greet () { console.log('hello, this is ', this.name) } someThingAsync () { return Promise.resolve() } asyncGreet () { this.someThingAsync() .then(this.greet) } } new Foo('dog').asyncGreet()
If you say that the program will crash and report an error: Cannot read property 'name' of undefined
.
Because the `geet` on line 16 is not executed in the correct environment. Of course, there are many ways to solve this BUG!
- Prefer to use the `bind` function to solve the problem:
asyncGreet () { this.someThingAsync() .then(this.greet.bind(this)) }
This will ensure that `greet` will be called by the instance of Foo, rather than the local function `this`.
- If you want `greet` to never be bound to the wrong scope, you can use `bind` inside the constructor.
class Foo { constructor (name) { this.name = name this.greet = this.greet.bind(this) } }
- You can also use arrow functions (=>) to prevent the scope from being modified.
asyncGreet () { this.someThingAsync() .then(() => { this.greet() }) }
8. Math.min() is larger than Math.max()
Math.min() < Math.max() // false
Because Math.min()
returns Infinity, while Math.max ()
Return -Infinity.
The above is the detailed content of A summary of tips on how to avoid common pitfalls in JavaScript. For more information, please follow other related articles on the PHP Chinese website!