数组(Array)函数(Function)

1 数组

定义:
1)为什么要用数组?
之前学习的数据类型,只能储存一个值。(字符串为一个值)
我们想储存多个值的时候可以使用数组。(字符串不方便)
2)数组变量可以存放多个数据

是什么?
1)数组是一种引用数据类型,属于对象
把很多数据装入一个盒子中,用的时候取出来
它和普通的对象功能类似,也是用来储存一些值的
不同的是普通对象是使用字符串作为属性名的,而数组是使用数字来作为索引操作元素的
2)数组的存储性能比普通对象要好,在开发中我们经常使用数组来存储一些数据

创建数组的方式:
1)使用Array构造函数
创建一个空数组
创建一个长度为30的数组
创建一个包含2个字符串的数组

var arr1=new Array();  //空数组
var arr2=new Array(30);    //长度为30的数组
var arr3=new Array('MRX','爱');    //包含2个字符串的数组

2)使用数组字面量

var arr1=[];
arr2.length=20;    //约束其长度为20

var arr3=['MRX','爱'];

原理:
var myarray=new Array();
其中var myarray代表“保存数组的变量”
new Array();代表“创建一个新的空数组”
整体代表“语句是创建一个新数组,储存在myarray变量中”

数组是值的集合

(39,60,99,85,77,+++);  //可以根据需要向数组增加更多的值

每个值都有一个索引号,从0开始。即:
39—0,60—1,99—2
数组中每个索引,都有一个相应的值

数组储存的数据可以是任何类型(数字、字符、布尔值等)

常用操作:
1)length 求数组的长度

数组名.length=数组的长度;

可以通过修改数组的长度来改变数组中元素的个数,如果改小了,数组以后面删除元素。(伪数组的长度可以修改,但是不能修改里面的元素)

2)获取数组
数组中的指定元素=数组名[索引值];
数组的索引代表的是数组中的元素在数组中的位置
如果获取数组中元素是,数组名[索引值],没有指定索引(元素没有那么多),系统不报错,而是给定值位undefined

var arr1=['张三','李四','王二麻子','张三','李四','王二麻子'];
console.log(arr1[0]);    //获取到了‘张三’
console.log(arr1[3]);    //获取到了‘王二麻子’
console.log(arr1[arr1.length  -  1]);      //获取到了数组的最后一个

拆解!

纯数据——用数组
遍历数据——for循环
条件判断——if

2 函数(function)

1)定义:

函数也是一个对象
函数就是可以重复执行的代码块
函数就是完成特定功能的一段代码
使用typeof检查一个函数对象时,会返回function

//获取1-100,1-200,1-300的和
var sum=0;
function getSum(count) {    //count是参数
    for (var i = 1; i <= count ; i++) {
          sum+=i;
      }
      console.log(sum);
}
getSum(100);
getSum(200);
getSum(300);

2)作用:

因为一部分代码使用次数可能会很多,所以封装起来,需要的时候调用就可以了
将复杂的事情简单化
将重复使用的代码进行统一封装
特点:
封装到函数的代码不会立即执行
函数中的代码会在函数调用的时候执行
调用函数语法:函数对象()
调用函数时,函数中封装的代码会按照顺序执行

3)基本使用

函数声明方式
函数直接声明

function sum(a,b) {
    console.log(a+b);
}
sum(20,30);

函数表达式声明方式

var sum=function (a,b) {
    console.log(a+b);
}
sum(20,30);

使用Function构造函数

var add=new Function('num1','num2','return num1+num2');
//不推荐使用,主要用于面向对象时理解‘函数就是对象’,函数名就是指针这一概念

4)函数的参数

为什么要设置参数?
为了增强函数的功能性和函数的可拓展性,便于交互
形参
形式上参与运算的变量,无实际值,位实参占位置,就像一个躯壳一样
※上面的a,b就是形参
实参
实际参与运算的变量。形参为他占位置,真实参与运算的变量
注意:
在其他语言中实参个数必须和形参个数一致,但是JavaScript中没有函数签名的概念,实参个数和形参个数可以不相等

5)函数使用注意:

6)arguments对象(伪数组对象)

function sum(num1,num2) {
    console.log(arguments);
    //输出实参个数
    console.log(arguments.length);
    //比较形参和实参的个数是否相等
    console.log(arguments.length === sum.length);
    
    //输出这个函数,确定函数继承性
    console.log(arguments.callee);
}
sum(100,200,300,500,600,700);

