javascript
JavaScript的数据访问总结
數(shù)據(jù)存儲共有4中方式:直接量、變量、數(shù)組項、對象成員。
訪問直接量和局部變量的時間快,訪問數(shù)組元素和對象成員相對較慢。局部變量存在于作用域鏈的起始位置,因此訪問局部變量比訪問跨作用域變量更快。全局變量總處于作用鏈的最末端,因此訪問速度也是最慢的。
通常把常用的對象成員、數(shù)組元素、跨域變量保存到局部變量中來改善JavaScript的性能。
1. js四種基本的數(shù)據(jù)存儲位置:
? ?1) 直接量: 只代表本身,不存儲在特定位置(字符串, 數(shù)字, 布爾值, 對象, 數(shù)組, 函數(shù), 正則表達式, null, undifined)
? ?2) 變量: 用關(guān)鍵字var定義的數(shù)據(jù)存儲單元, 函數(shù)內(nèi)部聲明的時候一定要用var, 否則是全局變量
? ?3) 數(shù)組元素: 存儲在js數(shù)組對象內(nèi)部, 以數(shù)字作為索引.
? ?4) 對象成員:?存儲在js數(shù)組對象內(nèi)部, 以字符串作為索引.
? ?性能方面取決于瀏覽器分別對這四種數(shù)據(jù)存儲位置進行200000次操作所用的時間. 直接量和局部變量的訪問速度快于數(shù)組項和對象成員的訪問速度。
2. 管理作用域(比如確定那些變量可以被函數(shù)訪問, 確定this的賦值)
? ?1) 作用域鏈和標(biāo)識符解析
? ? ? ?內(nèi)部屬性[Scope]:包含了一個函數(shù)被創(chuàng)建的作用域中對象的集合. 這個集合被稱為函數(shù)的作用域鏈,決定了那些數(shù)據(jù)能被函數(shù)訪問.
? ? ? ?執(zhí)行函數(shù)時會創(chuàng)建一個成為'運行上下文'的內(nèi)部對象, 每個運行期上下文都有自己的作用域鏈,用于標(biāo)識符解析.
? ?2) 標(biāo)識符解析的性能
? ? ? ?一個標(biāo)識符所在的位置越深,它的讀寫速度就越慢.函數(shù)中讀寫局部變量是最快的,讀寫全局變量(總是處于運行期上下文作用域鏈的最末端)是最慢的(Chrome和Safari 4 不會出現(xiàn)這種問題).
? ? ? ?跨作用域的值(如document)在函數(shù)中被引用一次以上, ?那么就把它存儲到局部變量里.
? ?3) 改變作用域鏈
? ? ? ?with語句用來給對象的所有屬性創(chuàng)建一個變量. (實際功能用來避免書寫重復(fù)代碼),但是訪問布局變量變慢了。(避免使用)
? ? ? ?try-catch,在catch代碼塊內(nèi)部,函數(shù)所有局部變量將會放在第二個作用域鏈對象中.但他不是用來解決js錯誤的。(小心使用)
? ?4) 動態(tài)作用域(只有確實有必要時再用)
? ? ? ?with
? ? ? ?try-catch
? ? ? ?eval()函數(shù),可計算某個字符串,并執(zhí)行其中的的 JavaScript 代碼。
? ?5) 閉包, 作用域和內(nèi)存
? ? ? ?閉包: 允許函數(shù)訪問布局作用域之外的數(shù)據(jù).?能夠讀取其他函數(shù)內(nèi)部變量的函數(shù),?由于在Javascript語言中, 只有函數(shù)內(nèi)部的子函數(shù)才能讀取局部變量, 因此可以把閉包簡單理解成“定義在一個函數(shù)內(nèi)部的函數(shù)”。
? ? ? ?閉包作用:?一個是前面提到的可以讀取函數(shù)內(nèi)部的變量,另一個就是讓這些變量的值始終保持在內(nèi)存中。
3. 對象成員
? ?DOM: 文檔對象模型
? ?BOM: 瀏覽器對象模型
? ?對象成員包含屬性和方法,包含任何數(shù)據(jù)類型,既可以說他是函數(shù)也可以是一種對象。
? ?一個命名的成員引用了一個函數(shù),該成員就被成為一個' 方法 '。一個非函數(shù)類型的成員被稱為' 屬性 '。
? ?對象類型:實例成員(存在于對象實例中)和原型成員(由對象原型繼承而來)。
? 1) 原型
? ? ? 對象通過一個內(nèi)部屬性綁定到它的原型。內(nèi)部屬性 _proto_ 與屬性中的function并存,屬性中hasOwnProperty()=> 判斷對象是否包含特定的實例成員;in操作=>確定對象是否包含特定的屬性(實例和原型)
? 2) 原型鏈
? ? ? 構(gòu)造器Book用來創(chuàng)建了一個新的Book實例book1。book1的原型(_proto_)是Book.prototype,Book.prototype的原型是Object.這個過程創(chuàng)建了一個原型鏈,book1和book2繼承了它們的成員。
? ? ??
? 3) 嵌套成員
嵌套越深,訪問越慢,影響性能,盡量少用。
? 4) 緩存對象成員值(不適用于對象)
使用一次以上,將值存儲到局部變量使用,局部變量訪問速度快。
?
轉(zhuǎn)載于:https://www.cnblogs.com/floraCnblogs/p/js-data-access.html
總結(jié)
以上是生活随笔為你收集整理的JavaScript的数据访问总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (转载)Unity中解析ini配置文件-
- 下一篇: JS基础:1