为何JavaScript中toLowerCase需新变量,sort等数组函数无需?
为什么有些JS函数需要存新变量,有些不用?
这个问题本质是可变类型 vs 不可变类型,再结合JS方法的设计逻辑来理解就通透了:
1. 字符串是「不可变类型」,方法会返回新值
JavaScript里的字符串是不可变的——一旦创建,你就没法直接修改它的任何字符。比如你调用toLowerCase()的时候,这个方法不会改变原字符串本身,而是生成并返回一个全新的小写字符串。
举个例子:
let originalStr = "HELLO WORLD"; originalStr.toLowerCase(); console.log(originalStr); // 还是输出 "HELLO WORLD",原字符串没变化! // 必须把返回值存到新变量(或覆盖原变量)才能拿到修改后的结果 let lowerStr = originalStr.toLowerCase(); console.log(lowerStr); // 输出 "hello world"
2. 数组是「可变类型」,部分方法会「原地修改」原数组
数组属于可变引用类型,JS给数组设计的sort()、reverse()、pop()这些方法,都是直接在原数组上做修改(也就是「原地操作」),修改完成后原数组就已经是你想要的状态了。
比如:
let originalArr = [3, 1, 2]; originalArr.sort(); console.log(originalArr); // 直接输出 [1, 2, 3],原数组已经被排序了! // 哪怕这些方法也会返回值(比如pop()返回被删除的元素),但如果你只需要修改原数组,完全不用存新变量 let lastItem = originalArr.pop(); console.log(originalArr); // 输出 [1, 2],原数组已经被修改 console.log(lastItem); // 输出 3(这是pop()返回的被删除元素)
补充:数组也有返回新值的方法
别误会,不是所有数组方法都会原地修改!比如map()、filter()、slice()这些方法,就和字符串方法一样,会返回一个新数组,原数组保持不变,这时候你就需要用新变量接收结果:
let nums = [1, 2, 3]; let doubledNums = nums.map(num => num * 2); console.log(nums); // 还是 [1, 2, 3] console.log(doubledNums); // 输出 [2, 4, 6]
总结一下判断逻辑
遇到一个JS方法时,你只需要搞清楚两个点:
- 操作的对象是不可变类型(字符串、数字、布尔)还是可变类型(数组、对象)
- 这个方法的设计是原地修改原对象还是返回一个新对象
如果是后者,那你就需要用新变量(或覆盖原变量)来接收结果啦!
内容的提问来源于stack exchange,提问作者M Descoteaux
相关产品推荐
相关产品推荐

