Javascript 如果我想多次访问它的(object';s)属性,我应该将原语转换为object吗?
例如,假设我有一个名为Javascript 如果我想多次访问它的(object';s)属性,我应该将原语转换为object吗?,javascript,performance,object,primitive,Javascript,Performance,Object,Primitive,例如,假设我有一个名为str的长字符串原语。我知道我可以使用str.substr,因为浏览器在幕后 将str转换为字符串包装器对象,相当于使用newstring(str) 使用步骤1返回的String对象上的正确参数调用substr方法 处置字符串对象 返回步骤2中的字符串(原语) () 但是如果我想多次使用str.substr会发生什么呢?比如说 var positions = [1, 5, 8, 9, 15, ...], //long array substrings = ne
str
的长字符串原语。我知道我可以使用str.substr
,因为浏览器在幕后
str
转换为字符串包装器对象,相当于使用newstring(str)
String
对象上的正确参数调用substr
方法字符串
对象str.substr
会发生什么呢?比如说
var positions = [1, 5, 8, 9, 15, ...], //long array
substrings = new Array(positions.length);
for ( var i = positions.length - 1; i >= 0; --i ) {
substrings[i] = str.substr(positions[i], 2);
}
我是否应该在循环之前将
str
转换为一个对象,以避免在每个步骤中创建和销毁一个对象?有一篇博客专门讨论这个问题
简言之,由于大多数JS引擎都进行了优化,因此在大多数情况下使用基本值的速度更快。但是,在访问原语上的非本机成员时,情况可能并非如此
例如,我们可以在文章中看到:
例如,在SpiderMonkey JS引擎中,处理
使用“get property”操作时,如下所示:
因此,当您请求字符串原语的属性时
属性名为“length”,引擎立即返回其
长度,避免完整属性查找和临时属性查找
包装器对象创建
结论如下:
基于上述基准,我们看到了许多方法
关于字符串声明中的细微差异如何产生
一系列不同的性能结果。建议您
继续像往常一样声明字符串变量,除非
创建的实例有一个非常具体的原因
字符串对象。另外,请注意浏览器的总体性能,
特别是在处理DOM时,它不仅基于
页面的JS性能;浏览器中的内容远不止JS
引擎
.
// direct check for the "length" property
if (typeof(value) == "string" && property == "length") {
return StringLength(value);
}
// generalized code form for properties
object = ToObject(value);
return InternalGetProperty(object, property);