var luke = { jedi: true, age: 28 }; // bad var isJedi = luke['jedi']; // good var isJedi = luke.jedi;
? 當(dāng)以變量的方式訪問(wèn)屬性的時(shí)候,用下標(biāo)符號(hào)([])。——除非特殊需求,否則盡量避免使用obj[variable]的方式進(jìn)行屬性訪問(wèn)。
var luke = { jedi: true, age: 28 }; function getProp(prop) { return luke[prop]; } var isJedi = getProp('jedi');
// bad superPower = new SuperPower(); // good var superPower = new SuperPower();
湯姆大叔—javascript系列文章中提到“JavaScript有隱含的全局概念,意味著你不聲明的任何變量都會(huì)成為一個(gè)全局對(duì)象屬性。在技術(shù)上,隱式全局變量并不是真正的全局變量,但它們是全局對(duì)象的屬性。屬性是可以通過(guò)
delete操作符刪除的,而變量是不能的。"
// bad var items = getItems(); var goSportsTeam = true; var dragonball = 'z'; // good var items = getItems(), goSportsTeam = true, dragonball = 'z';
? 用var定義多個(gè)變量的時(shí)候,把不進(jìn)行賦值的變量放置到最后——這是相當(dāng)有益的。尤其是當(dāng)你的變量需要賦前面變量值的時(shí)候。
// bad var i, len, dragonball, items = getItems(), goSportsTeam = true; // bad var i, items = getItems(), dragonball, goSportsTeam = true, len; // good var items = getItems(), goSportsTeam = true, dragonball, length, i;
? 把你的賦值變量放置在當(dāng)前作用域的頂端。這將避免變量聲明和hoisting(懸置/置頂解析/預(yù)解析)的問(wèn)題。
// bad function() { test(); console.log('doing stuff..'); //..other stuff.. var name = getName(); if (name === 'test') { return false; } return name; } // good function() { var name = getName(); test(); console.log('doing stuff..'); //..other stuff.. if (name === 'test') { return false; } return name; } // bad function() { var name = getName(); if (!arguments.length) { return false; } return true; } // good function() { if (!arguments.length) { return false; } var name = getName(); return true; }
湯姆大叔:1、JavaScript中,你可以在函數(shù)的任何位置聲明多個(gè)var語(yǔ)句,并且它們就好像是在函數(shù)頂部聲明一樣發(fā)揮作用,這種行為稱(chēng)為 hoisting(懸置/置頂解析/預(yù)解析)。2、對(duì)于JavaScript,只 要你的變量是在同一個(gè)作用域中(同一函數(shù)),它都被當(dāng)做是聲明的,即使是它在var聲明前使用的時(shí)候。
function example() { console.log(notDefined); // => throws a ReferenceError } function example() { console.log(declaredButNotAssigned); // => undefined var declaredButNotAssigned = true; } function example() { var declaredButNotAssigned; console.log(declaredButNotAssigned); // => undefined declaredButNotAssigned = true; }
? 匿名表達(dá)式會(huì)自動(dòng)提升它們的變量名稱(chēng)(也就是說(shuō)在var anonymous上面,example函數(shù)就已經(jīng)知道有這個(gè)變量了),但是它們的函數(shù)體不會(huì)。
function example() { console.log(anonymous); // => undefined anonymous(); // => TypeError anonymous is not a function var anonymous = function() { console.log('anonymous function expression'); }; }
? 命名函數(shù)表達(dá)式也會(huì)提升它們的變量名稱(chēng),而它們的函數(shù)名稱(chēng)和函數(shù)體不會(huì)這樣做。
function example() { console.log(named); // => undefined named(); // => TypeError named is not a function superPower(); // => ReferenceError superPower is not defined var named = function superPower() { console.log('Flying'); }; function example() { console.log(named); // => undefined named(); // => TypeError named is not a function var named = function named() { console.log('named'); }; } }
? 注意:函數(shù)聲明會(huì)提升它們的變量名稱(chēng)還有它們的函數(shù)體。
function example() { superPower(); // => Flying function superPower() { console.log('Flying'); } }
== 和 != 會(huì)進(jìn)行隱式類(lèi)型轉(zhuǎn)換,所以建議使用===和!==。
if ([0]) { // true // An array is an object, objects evaluate to true }
? 使用快捷方式。
// bad if (name !== '') { // ...stuff... } // good if (name) { // ...stuff... } // bad if (collection.length > 0) { // ...stuff... } // good if (collection.length) { // ...stuff... }

浙公網(wǎng)安備 33010602011771號(hào)