簡體   English   中英

String.length 在 JavaScript 中是如何工作的?

[英]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 返回長度。

有趣的是,當我們做這樣的事情時,我們的字符串在所有這些過程中仍然保持相同的原始字符串。 並創建了一個臨時對象來使我們的字符串操作工作。 一旦獲取了所需的屬性,這個臨時對象就會從內存中刪除。

希望這能提供一些高層次的理解。

我在回答你的第一個問題。

我也對這個謎題很好奇,所以我自己做了一些搜索,最終發現——

基於Mozilla 的 String 文檔

字符串文字(由雙引號或單引號表示)和從非構造函數上下文中的 String 調用返回的字符串(即,不使用 new 關鍵字)是原始字符串。 JavaScript 會自動將原始類型轉換為 String 對象,因此可以將 String 對象方法用於原始字符串。 要在原始字符串上調用方法或發生屬性查找的上下文中,JavaScript 將自動包裝字符串原始並調用方法或執行屬性查找。

所以據我了解,當你使用somestring.length ,原始字符串將首先被包裝為一個 String 對象,然后由於該對象有它的屬性 length,所以它只是一個內部方法調用來訪問和返回。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM