应优先选用模板字面量;若需兼容旧环境,+运算符性能更优且语法直观,concat支持多参数但开销略大,二者对null/undefined均隐式转为字符串。

JavaScript 中拼接字符串,concat 和 + 都能用,但它们不是一回事——选哪个不取决于“谁更高级”,而要看你当前写的代码要解决什么问题、跑在什么环境、是否在意可读性或兼容性。
行为差异:null/undefined 和类型转换
两者都会把 null 和 undefined 转成字符串字面量:
-
"a" + null→"anull" -
"b".concat(undefined)→"bundefined"
但关键区别在于类型处理逻辑:
-
+是运算符,遇到数字会先尝试加法(1 + 2得3),只有**至少一个是字符串**时才转为拼接(1 + "2"→"12") -
concat不管传进来的是数字、布尔、数组还是对象(只要能toString()),一律转成字符串再拼("x".concat(1, true, [2])→"x1true2") -
concat不接受null或undefined作为调用主体(null.concat("a")报错),但可作为参数传入
语法灵活性:多参数 vs 连续拼接
如果你要一次性连五六个片段,concat 写起来更紧凑:
"Hello".concat(" ", name, "!", " Welcome")- 等价写法用
+就是:"Hello" + " " + name + "!" + " Welcome" -
concat还支持传数组,自动展开元素:"a".concat(["b", "c"])→"abc"
不过 ES6 模板字面量基本覆盖了这个优势:`Hello ${name}! Welcome` 更直观,也支持表达式。
性能与执行开销
现代引擎(V8、SpiderMonkey)对 + 做了大量优化,实际运行中它比 concat 略快:
-
+是原生语法,无函数调用栈、无上下文绑定开销 -
concat每次调用都要走方法查找、参数检查、新字符串对象创建流程 - 但在日常开发中,这种差距在纳秒级,人眼和业务逻辑完全感知不到
- 真正影响性能的是频繁拼接(比如循环里不断
+=),这时该用Array.prototype.push()+join()
适用场景建议
不用纠结“必须用哪个”,按实际情况选:
- 写新项目、目标环境支持 ES6 → 优先用模板字面量(
``),语义清、防注入、支持换行和表达式 - 需要兼容 IE8 或旧版 Node.js →
+更稳妥,concat在极老环境里反而更稳定(但已极少遇到) - 封装工具函数、强调“连接”意图(如
joinPath)→concat语义更明确 - 拼接来源混杂(数字、布尔、数组)且不想手动
String()→concat自动处理省心
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











