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