[转] JavaScript 开发者经常忽略或误用的七个基础知识点

JavaScript, at its base, is a simple language that we continue to evolve with intelligent, flexible patterns. We’ve used those patterns in JavaScript frameworks which fuel our web applications today. Lost in JavaScript framework usage, which many new developers are thrust right into, are some of the very useful JavaScript techniques that make basic tasks possible. Here are seven of those basics:

1. String.prototype.replace: /g and /i Flags

1. 在 String.prototype.replace 方法中使用 /g 和 /i 标志位

One surprise to many JavaScript newbies is that String’s replace method doesn’t replace all occurrences of the needle – just the first occurrence. Of course seasoned JavaScript vets know that a regular expression and the global flag (/g) need to be used:

// Mistake// 踩到坑了var str = "David is an Arsenal fan, which means David is great";str.replace("David", "Darren"); // "Darren is an Arsenal fan, which means David is great"// Desired// 符合预期str.replace(/David/g, "Darren"); // "Darren is an Arsenal fan, which means Darren is great"Another basic logical mistake is not ignoring case when case is not critical to the validation (letters may be uppercase or lowercase), so the /i flag is also useful:

另一个基本的逻辑错误就是在大小写不敏感的校验场合（字母可大写可小写）没有忽略大小写，此时 /i 标志位就很实用：

1

str.replace(/david/gi, "Darren"); // "Darren will always be an Arsenal fan, which means Darren will always be great"

（译注：上面这段例程我没有看懂用意，可能是注释有误吧……）

Every JavaScript developer has been bitten by each of the flags in the past – so be sure to use them when when appropriate!

每个 JavaScript 开发者都曾踩过这两个标志位的坑——因此别忘了在适当的时候用上它们！

2. Array-Like Objects and Array.prototype.slice

2. 类数组对象和 Array.prototype.slice 方法

Array’s slice method is principally for grabbing segments of an array. What many developers don’t know is that slice can be used to covert Array-like objects like arguments, NodeLists, and attributes into true arrays of data:

4. Array Length for Truncation

4. 用 length 属性来截断数组

There’s not a developer out there that hasn’t been bitten by JavaScript’s pass-objects-by-reference nature. Oftentimes developers will attempt to empty an array but mistakenly create a new one instead:

What these developers probably realize is that objects are passed by reference, so while setting myArray to [] does create a new array, other references stay the same! Big mistake! Use array truncation instead.

5. Array Merging with push

5. 使用 push 来合并数组

I showed in point 2 that Array’s slice and apply can do some cool stuff, so it shouldn’t surprise you that other Array methods can do the same trickery. This time we can merge arrays with the push method:

A wonderful example of a lessor-known, simple native method for completing the basic task of array merging.

这是一项不为人知的小技巧，简单的原生方法就可以实现数组合并这样的常见任务。

（译注：这个方法的巧妙之外不仅在于 push 方法可以接收多个参数，还涉及到 apply 方法的第二个参数的用法。）

6. Efficient Feature/Object Property Detection

6. 高效探测功能特性和对象属性

Oftentimes developers will use the following technique to detect a browser feature:

很多时候开发者们会像下面这样来探测浏览器的某个特性：

1234

if(navigator.geolocation) { // Do some stuff // 在这里干点事情}

While that works correctly, it isn’t always efficient, as that method of object detection can initialize resources in the browser. In the past, the snippet above caused memory leaks in some browsers. The better and more efficient route is checking for a key within an object:

7. Event preventDefault and stopPropagation

7. 事件对象的 preventDefault 和 stopPropagation 方法

Oftentimes we trigger functionality when action elements like links are clicked. Obviously we don’t want the browser to follow the link upon click, so we use our handy JavaScript library’s Event.stop method:

The problem with this lazy method of stopping the event is that not only does it prevent the default action, but it stops propagation of the event, meaning other event listeners for the elements wont fire because they don’t know about the event. It’s best to simply use preventDefault!

Seasoned JavaScript developers will see this post and say “I knew those,” but at one point or another, they got tripped up on some of these points. Be mindful of the little things in JavaScript because they can make a big difference.