👀 这是我参与「第四届青训营 」笔记创作活动的的第6天!
这是一篇非常适合小白一起学习的文章,都是非常基础的知识。 😀😁😀😁😀😁
🍻1、JavaScript数组
🍻1.1、 初识数组
描述:
数组是一种类列表对象,它的原型中提供了遍历和修改元素的相关操作。JavaScript 数组的长度和元素类型都是非固定的。因为数组的长度可随时改变,并且其数据在内存中也可以不连续,所以 JavaScript 数组不一定是密集型的,这取决于它的使用方式。一般来说,数组的这些特性会给使用带来方便,但如果这些特性不适用于你的特定使用场景的话,可以考虑使用类型数组TypedArray。
只能用整数作为数组元素的索引,而不能用字符串。后者称为 关联数组。使用非整数并通过 方括号 或 点号 来访问或设置数组元素时,所操作的并不是数组列表中的元素,而是数组对象的 属性集合 上的变量。数组对象的属性和数组元素列表是分开存储的,并且数组的遍历和修改操作也不能作用于这些命名属性。
什么是数组?
数组是一种特殊的变量,它能够一次存放一个以上的值。
如果你有一组数据(例如:车名字),存在单独变量如下所示:
var car1="Saab";
var car2="Volvo";
var car3="BMW";
然而,如果你想从中找出某一辆车?并且不是3辆,而是300辆呢?这将不是一件容易的事!
最好的方法就是用数组。
数组可以用一个变量名存储所有的值,并且可以用变量名访问任何一个值。
数组中的每个元素都有自己的的ID,以便它可以很容易地被访问到。
🍻1.2、 创建数组
创建一个数组的方法
方法一:
使用 JavaScript 关键词 new
实例:
var arr=new Array();
//创建了一个空数组
var cars = new Array("Saab", "Volvo", "BMW");
方法二:
使用数组字面量
语法:
var array-name = [item1, item2, ...];
实例
var cars = ["Saab", "Volvo", "BMW"];
注意:数组里面的元素可以是任意类型的。
🍻1.3、访问数组元素
我们通过引用索引号(下标号) 来引用某个数组元素。(数组下标从0开始)
示例:
var arr=['cw','qw','qwe','ert'];
alert(arr[0]);//访问arr中的第一个元素
结果:
🍻1.4、修改数组元素
以下实例修改了数组 arr 的第一个元素:
var arr=['cw','qw','qwe','ert'];
arr[0]='qwert';
alert(arr[0]);//访问arr中的第一个元素
🍻1.5、遍历数组
遍历数组:就是把数组的元素从头到尾访问一次(通过循环实现数组的遍历),数组的遍历通过for循环实现。
示例:
var arr=['red','yeak','green'];
for(var i=0;i<3;i++)
{
console.log(arr[i]);
}
获取数组的长度 : 每个数组有一个length属性,length属性值代表了数组中元素的个数,前端开发中时常会使用length属性计算数组的长度,这个length值比数组中最大的索引值大1。
获取数组长度代码: 数组名.length
代码优化:
var arr=['red','yeak','green'];
for(var i=0;i<arr.length;i++)
{
console.log(arr[i]);
}
练习一: 计算数组的和以及平均值。
var arr=[2,6,1,7,4];
var sum=0
var av=0;
for(var i=0;i<arr.length;i++)
{
sum+=arr[i];
}
av=sum/arr.length
console.log(sum)
console.log(av)
练习二: 求出数组里面的最大值。
var arr=[2,6,1,77,52,25,9];
var max=arr[0];
for(var i=1;i<arr.length;i++)
{
if(arr[i]>max)
{
max=arr[i];
}
}
console.log(max);
练习三: 数组转化为字符串。
var arr=['red','green','blue','pink'];
var str='';
for(var i=0;i<arr.length;i++)
{
str+=arr[i]+'|';
}
console.log(str);
练习四: 数组中新增元素
一、t通过修改length长度来新增元素
var arr=['red','green','blue','pink'];
arr.length=5;
for(var i=0;i<arr.length;i++)
{
console.log(arr[i]);
}
如图所示:通过修改length长度已经为aee新增了一个元素,只不过因为没有给arr[4]赋值,所以打印出来的undefined。
二、通过索引号,追加数组元素。
var arr=['red','green','blue','pink'];
arr[4]='yello';
for(var i=0;i<arr.length;i++)
{
console.log(arr[i]);
}
🍻1.6、案列
案列一: 新建一个数组里面放1到10
方法一:
var arr=[];
for(var i=0;i<10;i++)
{
arr[i]=i+1;
}
alert(arr);
方法二:
var arr=[];
var n=0;
while(n<10)
{
arr[n]=n+1;
n++;
}
alert(arr);
案列二: 筛选数组
var arr=[2,3,5,4,78,65,78,45,1,3,64,6];
var arrnew=[];
var j=0;
for(var i=0;i<arr.length;i++)
{
if(arr[i]>=10)
{
arrnew[j]=arr[i];
j++;
}
}
console.log(arrnew);
案列三: 删除指定的数组元素
将数组[2,0,6,1,77,0,52,0,25,7]中的0去掉后,形成了一个不包含0的新数组、
var arr=[2,0,6,1,77,0,52,0,25,7];
var arrnew=[];
var j=0;
for(var i=0;i<arr.length;i++)
{
if(arr[i]!=0)
{
arrnew[j]=arr[i];
j++;
}
}
alert(arrnew)
案列四: 翻转数组
方法一:
var arr=['red','green','blue','pink'];
var newarr=[];
var j=0;
for(var i=arr.length-1;i>=0;i--)
{
newarr[j]=arr[i];
j++;
}
console.log(newarr);
方法二:
var arr=['red','green','blue','pink'];
var newarr=[];
for(var i=arr.length-1;i>=0;i--)
{
newarr[newarr.length]=arr[i];
}
console.log(newarr);
案列五: 冒泡排序
var arr=[2,3,5,4,78,65,45,1,64,6];
var temp=0;
for(var i=0;i<arr.length-1;i++)
{
for(var j=0;j<arr.length-i-1;j++)
{
if(arr[j]>arr[j+1])
{
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
console.log(arr)
🍻2、JavaScript中Array 方法
| 方法 | 描述 |
|---|---|
| concat() | 连接两个或多个数组,并返回已连接数组的副本。 |
| copyWithin() | 将数组中的数组元素复制到指定位置或从指定位置复制。 |
| entries() | 返回键/值对数组迭代对象。 |
| every() | 检查数组中的每个元素是否通过测试。 |
| fill() | 用静态值填充数组中的元素。 |
| filter() | 使用数组中通过测试的每个元素创建新数组。 |
| find() | 返回数组中第一个通过测试的元素的值。 |
| findIndex() | 返回数组中通过测试的第一个元素的索引。 |
| forEach() | 为每个数组元素调用函数。 |
| from() | 从对象创建数组。 |
| includes() | 检查数组是否包含指定的元素。 |
| indexOf() | 在数组中搜索元素并返回其位置。 |
| isArray() | 检查对象是否为数组。 |
| join() | 将数组的所有元素连接成一个字符串。 |
| keys() | 返回 Array Iteration 对象,包含原始数组的键. |
| lastIndexOf() | 在数组中搜索元素,从末尾开始,并返回其位置。 |
| map() | 使用为每个数组元素调用函数的结果创建新数组。 |
| pop() | 删除数组的最后一个元素,并返回该元素。 |
| push() | 将新元素添加到数组的末尾,并返回新的长度。 |
| reduce() | 将数组的值减为单个值(从左到右)。 |
| reduceRight() | 将数组的值减为单个值(从右到左)。 |
| reverse() | 反转数组中元素的顺序。 |
| shift() | 删除数组的第一个元素,并返回该元素。 |
| slice() | 选择数组的一部分,并返回新数组。 |
| some() | 检查数组中的任何元素是否通过测试。 |
| sort() | 对数组的元素进行排序。 |
| splice() | 从数组中添加/删除元素。 |
| toString() | 将数组转换为字符串,并返回结果。 |
| unshift() | 将新元素添加到数组的开头,并返回新的长度。 |
| valueOf() | 返回数组的原始值。 |
🍻3、JavaScript函数定义
🍻3.1、什么是函数
将需要反复使用的功能代码,封装成独立的模块,这个模块就是函数.
🍻3.2、使用函数的好处?
- 可复用(可重复使用)
- 功能代码可控
🍻3.3、函数的分类
- 内置函数 (js给我们提供的)
- 自定义函数 (自己定义)
🍻3.4、声明函数
JavaScript 函数通过 function 关键词进行定义,其后是函数名和括号 ()。
函数名可包含字母、数字、下划线和美元符号(规则与变量名相同)。
圆括号可包括由逗号分隔的参数:
(参数 1, 参数 2, ...)
由函数执行的代码被放置在花括号中: {}
function name(参数 1, 参数 2, 参数 3) {
要执行的代码
}
函数参数(Function parameters) 是在函数定义中所列的名称。
函数参数(Function arguments) 是当调用函数时由函数接收的真实的值。
在函数中,参数是局部变量。
函数声明后不会立即执行,会在我们需要的时候调用到。
注意:function是函数关键字,必须全部小写。
函数的声明方式:
方法一:
语法:
function functionName(parameters) {
执行的代码
}
方法二:
通过内置的 JavaScript 函数构造器(Function())定义。
语法:
var myFunction = new Function("a", "b", "return a * b");
var x = myFunction(4, 3);
🍻3.5、调用函数
函数中的代码将在其他代码调用该函数时执行:
- 当事件发生时(当用户点击按钮时)
- 当 JavaScript 代码调用时
- 自动的(自调用)
调用函数:
函数名();
function MAXarr(arr)
{
var max=arr[0];
for(var i=1;i<arr.length;i++)
{
if(arr[i]>max)
{
max=arr[i];
}
}
return max;
}
var arr=[2,3,5,4,78,65,45,1,64,6];
MAXarr(arr);//调用的MAXarr函数
🍻3.6、函数的参数
形式参数(形参):定义函数时所传递的参数。
实际参数(实参): 调用函数时所传递的参数。
function 函数名(形参1,形参2,...);
{
//代码块
}
函数名(实参1,实参2, ...);
注意:
-
👀参数传递: 只能将实参 传递给形参,即单向传递
-
👀形参只能是变量; 实参可以是变量,常量,表达式
-
👀实参的数量 小于形参的数量时,多余的形参值为undefined
-
👀实参的数量 大于形参的数量时,自动忽略多余的实参
🍻3.7、函数的返回值
function 函数名(){
return 需要返回的结果;
}
有返回值函数的概念:
1 . 当调用某个函数,这个函数会返回一个结果出来
2 . 这就是有返回值的函数
返回值的作用
- 将函数内部处理后的结果返回到调用该函数的地方
- 退出函数
注意:
-
return终止函数,所以return后面的代码不会执行
-
return只能返回一个值
function fu(num1,num2){
return num1,num2; //返回后面的一个值
}
- 函数中不写return,函数得返回值就是undefind
function fun1(){
return 666;//函数返回666
}
function fun1(){
//函数返回undefined
}
🍻3.8、arguments
arguments 是一个对应于传递给函数的参数的类数组对象。
arguments基本使用
当我们不确定有多少个参数传递的时候,可以使用arguments来获取。在JavaScript中,arguments实际上它是当前函数的一个内置对象。所有函数都内置了一个arguments对象,arguments对象中存储了传递的所有实参。
如:
<script>
function getData() {
console.log(arguments);
}
getData("Continue", 20, true);
</script>
显示截图:
注意: 从返回值 _proto_指向Object可以知道arguments是类数组对象,而不是数组
arguments特点
arguments展示形式是一个伪数组,因此可以进行遍历,伪数组具有以下特点:
- 具有length属性
- 按索引方式存储数据
- 不具有数组的push、pop等方法
callee属性 arguments还有一个callee属性,这个属性可以返回整个函数的代码。
<script>
function getData() {
console.log(arguments);
console.log(arguments.length);
console.log(arguments.callee);
}
getData("Continue", 20, true);
</script>
显示效果:
🍻3.9、案列
案列一: 返回两个数中最大的数
function MAXnum(num1,num2){
if(num1>num2)
{
return num1;
}
else
{
return num2;
}
}
console.log(MAXnum(5,5))
function MAXnum(num1,num2){
return num1>num2 ? num1:num2;
}
console.log(MAXnum(5,6))
案列二: 利用函数求任意一个数组中的最大值
function MAXarr(arr)
{
var max=arr[0];
for(var i=1;i<arr.length;i++)
{
if(arr[i]>max)
{
max=arr[i];
}
}
return max;
}
var arr=[2,3,5,4,78,65,45,1,64,6];
console.log(MAXarr(arr));
案列三: 求两个数的加减乘除
function getReault(num1,num2){
return [num1+num2,num1-num2,num1*num2,num1/num2];//返回的是一个数组
}
案列四:利用函数求任意个数的最大值
function getMax()
{
var max=arguments[0];
for(var i=1;i<arguments.length;i++)
{
if(arguments[i]>max)
{
max=arguments[i];
}
}
return max;
}
console.log(getMax(1,2,3,4));
console.log(getMax(1,2,3,4,5,6));
console.log(getMax(1,2,3,4,5,6,7,8));
console.log(getMax(1,2,3,4,5,6,7,9,9));
🍻4、JavaScript作用域
作用域指的是您有权访问的变量集合。
javaScript 函数作用域
在 JavaScript 中有两种作用域类型:
- 局部作用域
- 全局作用域
JavaScript 拥有函数作用域:每个函数创建一个新的作用域。
作用域决定了这些变量的可访问性(可见性)。
函数内部定义的变量从函数外部是不可访问的(不可见的)。
局部 JavaScript 变量
在 JavaScript 函数中声明的变量,会成为函数的局部变量。
局部变量的作用域是局部的:只能在函数内部访问它们。
由于只能在函数内部识别局部变量,因此能够在不同函数中使用同名变量。
在函数开始时会创建局部变量,在函数完成时会删除它们。
全局 JavaScript 变量
函数之外声明的变量,会成为全局变量。
全局变量的作用域是全局的:网页的所有脚本和函数都能够访问它。
自动全局
如果您为尚未声明的变量赋值,此变量会自动成为全局变量。
这段代码将声明一个全局变量 carName,即使在函数内进行了赋值。
实例
myFunction();
// 此处的代码能够使用 Names 变量,以为变量未声明,所以Names为全局变量。
function myFunction() {
Names = "kaikaixi";
}
JavaScript 变量的有效期
-
JavaScript 变量的有效期始于其被创建时。
-
部变量会在函数完成时被删除。
-
变量会在您关闭页面是被删除。
作用域链
在JavaScript中,函数也是对象,实际上,JavaScript里一切都是对象。函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性。其中一个内部属性是[[Scope]],该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。
作用域链决定了哪些数据能被函数访问。当一个函数创建后,它的作用域链会被创建此函数的作用域中可访问的数据对象填充。
function fn(){
var a=10;
function fn1(){
var b=20;
alert(a);//10
function fn2(){
alert(b);//20
alert(a);//10 子集可以跨级访问父级
}
fn2();
}
fn1();
}
fn();
alert(b);// 报错
从作用域链的结构可以看出,函数在执行的过程中,先从自己内部寻找变量,如果找不到,再从创建当前函数所在的作用域去找,从此往上,也就是向上一级找,直到找到全局作用域还是没找到。
执行顺序
var a=10;
function fn(){
var a=20;
console.log(a);//20
}
fn();
总结
定义:作用域的集合就是作用域链
1、函数在执行的过程中,先从自己内部寻找变量
2、如果找不到,再从创建当前函数所在的作用域去找,从此往上,也就是向上一级找。
当在作用域内访问 变量/方法 的时候,会找离自己最近的那个 变量/方法 (就近原则)
🍻5、JavaScript预解析
JavaScript代码是由浏览器中的js解析器来执行的,JavaScript解析器在运行JavaScript代码的时候分为两步:预解析和代码执行。
1.我们js引擎运行js分为两步 :预解析 代码执行
(1)预解析js引擎会把js里面所有的var还有function提升到当前作用域的最前面
(2)代码执行 按照代码书写的顺序从上往下执行
2.预解析分为 变量预解析(变量提升)和函数预解析(函数提升)
(1)变量提升 就是把所有的变量声明提升到当前的作用域的最前面 不提升赋值操作
(2)函数提升 就是把所有的函数声明提升到当前作用域的最前面 不调用函数
经典案列
🍻6、总结
🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈
今日的JavaScript基础知识学习就到此为止了,这是我第三天学习JavaScript,虽然是这三天的内容比较基础,但是还是从中发现了很多自己的知识盲区,和自己不理解没学过的知识,希望大家一起进步,这篇文章是非常适合小白学习的,我们一起努力学习,成为更好的自己,每天进步一点点。!!!
🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈🎈