2

我想知道在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 背后的处理以及在遍历字符串时哪种做法更好?

4

3 回答 3

6

字符串在 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++)

为了避免读取长度,但是如果您将性能与现代引擎进行比较,您会发现这并没有使代码现在变得更快。

您必须记住:查询字符串的长度很快,因为没有计算。构建字符串的速度稍慢一些(例如使用连接)。

于 2013-10-15T17:18:15.473 回答
5

字符串是一种原始类型。至少文档是这么说的。但是我们可以像访问对象的属性一样访问字符串的长度(使用点表示法)。这表明它是一个对象,对吧?

事实证明,每当我们使用点表示法(例如,长度)从字符串原语调用某个属性时,Js 引擎都会获取这个原语字符串并将其包装到等效的包装对象中,这是一个字符串对象。然后,该 String 对象上的 .length 返回长度。

有趣的是,当我们做这样的事情时,我们的字符串在所有这些过程中仍然保持相同的原始字符串。并创建了一个临时对象来使我们的字符串操作起作用。一旦获取了所需的属性,这个临时对象就会从内存中删除。

希望这能提供一些高层次的理解。

于 2020-07-27T15:48:15.097 回答
2

我在回答你的第一个问题。

我也对这个谜题很好奇,所以我自己做了一些搜索,最后发现-

基于来自 Mozilla 的字符串文档

字符串文字(用双引号或单引号表示)和从非构造函数上下文中的 String 调用返回的字符串(即,不使用 new 关键字)是原始字符串。JavaScript 自动将原语转换为 String 对象,因此可以将 String 对象方法用于原语字符串。在原始字符串上调用方法或发生属性查找的上下文中,JavaScript 将自动包装字符串原始并调用方法或执行属性查找。

所以据我了解,当你使用时somestring.length,原始字符串首先会被包装成一个String对象,然后由于该对象有它的属性长度,所以它只是一个访问和返回的内部方法调用。

于 2018-07-25T03:53:50.487 回答