arguments的用法:

var num=0;
function sum() {
    for (var i = 0; i < arguments.length; i++) {
        num+=arguments[i]
    }
    console.log(num);
}
sum(100,200,300,400);

7)length属性

函数形参的个数
console.log(arguments.length);

8)函数返回值(return)

当一个函数被调用,通常会从函数的开始执行到结束。如果想提前结束该函数的执行可以使用return语句,return语句后面的所有语句将永远不会执行
一般return用于返回结果

//请写出一个判断一个数是不是偶数的函数
function isEven(num) {
    //验证
    if(typeof num !== 'number') {
    alert('参数不正确');
    return 10;
    }
    //判断
    if(num %2 ===0) {
        return '偶数';    //返回‘偶数’
    }else {
        return '奇数';    //返回‘奇数’
    }
}
//如果是var f1=isEven('100');  会弹出不正确对话框,并不会执行后续代码。返回10
var f1=isEven(100);
console.log(f1);

注意:
如果函数没有显示的使用return语句,那么函数有默认返回值:undefined
如果函数使用return语句,那么跟在return后面的值,就成了返回值
如果函数使用return语句,但是后面没有值,那么函数的返回值也是:undefined
推荐的做法是要么让函数始终都返回一个值,要么不要有返回值

9)函数直接声明和函数表达式声明的区别

函数声明必须有函数名,而函数表达式的函数名可以省略
JavaScript解析器首先会把当前作用域的函数(直接)声明提前到作用域的最前面
即,不管函数写在哪,在任何位置都可以调用
如果函数经常(重复)使用,用函数(直接)声明
如果函数不常用(代码量大,加载时间长),用函数表达式声明。以减少初始化时间

10)匿名函数

定义:
没有命名的函数function(){}
作用:
用在绑定事件的时候

document.onclick=function() {
    alert(1);
}

定时器

setInterval  (function() {
    console.log('每秒爱MRX一遍!')
},1000)    //单位,毫秒

闭包(立即执行函数)

(function (num1,num2) {
    console.log(num1,num2);
})(111,222)

11)函数是一种数据类型

归根结底,它还是属于object(对象)

12)回调函数

回调函数就是一个通过函数调用的函数(在函数里面调用另外一个函数)
如果把函数的指针(地址)作为一个参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数

//简易计算器
function add(num1,num2) {return num1+num2};
function sub(num1,num2) {return num1+num2};
function mul(num1,num2) {return num1+num2};
function die(num1,num2) {return num1+num2};

function cal(num1,num2,func) {
    return func(num1,num2);
}

var res1=cal(10,20,add);
var res2=cal(10,20,sub);
var res3=cal(10,20,mul);
var res4=cal(10,20,die);

console.log(res n);

12)变量的作用域

定义:变量可以起作用的范围
全局变量
在任何地方都可以访问到的变量就是全局变量;对应全局作用域

var name="MRX";    //全局变量
function f() {
    name="LoveMRX";
}
console.log(name);    //输出LoveMRX

局部变量
只在固定的代码片段内可访问到的变量,最常见的例如函数内部;对应局部作用域(函数作用域)

function f() {
    var str="MRX";
}
f();

console.log(str);    //无法调用str,会报错

注意
不使用var声明的变量是全局变量,不推荐使用
变量退出作用域之后会销毁,全局变量关闭网页或浏览器才会销毁

作用域链

概念:
只有函数可以制造作用域结构,那么只要是代码,就至少有一个作用域。即全局作用域
凡是代码中有函数,那么这个函数就构成另一个作用域。
如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域

var color='yellow';
function firstColor() {
    var firstcolor='red';
    function nextColor() {
        var nextcolor=color;
        color=firstcolor;
        firstcolor=nextcolor;
    }
    nextColor()
}
firstColor()
console.log(nextcolor);    //yellow
console.log(color);    //red
console.log(nextcolor);    //yellow

预解析
概念
JS代码的执行是由浏览器中的JS解析器来执行的
JS解析器执行JS代码的时候,分为两个过程:预解析过程和代码执行过程
预解析过程
1-把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值
2-把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用
3-先提升var ,再提升function

变量提升:
定义变量的时候,变量的声明会被提升到作用域的最上面,变量的赋值不会提升
函数提升:
JS解析器首先会把当前作用域的函数声明提前到整个作用域的最前面

你可能感兴趣的:(数组(Array)函数(Function))