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解析器首先会把当前作用域的函数声明提前到整个作用域的最前面