一直从事游戏服务器开发,接触和使用的都是传统后端技术,c++,lua,golang,mysql,redis等等。最近一段时间因为疫情关系,多了一些空余时间难免会去逛逛各大技术论坛,发现很多人都在说大数据,跨平台,分布式,微服务,零零总总看下来对javascript有了兴趣,原因呢是html优秀的跨平台特质,个人认为跨平台在今后的技术领域是有一定的竞争性的。用其开发分布式与微服务也有一定的优势,故打算花一点时间学习,此博客仅做一些学习上的记录
数组定义方式
1.var cars = [“Saab”, “Volvo”, “BMW”];
2.var cars = new Array(“Saab”, “Volvo”, “BMW”);
以[]中括号定义数组边界,逗号作为元素与元素的分隔,(ps:不要在最后一个元素后加逗号,有可能发生兼容性问题),若没有预定义元素也可直接定义成var cars = [],同一个数组中支持不同类型的元素,数组的起始下标为0。1与2的定义均合法,但是从简洁、可读性和执行速度的方面考虑更建议使用1的方式定义。已定义的数组是不定长的可扩展的,例如1中定义的数组依然可以添加元素。
数组访问方式
javascript通过下标访问单个元素,通过下标访问,例如:
document.getElementById(“demo”).innerHTML = cars[0] 输出 Saab
通过数组名访问所有数组元素,(相当于调用tostring) 例如:
document.getElementById(“demo”).innerHTML = cars; 输出Saab, Volvo, BMW
数组赋值方式
单个元素赋值:cars[0] = “more”
cars[0] = myfunction
cars[0] = myobj
数组元素既可以赋值为基础类型也可是函数,对象这种复合类型
数组属性和方法
1.var x = cars.length;
length 属性返回元素的数量
2.var y = cars.sort();
sort() 方法默认按元素的首字母对数组进行排序,也可将比值函数作为参数传入来实现不同排序需求
例如:
cars.sort(function(a, b){return b - a}); 实现按降序排序
当比值函数传回负值时,sort函数会将比值函数的第一个参数定义为比第二个参数更低的值,越低的值在数组中的位置越靠近0
扩展,随机打乱数组位置实现:
cars.sort(function(a, b){return 0.5 - Math.random()});
3.cars.foreach();
为每个数组元素调用一次函数,参数为循环需要执行的函数,该函数接受 3 个参数(项目值,项目索引,数组本身)
4.cars.push();
数组添加新元素,参数为需要添加的新元素,新元素在数组中的位置作为返回值返回
5.cars.toString();
将数组转成带逗号分隔符的字符串
6.cars.join();
将数组转成字符串,可通过参数指定分隔符,默认参数为逗号,若不希望有分隔符则可通过如下实现:cars.join("");
7.cars.pop();
方法从数组中删除最后一个元素,被删除的元素作为函数的返回值被返回
8.cars.shift();
方法会删除首个数组元素,并把所有其他元素“位移”到更低的索引。返回值为被移出的字符串
9.cars.unshift(“newone”);
向数组添加新元素,并“反向位移”旧元素,返回新数组的长度
10.delete cars[0]
删除指定元素,与pop()和 shift()的区别是delete不会将其他元素进行顺移,而是在数组里留下未定义元素,不建议使用
11.cars.splice(2, 0, “Lemon”, “Kiwi”);
方法可用于向数组添加新项,参数说明如下:
第一个参数(2)定义了应添加新元素的位置(拼接)。
第二个参数(0)定义从添加位置开始应删除多少元素。
其余参数(“Lemon”,“Kiwi”)定义要添加的新元素。
返回值为一个包含已删除项的数组
此方法支持用户在不留未定义元素的情况下删除指定位置和个数的数组元素
12.cars.concat(others,[“Emil”, “Tobias”, “Linus”])
通过合并(连接)现有数组来创建一个新数组,参数可以是任意多个数组,原数组不会被改变,新数组以返回值的形式返回
13.cars.map()
方法通过对每个数组元素执行函数来创建新数组。与foreach()方法不同的是map()方法的参数函数必须有返回值,map()将返回一个新的数组
14.cars.filter()
创建一个符合条件的数组元素的新数组,参数为条件函数
实例:用值大于 18 的元素创建一个新数组
var numbers = [45, 4, 9, 16, 25];
var over18 = numbers.filter(myFunction);
function myFunction(value, index, array) {
return value > 18;
}
15.cars.every()
检测数组中所有元素是不是符合条件,会遍历整个数组,所有元素都符合才会返回true,参数为条件函数
16.cars.some()
检测数组中是否有符合条件的数组元素,只要找到符合的就直接返回true不再遍历,参数为条件函数
17.cars.find()
从数组中查找第一个符合条件的元素并返回,参数为条件函数
18.cars.findIndex()
从数组中查找第一个符合条件的元素并返回索引,参数为条件函数
19.cars.reduce()
从左往右遍历数组,执行参数函数,并返回函数执行结果,参数函数格式如下
function myFunction(total, value, index, array) {
}
第一次执行时total为初始值,之后每次执行都为上一次的执行结果
调用方式如下:
cars.reduce(myFunction, 100); //myFunction为参数函数,100为初始值
20.cars.reduceRight()
从右往左遍历数组,执行参数函数,并返回函数执行结果,参数函数格式如下
function myFunction(total, value, index, array) {
}
第一次执行时total为初始值,之后每次执行都为上一次的执行结果
调用方式如下:
cars.reduce(myFunction, 100); //myFunction为参数函数,100为初始值
21.cars.indexOf()
在数组中从前往后搜索元素值并返回其位置cars.indexOf(item, start),item为要查找的元素,start为查找的起始位置
22.cars.lastIndexOf()
在数组中从后往前搜索元素值并返回其位置cars.indexOf(item, start),item为要查找的元素,start为查找的起始位置
数组相关的其他api
Math.max.apply 用来查找数组中的最高值,Math.max.apply([1, 2, 3]) 等于 Math.max(1, 2, 3)。
应用举例:Math.min.apply(null, cars);
Math.min.apply 用来查找数组中的最低值,Math.min.apply([1, 2, 3]) 等于 Math.min(1, 2, 3)。
应用举例:Math.min.apply(null, cars);
如何识别数组
由于typeof数组返回的是object,故不能用typeof来识别数组,以下是识别数组的几种方式:
1.ECMAScript 5 定义了新方法 Array.isArray()
Array.isArray(fruits); // 返回 true
此方案的问题在于 ECMAScript 5 不支持老的浏览器
2.创建您自己的 isArray() 函数以解决此问题:
function isArray(x) {
return x.constructor.toString().indexOf("Array") > -1;}
假如对象原型包含单词 "Array" 则返回 true。此方案的问题是容易将含有"Array"属性的对象误判成数组
3.假如对象由给定的构造器创建,则 instanceof 运算符返回 true
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits instanceof Array