24個javascript最佳實踐
1. 使用 === 代替 ==
JavaScript utilizes two different kinds of equality operators: === | !== and == | != It is considered best practice to always use the former set when comparing.
如果2個運算物件具有相同型別和值,則===返回true 且!==返回false.
"If two operands are of the same type and value, then === produces true and !== produces false." - JavaScript: The Good Parts
However, when working with == and !=, you'll run into issues when working with different types. In these cases, they'll try to coerce the values, unsuccessfully.
2. 避免使用Eval
For those unfamiliar, the "eval" function gives us access to JavaScript's compiler. Essentially, we can execute a string's result by passing it as a parameter of "eval".
Not only will this decrease your script's performance substantially, but it also poses a huge security risk because it grants far too much power to the passed in text. Avoid it!
3. 避免簡寫方式
Technically, you can get away with omitting most curly braces and semi-colons. Most browsers will correctly interpret the following:
if(someVariableExists)
x = false
x = false
However, consider this:
if(someVariableExists)
x = false
anotherFunctionCall();
x = false
anotherFunctionCall();
One might think that the code above would be equivalent to:
if(someVariableExists) {
x = false;
anotherFunctionCall();
}
x = false;
anotherFunctionCall();
}
Unfortunately, he'd be wrong. In reality, it means:
if(someVariableExists) {
x = false;
}
anotherFunctionCall();
x = false;
}
anotherFunctionCall();
As you'll notice, the indentation mimics the functionality of the curly brace. Needless to say, this is a terrible practice that should be avoided at all costs. The only time that curly braces
should be omitted is with one-liners, and even this is a highly debated topic.
if(2 + 2 === 4) return 'nicely done';
總是考慮未來
What if, at a later date, you need to add more commands to this if statement. In order to do so, you would need to rewrite this block of code. Bottom line - tread with caution when omitting.
4. 使用 JS Lint檢查程式碼
JSLint is a debugger written by Douglas Crockford. Simply paste in your script, and it'll quickly
scan for any noticeable issues and errors in your code.
"JSLint takes a JavaScript source and scans it. If it finds a problem, it returns a message describing the problem and an approximate location within the source. The problem is not necessarily a syntax error, although it often is. JSLint looks at some style
conventions as well as structural problems. It does not prove that your program is correct. It just provides another set of eyes to help spot problems."
- JSLint Documentation
Before signing off on a script, run it through JSLint just to be sure that you haven't made any mindless mistakes.
5. 將script指令碼放到頁面底部
This tip has already been recommended in the previous article in this series. As it's highly appropriate though, I'll paste in the information.
Remember -- the primary goal is to make the page load as quickly as possible for the user. When loading a script, the browser can't continue on until the entire file has been loaded. Thus,
the user will have to wait longer before noticing any progress.
If you have JS files whose only purpose is to add functionality -- for example, after a button is clicked -- go ahead and place those files at the bottom, just before the closing body tag.
This is absolutely a best practice.
推薦:
<p>And now you know my favorite kinds of corn. </p>
<script type="text/javascript" src="path/to/file.js"></script>
<script type="text/javascript" src="path/to/anotherFile.js"></script>
</body>
</html>
<script type="text/javascript" src="path/to/file.js"></script>
<script type="text/javascript" src="path/to/anotherFile.js"></script>
</body>
</html>
6. 在for語句體外宣告變數
When executing lengthy "for" statements, don't make the engine work any harder than it must. For example:
不推薦:
for(var i = 0; i < someArray.length; i++) {
var container = document.getElementById('container');
container.innerHtml += 'my number: ' + i;
console.log(i);
}
var container = document.getElementById('container');
container.innerHtml += 'my number: ' + i;
console.log(i);
}
Notice how we must determine the length of the array for each iteration, and how we traverse the dom to find the "container" element each time -- highly inefficient!
推薦:
var container = document.getElementById('container');
for(var i = 0, len = someArray.length; i < len; i++) {
container.innerHtml += 'my number: ' + i;
console.log(i);
}
for(var i = 0, len = someArray.length; i < len; i++) {
container.innerHtml += 'my number: ' + i;
console.log(i);
}
Bonus points to the person who leaves a comment showing us how we can further improve the code block above.
7. 最快構建String方式
Don't always reach for your handy-dandy "for" statement when you need to loop through an array or object. Be creative and find the quickest solution for the job at hand.
var arr = ['item 1', 'item 2', 'item 3', ...];
var list = '<ul><li>' + arr.join('</li><li>') + '</li></ul>';
var list = '<ul><li>' + arr.join('</li><li>') + '</li></ul>';
I won’t bore you with benchmarks; you’ll just have to believe me (or test for yourself) - this is by far the fastest method!
Using native methods (like join()), regardless of what’s going on behind the abstraction layer, is usually much faster than any non-native alternative.
- James Padolsey, james.padolsey.com
8. 減少全域性變數
"By reducing your global footprint to a single name, you significantly reduce the chance of bad interactions with other applications, widgets, or libraries."
- Douglas Crockford
var name = 'Jeffrey';
var lastName = 'Way';
function doSomething() {...}
console.log(name); // Jeffrey -- or window.name
var lastName = 'Way';
function doSomething() {...}
console.log(name); // Jeffrey -- or window.name
推薦:
var DudeNameSpace = {
name : 'Jeffrey',
lastName : 'Way',
doSomething : function() {...}
}
console.log(DudeNameSpace.name); // Jeffrey
name : 'Jeffrey',
lastName : 'Way',
doSomething : function() {...}
}
console.log(DudeNameSpace.name); // Jeffrey
Notice how we've "reduced our footprint" to just the ridiculously named "DudeNameSpace" object.
9. 新增註釋
It might seem unnecessary at first, but trust me, you WANT to comment your code as best as possible. What happens when you return to the project months later, only to find that you can't easily
remember what your line of thinking was. Or, what if one of your colleagues needs to revise your code? Always, always comment important sections of your code.
// Cycle through array and echo out each name.
for(var i = 0, len = array.length; i < len; i++) {
console.log(array[i]);
}
for(var i = 0, len = array.length; i < len; i++) {
console.log(array[i]);
}
10.擁抱漸進增強Embrace Progressive Enhancement
Always compensate for when JavaScript is disabled. It might be tempting to think, "The majority of my viewers have JavaScript enabled, so I won't worry about it." However, this would be a huge
mistake.
Have you taken a moment to view your beautiful slider with JavaScript turned off? (Download the
Web Developer Toolbar for an easy way to do so.) It might break your site completely. As a rule of thumb, design your site assuming that JavaScript will be disabled. Then, once you've done so, begin to progressively enhance your layout!
11. 不要向SetInterval或SetTimeOut傳入字串
Consider the following code:
setInterval(
"document.getElementById('container').innerHTML += 'My new number: ' + i", 3000
);
"document.getElementById('container').innerHTML += 'My new number: ' + i", 3000
);
Not only is this code inefficient, but it also functions in the same way as the "eval" function would. Never pass a string to SetInterval and SetTimeOut. Instead, pass a function name.
setInterval(someFunction, 3000);
12. 避免使用With語句
At first glance, "With" statements seem like a smart idea. The basic concept is that they can be used to provide a shorthand for accessing deeply nested objects. For example...
with (being.person.man.bodyparts) {
arms = true;
legs = true;
}
arms = true;
legs = true;
}
-- instead of --
being.person.man.bodyparts.arms = true;
being.person.man.bodyparts.legs= true;
being.person.man.bodyparts.legs= true;
Unfortunately, after some testing, it was found that they "behave very badly when setting new members." Instead, you should use var.
var o = being.person.man.bodyparts;
o.arms = true;
o.legs = true;
o.arms = true;
o.legs = true;
13. 使用 {} 替代 New Object()
There are multiple ways to create objects in JavaScript. Perhaps the more traditional method is to use the "new" constructor, like so:
var o = new Object();
o.name = 'Jeffrey';
o.lastName = 'Way';
o.someFunction = function() {
console.log(this.name);
}
o.name = 'Jeffrey';
o.lastName = 'Way';
o.someFunction = function() {
console.log(this.name);
}
However, this method receives the "bad practice" stamp without actually being so. Instead, I recommend that you use the much more robust object literal method.
推薦
var o = {
name: 'Jeffrey',
lastName = 'Way',
someFunction : function() {
console.log(this.name);
}
};
name: 'Jeffrey',
lastName = 'Way',
someFunction : function() {
console.log(this.name);
}
};
Note that if you simply want to create an empty object, {} will do the trick.
var o = {};
"Objects literals enable us to write code that supports lots of features yet still make it a relatively straightforward for the implementers of our code. No need to invoke constructors directly or maintain the correct order of arguments passed to functions,
etc." - dyn-web.com
14. 使用[] 替代 New Array()
The same applies for creating a new array.
Okay
var a = new Array();
a[0] = "Joe";
a[1] = 'Plumber';
a[0] = "Joe";
a[1] = 'Plumber';
推薦:
var a = ['Joe','Plumber'];
"A common error in JavaScript programs is to use an object when an array is required or an array when an object is required. The rule is simple: when the property names are small sequential integers, you should use an array. Otherwise, use an object." - Douglas
Crockford
15. 一次性宣告多個變數使用逗號分隔
var someItem = 'some string';
var anotherItem = 'another string';
var oneMoreItem = 'one more string';
var anotherItem = 'another string';
var oneMoreItem = 'one more string';
推薦:
var someItem = 'some string',
anotherItem = 'another string',
oneMoreItem = 'one more string';
anotherItem = 'another string',
oneMoreItem = 'one more string';
...Should be rather self-explanatory. I doubt there's any real speed improvements here, but it cleans up your code a bit.
17. 記得一直要加分號
Technically, most browsers will allow you to get away with omitting semi-colons.
var someItem = 'some string'
function doSomething() {
return 'something'
}
function doSomething() {
return 'something'
}
Having said that, this is a very bad practice that can potentially lead to much bigger, and harder to find, issues.
Better
var someItem = 'some string';
function doSomething() {
return 'something';
}
function doSomething() {
return 'something';
}
18. "For in" 語句
When looping through items in an object, you might find that you'll also retrieve method functions as well. In order to work around this, always wrap your code in an if statement which filters
the information
for(key in object) {
if(object.hasOwnProperty(key) {
...then do something...
}
}
if(object.hasOwnProperty(key) {
...then do something...
}
}
As referenced from JavaScript: The Good Parts, by Douglas Crockford.
19. 使用 Firebug's "Timer" 功能優化程式碼
Need a quick and easy way to determine how long an operation takes? Use Firebug's "timer" feature to log the results.
function TimeTracker(){
console.time("MyTimer");
for(x=5000; x > 0; x--){}
console.timeEnd("MyTimer");
}
console.time("MyTimer");
for(x=5000; x > 0; x--){}
console.timeEnd("MyTimer");
}
20. 讀書,讀書,讀書...
While I'm a huge fan of web development blogs (like this one!), there really isn't a substitute for a book when grabbing some lunch, or just before you go to bed. Always keep a web development
book on your bedside table. Here are some of my JavaScript favorites.
- Object-Oriented JavaScript
- JavaScript: The Good Parts
- Learning jQuery 1.3
- Learning JavaScript
Read them...multiple times. I still do!
21. 自我執行函式
Rather than calling a function, it's quite simple to make a function run automatically when a page loads, or a parent function is called. Simply wrap your function in parenthesis, and then
append an additional set, which essentially calls the function.
(function doSomething() {
return {
name: 'jeff',
lastName: 'way'
};
})();
return {
name: 'jeff',
lastName: 'way'
};
})();
22. 原生JavaScript永遠比第三方類庫更快
JavaScript libraries, such as jQuery and Mootools, can save you an enormous amount of time when coding -- especially with AJAX operations. Having said that, always keep in mind that a library
can never be as fast as raw JavaScript (assuming you code correctly).
jQuery's "each" method is great for looping, but using a native "for" statement will always be an ounce quicker.
23. 使用Crockford's JSON.Parse
Although JavaScript 2 should have a built-in JSON parser, as of this writing, we still need to implement our own. Douglas Crockford, the creator of JSON, has already created a parser that you
can use. It can be downloaded HERE.
Simply by importing the script, you'll gain access to a new JSON global object, which can then be used to parse your .json file.
var response = JSON.parse(xhr.responseText);
var container = document.getElementById('container');
for(var i = 0, len = response.length; i < len; i++) {
container.innerHTML += '<li>' + response[i].name + ' : ' + response[i].email + '</li>';
}
var container = document.getElementById('container');
for(var i = 0, len = response.length; i < len; i++) {
container.innerHTML += '<li>' + response[i].name + ' : ' + response[i].email + '</li>';
}
24. 去掉 "Language"
Years ago, it wasn't uncommon to find the "language" attribute within script tags.
<script type="text/javascript" language="javascript">
...
</script>
...
</script>
However, this attribute has long since been deprecated; so leave it out.
That's All, Folks
相關文章
- 給JavaScript初學者的24條最佳實踐JavaScript
- JavaScript 最佳實踐JavaScript
- JavaScript最佳實踐:效能JavaScript
- JavaScript 開發最佳實踐JavaScript
- 45個實用的JavaScript技巧、竅門和最佳實踐JavaScript
- JavaScript 專案最佳實踐指南JavaScript
- 45個有用的JavaScript技巧,竅門和最佳實踐JavaScript
- JavaScript 建立物件模式與最佳實踐JavaScript物件模式
- JavaScript Web 應用最佳實踐分析JavaScriptWeb
- 10 個你需要了解的最佳 javascript 開發實踐JavaScript
- 7 個 jQuery 最佳實踐jQuery
- webService幾個最佳實踐Web
- JavaScript 錯誤處理的最佳實踐JavaScript
- 實踐中悟出的最佳JavaScript開發JavaScript
- Apache Kafka 12個最佳實踐ApacheKafka
- 7個API安全最佳實踐API
- WebGPU 的幾個最佳實踐WebGPU
- 20 個 OpenSSH 最佳安全實踐
- 十個JDBC的最佳實踐JDBC
- 超實用的JavaScript技巧及最佳實踐(上)JavaScript
- JavaScript 建立物件: 方法一覽與最佳實踐JavaScript物件
- 8個雲成本最佳化的最佳實踐
- 使用GitHub的十個最佳實踐Github
- 5個async/await最佳實踐AI
- 10個專案文件最佳實踐
- 10 個專案文件最佳實踐
- JavaScript 最佳實踐:幫你提升程式碼質量JavaScript
- 有效的微服務:10 個最佳實踐微服務
- 有效尋源的4個最佳實踐
- 10個Spring Boot效能最佳實踐Spring Boot
- Pika最佳實踐
- Flutter 最佳實踐Flutter
- MongoDB 最佳實踐MongoDB
- 《.NET最佳實踐》
- Django 最佳實踐Django
- metaq最佳實踐
- Iptables 最佳實踐 !
- Java最佳實踐Java