JS基础(二)---函数、数组及对象

一、函数

函数的概念

函数,也叫功能或方法,函数将一段具备某项特殊功能的代码段封装成一个完整的结构体。

函数的作用就是封装一段功能代码,可以被反复调用,实现代码的重用

函数的声明

声明语法:

function 函数名 (参数){
  函数的结构体;
}

函数在声明时,函数体不会执行,只有在被调用的时候才会执行

函数的调用

函数调用方式: 函数名(参数),形如:foo();

函数参数: 专门接收函数执行时所必须的数据的变量

函数的参数可以设置0个或者多个,参数之间用逗号隔开

函数的参数有两种名称:形参和实参,其本质都是各种类型的数据变量

形参:形式参数, 在函数定义中,()内部的参数叫做形参,用来接收函数调用时实参传递过来的数据

实参:实际参数,在函数调用中,()中的参数就是实参,用来传递数据给形参使用

arguments对象

arguments对象是函数的一个内置属性,arguments对象中存储着实参的所有值,是一个类数组对象,能够通过遍历进行取值

函数的返回值

函数在执行完毕后,会返回一个执行结果,通过return关键字实现函数的返回值

如果不写return 语句,则函数默认返回undefined
如果存在return 语句,则函数返回值为return 后面的数据

其中,如果函数内部执行了一个return语句,则函数体之后的代码将不会再执行

作用域与作用域链

变量的可用范围,scope
本质其实是一个存储多个变量的对象

js中存在两种作用域:全局作用域和函数作用域
全局作用域:专门保存全局变量的对象
函数作用域:专门保存函数内部的局部变量的对象
局部变量:只有在函数调用时的函数内部才能使用
全局变量:在任何时候的任何位置都可被访问

作用域链:在对变量取值时,都是从当前定义变量的函数开始查找,如果当前没有定义该变量,则从上层查找,直到查找到全局作用域,这种查找过程中形成的链式结构,就是作用域链

函数声明提前问题

在正式执行程序前,都会先对var 声明的变量 和 function 声明的函数进行预解析,将变量和函数集中到当前作用域的顶部进行集中声明,其中,先提升var 声明的变量,再提升function 声明的函数

赋值操作则留在原地

预解析完成后,再根据新的代码顺序,从上往下按照既定的规律执行js

函数表达式

函数表达式也是函数声明的另一种方式,写法:

var  函数名 = function(参数){
  函数体;
  return 返回值
}

使用函数表达式的方式进行函数声明时,在预解析过程中,就不会进行函数声明提升了,而是进行变量声明提升

立即执行函数 IIFE

IIFE:Immediately-Invoked-Function-Expression,即时调用的函数表达式,表示在函数定义时就立即调用

要实现IIFE,必须将函数转换为表达式形式,才能实现自调用

方法: 通过一定的手段,让函数参与特定的运算,即在函数前加一些运算符,如:
数学运算符: +、 -、 ()
逻辑运算符: !
IIFE最常用的就是通过加 () 运算符来实现,如:

(function(i){
  console.log(i);     //  1
})(1);

二、数组

多个数据或变量按一定顺序保存在一个集合中,则称这个集合为数组

创建数组

创建数组的4种方式

  • 创建空数组
    var 数组名 = []; --->在js中,数组的字面量就是 []

  • 创建数组的同时,初始化数组中的每个元素
    var 数组名 = [值1, 值2, 值3, ...];

  • 创建空数组
    var 数组名 = new Array(n);
    这种方法,创建一个数组类型的对象,n 表示初始化元素的个数,省略则表示空数组,不省略则表示创建一个具有n个undefined值的数组

  • 创建数组同时初始化数组元素
    var 数组名 = new Array(值1, 值2, 值3, ...)

其中 new Array 在一定情况下存在歧义,比如:new Array(3); 代表3个元素值为undefined的数组,而不是元素值为3的数组。

获取数组元素

通过数组的下标 i 来获取数组的每一个元素,即 数组名[i] = 值
其中,i 从0开始计算,按照整数开始排序,如 0,1,2,3,...

数组的长度

length,能记录数组的数据总长度,如 数组名.length

数组的长度与数组最后一项的下标存在一定关系,即最后一项的下标等于数组的length-1

数组的长度也不是固定的,可以发生更改,当数组的个数增加时,length值自动跟着改变

数组length属性有两个固定用法

  • 获取最后一个元素值:arr[arr.length - 1]
  • 向数组末尾追加一个新元素: arr[arr.length] = 新值;

数组的遍历

主要是根据数组的下标在0 到 length - 1 之间,用for循环来对数组的每一个元素进行访问。


关联数组

上面所讲的是常规的索引数组,还有一种数组叫关联数组,可自定义下标,

创建关联数组的方法:
1、第一步,先创建空数组,var arr = [];
2、第二步,再向数组中添加元素,arr[key] = value; 如:arr[''name''] = "张三",arr["age"] =30;

其中,key为字符串, length属性无效,永远为0,同时,关联数组中的key 不能重复,如果访问不存在的下标元素,也不会保存,返回undefined值

遍历关联数组:for (var key in arr) { } 结构


三、对象

对象的基本概念

JS中的对象是无序属性的集合,属性可以是基本值、函数等。对象的结构可以看成是一种键值对的形式,值可以是数据和函数。

对象的创建

创建对象的最简单的方式:使用对象字面量赋值给变量,类似数组

对象的字面量语法: {},内部可以存放多条数据,数据之间用逗号隔开,每条数据是以键值对的形式存在,即 k(属性名): v(属性值,值可以是任意类型的数据,简单数据类型、函数、对象),如:

var obj = {
  k1: v1,
  k2: v2,
  k3: v3
};

在对象中,特征,用属性表示, 行为,则用方法表示

对象方法和属性的调用

在调用对象的属性时,有两种形式:
obj.属性名 或者 obj["属性名"],如果属性是个变量,则只能使用 [] 的形式表示,即 obj[属性]

在调用对象的方法时,需要在方法名后加()执行,即 obj.fn()

对象的遍历

可以将对象看成是一种键值对形式的数据结构,在遍历对象时,类似数组,通过 for in 循环,根据属性名遍历出每一项对应的属性值,即:

for(var key in obj){
  var value = obj[key];
  ...
}

你可能感兴趣的:(JS基础(二)---函数、数组及对象)