Javascript 将数组连接到字符串
Javascript Concatenate Array to String
我正在使用D3.js并且经常发现自己动态构建transform
属性(或path
元素上的d
属性(。 这两者都通常需要多个逗号分隔的数字。
有时我通过将数组连接到字符串来构建字符串:
var x = 0,
y = 1,
path = 'M0,0 L' + [x, y];
有时我通过手动添加逗号来构建字符串:
var x = 0,
y = 1,
path = 'M0,0 L' + x + ',' + y;
我决定我应该尝试坚持一种方法或另一种方法,并且想知道哪种方法更好。
以下是我考虑过的几件事:
- 我知道调用
join()
比手动连接逗号慢,但这是浏览器将数组连接到字符串时所做的吗? - 第二种格式可以在任何浏览器中使用。 是否有任何浏览器不支持第一种格式?
- 第一种格式使用较少的字符(保持较小的文件大小始终是一个加号(。
- 就个人而言,我认为第一种格式更具可读性。
有没有一种方法绝对比另一种更好? 还是我只是吹毛求疵?
当 JavaScript 将数组强制转换为字符串时,它实际上在数组上调用: .join(',')
。因此,您实际上可以通过手动.join(',')
获得更好的性能,而不是让解释器来注意到您正在强制数组。所以:x + ',' + y
是最快的,[x, y].join(',')
是最佳实践(因为它可以更轻松地修改行为(,[x, y]
比手动调用.join
慢一点,有时可能无法读取,但它更方便。
简短的回答:使用array.join。
长答案:
首先,连接并不比使用 array.join(( 快,它更慢。 这是因为每次连接时都会销毁两个字符串并创建一个新字符串。
采用以下代码:
<script>
function concat(){
var txt = '';
for (var i = 0; i < 1000000; i++){
txt =+ i + ',';
}
}
function arr(ar){
var txt = 'asdf' + ar;
}
ar = [];
for (var i = 0; i < 1000000; i++) {
ar.push(i);
}
concat();
arr(ar);
alert('done!');
</script>
并将其粘贴到 HTML 文件中。然后对其进行分析。在我的机器上(Core i7EE,16GB RAM,SSD磁盘,IE9(,arr((需要0ms,concat((需要12ms。请记住,这是超过一百万次迭代(同样的测试在IE6上会有很大的不同,concat((需要几秒钟(。
其次,当只有两个值时,串联将采用与 array.join 相同的方法。因此,对于您的示例,从性能的角度来看,它们都是等效的。如果您采用上述代码并将 1000000 更改为 4,则 Concat 和 ARR 都需要 0ms 才能执行。这意味着您的特定流的差异要么不存在,要么可以忽略不计,它不会显示在配置文件中。
第三,现代浏览器无论如何都使用 array.join(( 优化字符串连接,因此从性能的角度来看,讨论可能没有实际意义。
这给我们留下了风格。就个人而言,我不会使用第一种形式,因为我不喜欢手动连接字符串(当你有 2 个变量时,它相当简单,但是如果你有 10 个变量怎么办? 这将形成一行很长的代码。如果你收到一个有 n 个值的数组怎么办,就会出现一个 for 循环(。我也不会使用第二种形式,因为正如另一个答案所指出的,值被强制为字符串,这意味着正在进行一些隐式转换。这里的问题是隐含的部分。我知道现在数组在强制时用逗号连接,但是如果规范发生变化,或者某个天才决定在您的代码库中更改 Array.prototype 的 toString 实现会发生什么?只是为了好玩,在 JSFIDDLE 中运行这个:
Array.prototype.toString = function() {
return 'not the expected result!';
}
alert([1, 2]);
你能猜出答案会是什么吗?(上面的代码将为数组执行与您的代码相同的转换。
如果你使用 array.join(','(; 你将通过声明 1( 无论 toString 实现如何,你的数组都将被连接,2( 它将用逗号连接,从而证明你的代码是未来的。
- 当附加到DOM时,可以将变量与字符串连接起来吗?它能处理逃跑吗
- 将变量与字符串连接以定义另一个变量
- AJAX 后请求和字符串连接
- 哪种方式在Javascript,字符串连接或数组中更好
- Javascript 字符串连接错误
- Javascript - 使用字符串连接设置变量
- 换行符及其在 Javascript 中的字符串连接中的作用
- 下划线.js if 语句上的字符串连接
- 以下jQuery字符串连接代码有什么问题
- XMLHttpRequest 中表单数据上的 Javascript 二进制字符串连接
- JavaScript 字符串连接不起作用
- 是否可以在 JavaScript 中将 OBJ 与字符串连接起来
- Jquery 字符串连接
- 谁能解释这种关于字符串连接的奇怪 JS 行为
- 将我的对象与字符串连接
- JavaScript 中的字符串连接
- 分配期间的JavaScript字符串连接
- 在AngularJS中使用HTML img src中的字符串连接
- JavaScript-将多个字符串连接在一起
- 字符串连接与 ( document.getElementById().value).