JavaScript中变量存储值后传递与直接传值的内存差异是什么?
从内存层面对比“先赋值变量再使用”和“直接使用字面量”的差异
你给出的三个JavaScript代码场景中,两种写法的内存层面差异极小,大部分场景下经过现代JS引擎(如Chrome V8、Node.js所用的引擎)优化后甚至完全没有差异,日常开发不需要为了这点内存开销刻意选择写法,优先以代码可读性、可维护性为判断标准即可。
场景1:对象作为参数传递的两种写法
// 写法1:先赋值变量 var sendResponse = {"a":1,"b":2}; res.send(sendResponse); // 写法2:直接传递字面量 res.send({"a":1,"b":2});
- 两种写法在堆内存上都会创建一次对应的对象,这部分内存开销完全一致。
- 唯一差异是写法1会在当前作用域的栈内存中多创建一个
sendResponse引用变量,64位系统下仅占8字节,开销可以完全忽略。 - 如果你后续还需要用到这个对象,写法1反而更省内存:不需要重复创建相同的对象。
场景2:条件判断中字符串的两种写法
// 写法1:先赋值变量 var valueOne = "hi"; var valueTwo = "hithere"; if (someVariable == valueOne || someVariable == valueTwo) { /* 逻辑 */ } // 写法2:直接写字面量 if (someVariable == "hithere" || someVariable == "hi") { /* 逻辑 */ }
- JS引擎默认有字符串驻留优化:相同内容的字符串字面量在内存中只会存储一份,不管你是存到变量还是直接写在判断条件里,
"hi"和"hithere"都只会占用一次内存。 - 两种写法的差异仅为写法1多了两个栈上的字符串引用变量,内存开销可忽略。
- 建议如果字符串有明确业务含义,优先写法1给变量起有语义的名字,避免魔法字符串降低代码可读性。
场景3:字符串拼接的两种写法
// 写法1:先赋值变量再拼接 var concatOne = "hi"; var concatTwo = "hithere"; var concatString = concatOne + concatTwo; // 写法2:直接拼接字面量 var concatString = "hi" + "hithere";
- 现代JS引擎有编译期常量折叠优化:写法2的字面量拼接会在编译阶段直接合并为完整的
"hihithere"字符串,运行时不需要额外计算,内存和性能表现反而更优。 - 如果引擎判断写法1中的
concatOne和concatTwo是不可变常量,也会触发同样的优化,最终两种写法效果完全一致。
额外注意
只有当你在循环、高频触发的函数中重复创建相同的对象/字符串时,不缓存到变量直接新建才会产生明显的内存浪费,单次执行的场景完全不需要纠结这两种写法的差异。
内容的提问来源于stack exchange,提问作者Nikit Panchal
相关产品推荐
相关产品推荐

