String.length如何在JavaScript中运行?

时间:2013-10-15 17:16:28

标签: javascript

我想知道字符串的字符串长度是如何用js计算的。 是函数调用还是类数据成员。 我想知道当我们执行以下代码时会发生什么:

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背后的处理以及循环字符串时哪种做法更好?

3 个答案:

答案 0 :(得分:5)

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

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

你必须记住:查询字符串的长度很快,因为没有计算。什么不太快就是构建字符串(例如连接)。

答案 1 :(得分:3)

字符串是原始类型。至少文档就是这么说的。但是我们可以访问字符串的长度,就像访问对象的属性一样(带点符号)。哪个表明它是一个对象,对吗?

结果是,每当我们使用点表示法(例如,长度)从字符串基元到某个属性进行调用时,Js引擎都会采用该基元字符串并将其包装到等效的包装对象中,该包装对象是字符串对象。然后,该String对象上的.length返回长度。

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

希望这能带来一些高级了解。

答案 2 :(得分:1)

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

我也对这个难题感到好奇,所以我自己做了一些搜索,最终找到了-

基于String documentation from Mozilla

  

字符串文字(用双引号或单引号引起来)和字符串   在非构造函数上下文中从String调用返回的值(即,   使用new关键字)是原始字符串。自动JavaScript   将原语转换为String对象,以便可以使用   原始字符串的字符串对象方法。 在以下情况下   方法将在原始字符串或属性查找上调用   发生这种情况时,JavaScript会自动包装原始字符串和   调用该方法或执行属性查找。

据我了解,当您使用somestring.length时,原始字符串将首先包装为String对象,然后由于该对象具有其属性长度,因此它只是内部方法调用,用于访问和返回