[英]How does String.length work in JavaScript?
我想知道在js中字符串的字符串長度是如何計算的。 Is 是函數調用或類數據成員。 我想知道當我們執行以下代碼時會發生什么:
a = 'this is a string';
console.log(a.length); // what actually happens at this point?
此外,如果這樣做:
a += ' added something';
console.log(a.length); // at what point is the new length calculated
//and/or updated for the object 'a';
最后,我是否需要在使用字符串循環時將字符串長度存儲在臨時變量中,或者我可以直接使用以下內容(哪個更快/處理器效率更高):
for(var i=0;i<a.length;i++){
// doing anything here
}
總結我的問題,我想知道 String.length 背后的處理,以及循環遍歷字符串時哪種做法更好?
字符串在 JavaScript 中是不可變的。
a += "somestring"
不會改變字符串的長度,而是生成一個新字符串。
這意味着沒有“新長度”,但長度只是字符串定義的一部分(更准確地說,它在實現中存儲在相同的結構中)。
關於
for(i=0;i<a.length;i++){ // did you forget the 'var' keyword ?
一種並不罕見的做法(如果您不更改a
)是將其優化為
for (var i=0, l=a.length; i<l; i++)
為了避免讀取長度,但是如果您將性能與現代引擎進行比較,您會發現這不會使代碼變得更快。
您必須記住:查詢字符串的長度很快,因為沒有計算。 稍微慢一點的是構建字符串(例如使用連接)。
字符串是一種原始類型。 至少文檔是這么說的。 但是我們可以像訪問對象的屬性一樣訪問字符串的長度(使用點符號)。 這表明它是一個對象,對吧?
事實證明,每當我們使用點表示法(例如,長度)從字符串原語調用某個屬性時,Js 引擎將獲取這個原語字符串並將其包裝到等效的包裝器對象中,該對象是一個 String 對象。 然后,該 String 對象上的 .length 返回長度。
有趣的是,當我們做這樣的事情時,我們的字符串在所有這些過程中仍然保持相同的原始字符串。 並創建了一個臨時對象來使我們的字符串操作工作。 一旦獲取了所需的屬性,這個臨時對象就會從內存中刪除。
希望這能提供一些高層次的理解。
我在回答你的第一個問題。
我也對這個謎題很好奇,所以我自己做了一些搜索,最終發現——
字符串文字(由雙引號或單引號表示)和從非構造函數上下文中的 String 調用返回的字符串(即,不使用 new 關鍵字)是原始字符串。 JavaScript 會自動將原始類型轉換為 String 對象,因此可以將 String 對象方法用於原始字符串。 在要在原始字符串上調用方法或發生屬性查找的上下文中,JavaScript 將自動包裝字符串原始並調用方法或執行屬性查找。
所以據我了解,當你使用somestring.length
,原始字符串將首先被包裝為一個 String 對象,然后由於該對象有它的屬性 length,所以它只是一個內部方法調用來訪問和返回。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.