js中那些方法不改变原来的数组对象

本文详细介绍了JavaScript中的数组方法,包括map、concat、slice等,并解释了它们如何工作以及使用时的注意事项。

一、map方法

function fuzzyPlural(single) {
  var result = single.replace(/o/g, 'e');  
	//replace也不会修改原来数组的值,这里打印[foot,goose,moose,kangaroo]
	//alert(single);
//下面为新的数组添加了一个元素,但是我们看到在map的时候没有对添加的元素进行处理,所以map调用的结果还是没有变化:["feet", "geese", "meese", "kangareese"]
	//但是可以知道words结果已经变化了!
	//words[4]="metoo";
//虽然下面通过修改length为3将数组截断了,从而相当于删除了第四个元素,但是map方法并不会检测到这种变化,所以在map方法调用的结果数组长度还是为4,只是最后一个元素变成了空了!但是这种删除会影响外层的words,使得他的长度变成了3!
	//但是在具体的fuzzyPlural只会调用三次!(通过alert(single)就可以知道,因为这里已经把数组截断了,但是返回的数组长度还是4,一个为空!)
	words.length=3;
  if( single === 'kangaroo'){
    result += 'se';
  }		
  return result; 
}
var words = ["foot", "goose", "moose", "kangaroo"];
alert(words.map(fuzzyPlural));
//map方法不修改原数组的值,words经过map调用以后,还是没有发生变化!
alert(words);
// ["feet", "geese", "meese", "kangareese"]
note:map方法的调用不会修改原来的数组,同时从上面分析来说replace方法也不会改变原来调用的字符串!同时我们上面用到了把length减少来删除数组元素的方法,但是这种方法比较笨拙,只能从数组尾部删除数据,同时数组也有delete删除方法,但是这种方法的不当之处在于他会在原来的数组中留下空洞,也就是原来的对象只是变成了undefined,而不是真正的删除。于是我们建议用splice方法,第一个参数是开始删除的下标,第二个参数是要删除的个数!同时 要注意parseInt方法parseInt("1",0);会变成1!

二、concat方法

var num1 = [1, 2, 3];
var num2 = [4, 5, 6];
var num3 = [7, 8, 9,"c"];
var nums = num1.concat(num2, num3);
//为老数组添加一个元素,看新数组是否会发生变化
//打印[1,2,3,4,5,6,7,8,9,c]
alert(nums);
num3[4]="xxxx";
//发现新数组没有发生变化
alert(nums);
//为num1添加一个元素
num1[3]="cccc"
//新数组也没有发生变化!
alert(nums);

note:对新数组的任何操作不会影响老数组,反之亦然!因为这个方法会创建当前数组的一个副本,然后将接受的参数添加到这个副本的末尾!所以互不影响!

三、slice方法

// 使用slice方法从myCar中创建一个newCar.
var myHonda = { color: "red", wheels: 4, engine: { cylinders: 4, size: 2.2 } };
var myCar = [myHonda, 2, "cherry condition", "purchased 1997"];
var newCar = myCar.slice(0, 2);
// 输出myCar, newCar,以及各自的myHonda对象引用的color属性.
print("myCar = " + myCar.toSource());
print("newCar = " + newCar.toSource());
print("myCar[0].color = " + myCar[0].color);
print("newCar[0].color = " + newCar[0].color);
// 改变myHonda对象的color属性.
myHonda.color = "purple";
print("The new color of my Honda is " + myHonda.color);
//输出myCar, newCar中各自的myHonda对象引用的color属性.
print("myCar[0].color = " + myCar[0].color);
print("newCar[0].color = " + newCar[0].color);
note:slice不会修改原来的数组,但是如果slice得到的结果数组包含了引用对象,那么如果修改原来的引用对象, 那么除了原来的对象被修改以外,通过slice获取的结果的数组也会发生变化,这就是引用对象在slice中的表现!同时在上面的这篇博客里面我们要学到可以把类数组对象转化为数组对象有三种方法,Array.prototype.slice.call和[].slice.call,以及slice=Function.prototype.call.bind(Array.prototype.slice)然后通过slice(arguments)来完成!第三种用法还有一种去除 两端空格的方法,a.map(Function.prototype.call,String.prototype.trim)

