分享9點(diǎn)個(gè)人認(rèn)為比較重要的javascript 編程技巧
1.巧用判斷:
在js中,NaN,undefined,Null,0,"" 在轉(zhuǎn)換為bool的時(shí)候,是false,所以,可以這樣寫(xiě)。
if(!obj) {}
表示一個(gè)對(duì)象如果為false的時(shí)候所做的事情,因?yàn)槿绻鹢bj為以上任何一個(gè),那么就是false,!false即是true,這樣,就不需要 if(obj==null || obj == NaN ....)。
2.巧用運(yùn)算符:
有一個(gè)很經(jīng)典的技巧,得到時(shí)間戳。
var dataspan = new Date()*1;
我們知道,js是弱類(lèi)型語(yǔ)言,Date()會(huì)返回一個(gè)表示時(shí)間的字符串,用這個(gè)字符串進(jìn)行算術(shù)運(yùn)算,將得到轉(zhuǎn)換,也就是結(jié)果的時(shí)間戳。
3.巧用正則表達(dá)式:
/.a/ig.exec('xsas')
//相當(dāng)于創(chuàng)建一個(gè)reg對(duì)象,調(diào)用了exec方法,當(dāng)然也能調(diào)用其他的方法,如:test(),match()等。
4.取數(shù)組最大值和最小值:
var values = [1,2,3,40,23];
var max = Math.Max.apply(Math,values);
調(diào)用Max.apply,設(shè)置對(duì)象的為Math,然后傳遞一個(gè)Values,就能確定最大值。
5.內(nèi)存優(yōu)化:
function p(){this.p='moersing'}; var p1 = new p();
p1.xx
p1.xx
.......
p1=null; //執(zhí)行完操作之后,最后手動(dòng)解除對(duì)p1的引用。
6.最受歡迎的創(chuàng)建對(duì)象方式(原型模式):
function c(){
this.name ='moersing';
this.age=18;
this.books=['javascript develop','C# develop'];
}
c.prototype={
displayBookName:function (){
foreach(var t in this.books)
{
document.write(this.books[t]);
}
}
}
原型構(gòu)造模式的最大缺點(diǎn)在于引用類(lèi)型的共享,所以,將引用類(lèi)型定義在構(gòu)造函數(shù)中,而將通用方法定義在原型中,使用this引用。
7.塊級(jí)作用域和私有變量
在javascript中,沒(méi)有塊級(jí)作用域和私有變量這一說(shuō),但是,利用一些特性,則能模仿這些效果。
7.1塊級(jí)作用域:
(function(){
//塊級(jí)作用域
}
)();
匿名函數(shù)外面加上一個(gè)括號(hào),我管它叫"函數(shù)標(biāo)準(zhǔn)化",也就是說(shuō),可以像標(biāo)準(zhǔn)函數(shù)那樣調(diào)用,如:
var name =function(){};
(name)();//一般不會(huì)這么寫(xiě);
這么做的好處就是,在()外部無(wú)法訪問(wèn)到函數(shù)中變量,也就成了塊級(jí)作用域,這種方式一般用在編寫(xiě)插件的時(shí)候,不會(huì)再全局 (global)中添加額外的變量,而且,在函數(shù)執(zhí)行完畢之后,其內(nèi)部定義的變量就被銷(xiāo)毀了,所以,也不會(huì)有閉包特性存在的問(wèn)題。
7.2私有變量:
function private()
{
var name = 'moersing';
this.getName = function(){
return this.name;
}
}
私有變量實(shí)際上就是利用函數(shù)的作用域作為限制(外部無(wú)法訪問(wèn)),然后定義一個(gè)方法,這個(gè)方法返回相應(yīng)的變量,僅此而已。
8.DOM之NodeList:
nodeList是一個(gè)動(dòng)態(tài)的元素,這意味著,在文檔中添加任何元素,nodeList都會(huì)實(shí)時(shí)更新,如:
var alldiv = document.getElementsByTagName('div');
for(var i=0;i<alldiv.length;i++)
{
var div = document.createElement('div');
div.innerHTML= i.toString();
document.body.appendChild(div);
}
這段代碼會(huì)造成無(wú)限循環(huán),在循環(huán)里面創(chuàng)建了一個(gè)div,然后appendChild方法將其添加到body中,那么,所有alldiv會(huì)立即就更新,所以,i<alldiv.length永遠(yuǎn)無(wú)法成立,要解決這個(gè)問(wèn)題,可以使用下面方式:
var alldiv = document.getElementsByTagName('div');
var len,i;
for(i=0,len=alldiv.length;i<len;i++)
{
var div = document.createElement('div');
div.innerHTML= i.toString();
document.body.appendChild(div);
}
這里建議:最好不要頻繁的對(duì)NodeList操作,因?yàn)槊看尾僮鞫紩?huì)執(zhí)行一次DOM樹(shù)的查詢(xún)。
除了以上介紹的方法外,HTML5 新加入的API(selector API Level1)也能解決這個(gè)問(wèn)題,它類(lèi)似C#的linq及時(shí)查詢(xún),至于什么是linq及時(shí)查詢(xún),以后我會(huì)更新blog,敬請(qǐng)關(guān)注:
var allDiv= document.querySelectorAll('div');
for(var i=0;i<alldiv.length;i++)
{
var div = document.createElement('div');
div.innerHTML= i.toString();
document.body.appendChild(div);
}
querySelectorAll需要一個(gè)參數(shù),一個(gè)CSS選擇器,類(lèi)似jquery中的$(),它返回的NodeList是一個(gè)及時(shí)的,非動(dòng)態(tài)的DOM集合。
另外還有一個(gè)querySelector,返回匹配的第一個(gè)元素,有關(guān)HTML5 API 詳 見(jiàn)
http://www.w3.org/standards/techs/dom#w3c_all
或者
https://developer.mozilla.org/zh-CN/docs/Web/API
另外,本人也在醞釀一篇blog,專(zhuān)門(mén)講HTML5 API的,敬請(qǐng)關(guān)注。
9.DOM性能:
不要做這種傻事(我做過(guò)。。。)
for(var i=0;i<10;i++)
{
document.querySelector('ul').innerHTML="<li>"+i+"</li>";
}
給對(duì)象的innerHTML賦值,會(huì)調(diào)用內(nèi)置的C++解析器解析這個(gè)字符串,雖然速度很快,但是最好不要這樣操作,會(huì)有一定的性能流失。
最好這樣做:
var ih=null;
for(var i=0;i<10;i++)
{
ih+="<li>"+i+"</li>";
}
document.querySelector('ul').innerHTML=ih;
另外的一些性能優(yōu)化話題,等有時(shí)間再更新。
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
- jser必看的破解javascript各種加密的反向思維方法
- JavaScript 學(xué)習(xí)技巧
- JavaScript 語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)總結(jié)(思維導(dǎo)圖)
- 45個(gè)JavaScript編程注意事項(xiàng)、技巧大全
- 學(xué)習(xí)JavaScript編程語(yǔ)言的8張思維導(dǎo)圖分享
- 分享10個(gè)原生JavaScript技巧
- Javascript常用小技巧匯總
- javascript 應(yīng)用小技巧方法匯總
- javascript學(xué)習(xí)總結(jié)之js使用技巧
- javascript同步服務(wù)器時(shí)間和同步倒計(jì)時(shí)小技巧
- 快速學(xué)習(xí)JavaScript的6個(gè)思維技巧
相關(guān)文章
JS庫(kù) Highlightjs 添加代碼行號(hào)的實(shí)現(xiàn)代碼
Highlightjs是一款優(yōu)秀的代碼高亮Js組件,可以很方便地對(duì)各種語(yǔ)言編寫(xiě)的代碼添加語(yǔ)法高亮樣式。本文重點(diǎn)給大家介紹Highlightjs 添加代碼行號(hào)的實(shí)現(xiàn)代碼,需要的朋友參考下吧2017-09-09BootStrap實(shí)現(xiàn)響應(yīng)式布局導(dǎo)航欄折疊隱藏效果(在小屏幕、手機(jī)屏幕瀏覽時(shí)自動(dòng)折疊隱藏)
這篇文章主要介紹了BootStrap實(shí)現(xiàn)導(dǎo)航欄的響應(yīng)式布局,當(dāng)在小屏幕、手機(jī)屏幕瀏覽時(shí)自動(dòng)折疊隱藏的效果,非常不錯(cuò),具有參考借鑒價(jià)值,對(duì)bootstrap 響應(yīng)式布局導(dǎo)航欄功能感興趣的朋友一起學(xué)習(xí)吧2016-11-11js canvas實(shí)現(xiàn)5張圖片合成一張圖片
這篇文章主要為大家詳細(xì)介紹了js canvas實(shí)現(xiàn)5張圖片合成一張圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07密碼強(qiáng)度檢測(cè)效果實(shí)現(xiàn)原理與代碼
密碼強(qiáng)度檢測(cè)有利于提醒增加密碼的安全指數(shù),更好的保護(hù)密碼安全,接下來(lái)介紹密碼強(qiáng)度檢測(cè)效果的實(shí)現(xiàn)2013-01-01JavaScript函數(shù)式編程(Functional Programming)純函數(shù)用法分析
這篇文章主要介紹了JavaScript函數(shù)式編程(Functional Programming)純函數(shù)用法,結(jié)合實(shí)例形式分析了javascript函數(shù)式編程中純函數(shù)的函數(shù)依賴(lài)、所指透明等概念相關(guān)原理及使用技巧,需要的朋友可以參考下2019-05-05IE6-IE9不支持table.innerHTML的解決方法分享
讓ie6-ie9支持table.innerHTML,其實(shí)這里只是對(duì)table做了處理,對(duì)其他不支持的元素可以用類(lèi)似的方案2012-09-09JS尾遞歸的實(shí)現(xiàn)方法及代碼優(yōu)化技巧
這篇文章主要介紹了JS尾遞歸的實(shí)現(xiàn)方法及代碼優(yōu)化技巧,結(jié)合實(shí)例形式分析了尾遞歸的原理、JS實(shí)現(xiàn)方法及優(yōu)化技巧,需要的朋友可以參考下2019-01-01js中bool值的轉(zhuǎn)換及“&&”、“||”、 “!!”詳解
這篇文章主要給大家介紹了關(guān)于js中bool值的轉(zhuǎn)換方法以及"&&" 、"||"、 "!!"的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友下面來(lái)一起看看吧。2017-12-12