javascript性能優化

来源:http://www.cnblogs.com/mengfangui/archive/2017/12/03/7966540.html
-Advertisement-
Play Games

1、尊重對象所有權  不要為實例或原型添加屬性; 不要為實例或原型添加方法; 不要重定義已存在的方法。 最佳的方法便是永遠不修改不是由你所有的對象。所謂擁有對象,就是說這個對象是你創建的,比如你自己創建的自定義類型或對象字面量。而 Array 、 document 這些顯然不是你的,它們在你的 ...


1、尊重對象所有權

 不要為實例或原型添加屬性;
 不要為實例或原型添加方法;
 不要重定義已存在的方法。

 最佳的方法便是永遠不修改不是由你所有的對象。所謂擁有對象,就是說這個對象是你創建的,比如你自己創建的自定義類型或對象字面量。而 Array 、 document 這些顯然不是你的,它們在你的代碼執行前就存在了。

 

2、避免全局變數

最多創建一個全局變數,讓其他對象和函數存在其中。請看以下例子:

//兩個全局量——避免!!
var name = "Nicholas";
function sayName(){
alert(name);
}

這段代碼包含了兩個全局量:變數 name 和函數 sayName() 。其實可以創建一個包含兩者的對象,如下例所示:

//一個全局量——推薦
var MyApplication = {
name: "Nicholas",
sayName: function(){
alert(this.name);
}
};

 

3、避免與 null 進行比較

 如果值應為一個引用類型,使用 instanceof 操作符檢查其構造函數;
 如果值應為一個基本類型,使用 typeof 檢查其類型;
 如果是希望對象包含某個特定的方法名,則使用 typeof 操作符確保指定名字的方法存在於對象上。

 

4、使用常量

儘管 JavaScript 沒有常量的正式概念,但它還是很有用的。這種將數據從應用邏輯分離出來的思想,可以在不冒引入錯誤的風險的同時,就改變數據。請看以下例子:

var Constants = {
INVALID_VALUE_MSG: "Invalid value!",
INVALID_VALUE_URL: "/errors/invalid.php"
};
function validate(value){
if (!value){
alert(Constants.INVALID_VALUE_MSG);
location.href = Constants.INVALID_VALUE_URL;
}
}

 

5、避免全局查找

可能優化腳本性能最重要的就是註意全局查找。使用全局變數和函數肯定要比局部的開銷更大,因為要涉及作用域鏈上的查找。請看以下函數:

function updateUI(){
var imgs = document.getElementsByTagName("img");
for (var i=0, len=imgs.length; i < len; i++){
imgs[i].title = document.title + " image " + i;
}
var msg = document.getElementById("msg");
msg.innerHTML = "Update complete.";
}

該函數可能看上去完全正常,但是它包含了三個對於全局 document 對象的引用。如果在頁面上有多個圖片,那麼 for 迴圈中的 document 引用就會被執行多次甚至上百次,每次都會要進行作用域鏈查找。通過創建一個指向 document 對象的局部變數,就可以通過限制一次全局查找來改進這個函數的性能:

function updateUI(){
var doc = document;
var imgs = doc.getElementsByTagName("img");
for (var i=0, len=imgs.length; i < len; i++){
imgs[i].title = doc.title + " image " + i;
}
var msg = doc.getElementById("msg");
msg.innerHTML = "Update complete.";
}

這裡,首先將 document 對象存在本地的 doc 變數中;然後在餘下的代碼中替換原來的 document 。與原來的的版本相比,現在的函數只有一次全局查找,肯定更快。

 

6、性能的其他註意事項

原生方法較快——只要有可能,使用原生方法而不是自己用 JavaScript 重寫一個。原生方法是用諸如 C/C++之類的編譯型語言寫出來的,所以要比 JavaScript 的快很多很多。JavaScript 中最容易被忘記的就是可以在 Math 對象中找到的複雜的數學運算;這些方法要比任何用 JavaScript 寫的同樣方法如正弦、餘弦快的多。
Switch 語句較快 —— 如果有一系列複雜的 if-else 語句,可以轉換成單個 switch 語句則可以得到更快的代碼。還可以通過將 case 語句按照最可能的到最不可能的順序進行組織,來進一步優化 switch 語句。
位運算符較快 —— 當進行數學運算的時候,位運算操作要比任何布爾運算或者算數運算快。選擇性地用位運算替換算數運算可以極大提升複雜計算的性能。諸如取模,邏輯與和邏輯或都可以考慮用位運算來替換。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 當我們寫頁面的時候,不知道你會不會產生這樣的問題,為什麼我給他添加的這條樣式分明已經選擇到我要給的元素了,但是他的樣式並沒有生效,那是為什麼呢? 定義的屬性有衝突時,瀏覽器會選擇用那一套樣式呢,下麵來介紹一下選擇器的優先順序。 一、選擇器的優先順序排序 1. !important 在屬性後面寫上這條樣式 ...
  • Ctrl+N 新建一個編輯區,!加 tab新建一個html骨架完好的文件。 Ctrl+Shift+P開啟命令模式,sshtml 切換html語法。 esc退出,Ctrl+`打開工作台、 Ctrl+Enter 在當前行下添加一行。Ctrl+Shift+Enter 在當前行上添加一行。 Ctrl+P打開 ...
  • .container與.container_fluid是bootstrap中的兩種不同類型的外層容器,按照官方的說法,這兩者的區別是: .container 類用於固定寬度並支持響應式佈局的容器。 .container-fluid 類用於 100% 寬度,占據全部視口(viewport)的容器。 所 ...
  • 在Bootstrap框架中,通過定製了一個類名`form-control`,也就是說,如果這幾個元素使用了類名“form-control”,將會實現一些設計上的定製效果。 1、寬度變成了100% 2、設置了一個淺灰色(#ccc)的邊框 3、具有4px的圓角 4、設置陰影效果,並且元素得到焦點之時,陰 ...
  • Font Awesome 是一個非常方便的圖標庫。這些圖標都是矢量圖形,被保存在 .svg 的文件格式中。這些圖標就和字體一樣,你可以通過像素單位指定它們的大小,它們將會繼承其父HTML元素的字體大小。 你可以將 Font Awesome 圖標庫增添至任何一個應用中,方法很簡單,只需要在你的 HTM ...
  • 前言 我工作以來接觸的第一個項目就是前後端分離的,前端靜態文件有自己獨立功能變數名稱,通過介面來獲取數據進行渲染等操作。 跨域的方法不需要多言,隨便一搜,就有很多,但最常用不外乎jsonp和CORS。jsonp著重於前端,也算是前端Hack技巧,CORS重於後端,服務端需要配置的地方會較多。 這篇解析一下j ...
  • 時間:2017年12月3日 19:35:18 用於: 這文章用於個人技術總結 html筆記1、html標簽不區分大小寫,但是建議小寫2、標簽 可用在head部分: <head> <title>...</title> //網頁標題 <meta charset="UTF-8"> //提供有關頁面信息 < ...
  • 列表標簽 有序列表: <ol><li></li></ol> 無序列表: <ul><li></li></ul> //屬性:font-weight字體粗細 表格: <table> <thead><tr><td></td></tr></thead> //tr行 td列 <tbody><tr><td></t ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...