四、filter,forEach,some,every(只要有一个元素不满足就会终止循环)等

在 JavaScript 中,改变数组数组操作方法通常会返回一个新的数组或值,而会对数组进行修改。这些方法非常适合需要保留始数据变的场景,以下是常见的修改数组方法及其使用示例: ### `concat()` 该方法用于合并两个或多个数组,并返回一个数组数组保持变。 ```javascript let arr1 = [1, 2]; let arr2 = [3, 4]; let newArr = arr1.concat(arr2); // newArr = [1, 2, 3, 4] ``` [^1] ### `slice()` 此方法返回数组的一部分,而修改数组。 ```javascript let arr = [1, 2, 3, 4]; let newArr = arr.slice(1, 3); // newArr = [2, 3] ``` [^1] ### `map()` `map()` 方法会对数组中的每个元素执行提供的函数,并将结果组成一个数组返回。 ```javascript let originalArray = [1, 2, 3]; let newArray = originalArray.map(item => item * 2); // newArray = [2, 4, 6] ``` [^4] ### `filter()` `filter()` 方法创建一个数组,包含所有通过测试的元素。 ```javascript let originalArray = [1, 2, 3, 4, 5]; let newArray = originalArray.filter(item => item % 2 === 0); // newArray = [2, 4] ``` ### `reduce()` `reduce()` 方法数组中的每个元素执行一个由您提供的 reducer 函数(从左到右),将其结果汇总为单个返回值。 ```javascript let originalArray = [1, 2, 3, 4]; let sum = originalArray.reduce((accumulator, currentValue) => accumulator + currentValue, 0); // sum = 10 ``` ### `join()` `join()` 方法数组的所有元素连接成一个字符串,并可以通过指定的分隔符来分隔各个元素。 ```javascript let originalArray = [1, 2, 3]; let str = originalArray.join('-'); // str = "1-2-3" ``` [^1] ### `indexOf()` 和 `lastIndexOf()` 这两个方法分别用于查找某个元素第一次和最后一次出现的索引位置,如果未找到则返回 `-1`。 ```javascript let originalArray = [1, 2, 3, 2]; let index = originalArray.indexOf(2); // index = 1 let lastIndex = originalArray.lastIndexOf(2); // lastIndex = 3 ``` ### `includes()` `includes()` 方法用来判断数组是否包含某个特定的元素,返回布尔值。 ```javascript let originalArray = [1, 2, 3]; let hasValue = originalArray.includes(2); // hasValue = true ``` ### `find()` 和 `findIndex()` `find()` 返回数组中满足提供的测试函数的第一个元素的值;否则返回 `undefined`。 `findIndex()` 返回数组中满足提供的测试函数的第一个元素的索引;否则返回 `-1`。 ```javascript let originalArray = [1, 2, 3, 4]; let foundItem = originalArray.find(item => item > 2); // foundItem = 3 let foundIndex = originalArray.findIndex(item => item > 2); // foundIndex = 2 ``` ### `some()` 和 `every()` `some()` 判断数组中是否有至少一个元素满足测试函数。 `every()` 判断数组中的所有元素是否都满足测试函数。 ```javascript let originalArray = [1, 2, 3, 4]; let hasEven = originalArray.some(item => item % 2 === 0); // hasEven = true let allEven = originalArray.every(item => item % 2 === 0); // allEven = false ``` ### `Array.from()` `Array.from()` 创建一个数组,可以基于类数组对象或其他可迭代对象生成数组。 ```javascript let originalArray = [1, 2, 3]; let newArray = Array.from(originalArray); newArray.push(4); // 新数组添加元素,数组变 console.log(originalArray); // 输出: [1, 2, 3] console.log(newArray); // 输出: [1, 2, 3, 4] ``` [^4] ### 总结 JavaScript 提供了多种修改数组的操作方法,如 `concat()`, `slice()`, `map()`, `filter()`, `reduce()` 等,适用于同的数据处理需求。合理选择这些方法可以帮助开发者避免副作用,提升代码的可读性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值