数组
1 基本概念
数组是指**一组数据的集合**,其中的每个数据被称作**元素**,在数组中可以**存放任意类型的元素**。<br /> 换言之, 数组是存放数据的容器
1) 定义数组
语法
//1. 使用[]创建空数组var 数组名 = [];//2. 在创建数组时, 给初始值var 数组名 = ['小白','小黑','小胖'];
数组中可以存放任意类型的数据,例如字符串,数字,布尔值等
示例
var arr = ['小小胖',12,true,28.9]
2) 访问数组元素
通过下标(索引)访问数组元素, 下标从0开始
console.log(arr[0])
3) 添加数组元素
示例
var arr = ['小小胖', 12, true, 28.9]arr[4] = 'newValue'arr[6] = '第7个值'console.log(arr) // 数组的长度为7console.log(arr[5]) // undefined
4) 删除数组元素
示例
delete arr[1] // 删除数组元素, 不改变数组长度console.log(arr)
<script>var arr = [1,2,3]//获取数组长度console.log(arr.length);console.log(arr);//增arr[3] = 4;console.log(arr);arr[6] = 9console.log(arr);//中间没有赋值的就是undefinedconsole.log(arr[5]);//undefined//删delete arr[0]console.log(arr);//之后的第0个元素就是undefinedconsole.log(arr[0]);//undefined//改arr[0] = 8console.log(arr);//第0个元素变成了8//查console.log(arr[4]);</script>
2 遍历
遍历: 依次访问数组的每一个元素
var arr = ['red','green', 'blue'];for(var i = 0; i < arr.length; i++){console.log(arr[i]);}
<script>var arr = ['李白','杜甫','王勃']//常规方式console.log(arr[0]);console.log(arr[1]);console.log(arr[2]);//使用for循环//长度 length 索引 0-length-1for(var i=0;i<arr.length;i++){console.log(arr[i]);}</script>
示例
求数组中的最大值
var arr = [1, 2, 11, 3, 4]var max = arr[0]for (var i = 0; i < arr.length; i++) {if (arr[i] >= max) {max = arr[i]}}console.log(max)
示例
求数组中的和与平均值
<script>var arr = [1,3,5,2,8,6]//遍历var sum = 0for(var i = 0;i < arr.length;i++){sum += arr[i]}console.log(sum);console.log(sum/arr.length);</script>
3 多维数组
如果一个数组a的一个元素也是一个数组, 数组a就叫多维数组.
即数组的数组,本质还是一个数组,只不过里面的元素是数组
示例
var arr = [1, 2, ['xiaopang', '小小胖']]// 如何获得小小胖的值console.log(arr[2][1])
<script>/* 3个小组,每个小组有3名成员.每个成员都有业绩第一组 [97,98,100]第二组[99,88,90]第三组[97,78,120]想保存所有成员的业绩*///arr就是一个二维数组(数组的数组),它里面每一个元素都是一个数组var arr = [[97,98,100],[99,88,90],[97,78,120]]console.log(arr);//想拿到第二组的成绩console.log(arr[1]);//想拿到第二组,第二个成员的成绩console.log(arr[1][1]);//遍历for(var i=0;i<arr.length;i++){//console.log(arr[i]);for(var j=0;j<arr[i].length;j++){console.log(arr[i][j]);}}</script>
函数
1 基本概念
可能会有非常多的相同代码或者功能相似的代码,这些代码可能需要大量重复使用
我们把实现特定功能的代码块叫做一个函数
// 声明函数function 函数名() {//函数体代码}
2) 调用函数
语法
函数名();
示例
<script>//先定义function getSum(){var sum = 0for(var i = 1;i <= 10;i++){sum += i}console.log(sum);}//调用getSum()</script>
2 参数
参数可以使函数实现更加强大的功能
参数相当于一个媒介,调用者可以把要操作的数据通过参数传递到函数内部
1) 实参与形参
语法
// 带参数的函数声明function 函数名(形参1, 形参2 , 形参3...) { // 可以定义任意多的参数,用逗号分隔// 函数体}// 带参数的函数调用函数名(实参1, 实参2, 实参3...);
- 形参: 函数声明时参数
实参: 函数调用时参数
<script>//先定义function getSum(n,m){//形式参数var sum = 0for(var i = n;i <= m;i++){sum += i}console.log(sum);}//调用getSum(1,100)//实际参数</script>
2) 传参的过程
传参的过程就是赋值的过程, 将实参的值赋值给形参
示例
进一步改造, 计算从n到m的和
// 声明函数function getSum(n, m){var sumNum = 0;// 准备一个变量,保存数字和for (var i = n; i <= m; i++) {sumNum += i;// 把每个数值 都累加 到变量中}alert(sumNum);}// 调用函数getSum(5, 10);
3 返回值
一般一个函数在调用后, 会产生一个固定的结果, 一般将结果返回出来, 具体要怎么使用这个结果, 不是由函数决定的. 这就是编程里的”单一职责”原则
返回值相当于函数将操作完的数据返回给调用者,这样调用者就可以拿到数据
进一步改造
// 声明函数function getSum(n, m){var sumNum = 0;// 准备一个变量,保存数字和for (var i = n; i <= m; i++) {sumNum += i;// 把每个数值 都累加 到变量中}return sumNum}// 调用函数var res = getSum(5, 10)alert(res)console.log(res)
<script>//先定义function getSum(n,m){var sum = 0for(var i = n;i <= m;i++){sum += i}//console.log(sum);return sum //返回结果给调用者}//调用var total = getSum(1,100)//调用者就可以用一个变量来接收console.log(total,total/2)</script>
练习:
<script>//写一个函数,判断一个年份是否是闰年//能被4整除,但是不能被100整除//能被400整除function isRunYear(year){return (year%4==0&&year%100!=0)|| (year%400==0)}var b = isRunYear(2022)//判断if(b){console.log("是闰年");}else{console.log("是平年");}</script>
<script>//定义函数function getMax(arr){var max = arr[0]for(var i=1;i<arr.length;i++){if(arr[i] > max){max = arr[i]}}return max //不要忘记return了}var arr = [3,2,6,9,8,7]console.log(arr);//数组名就代表这个数组var max = getMax(arr)//可以直接把数组名传进去console.log(max);</script>
内置参数,伪数组:
<script>//定义函数function getMax(){//在函数内部,存在一个内置的变量arguments,是个伪数组//console.log(arguments);var max = arguments[0]for(var i =1;i <arguments.length;i++){if(arguments[i] > max){max = arguments[i]}}return max}var max = getMax(3,2,6,9,8,7)console.log(max);</script>
4 函数分类
1)普通函数
普通函数:有名字的函数
2)匿名函数
匿名函数:没有名字的函数
<script>//普通函数:有名字的函数function add(num1,num2){return num1 + num2}//调用:有参数就给,有返回值就接var sum = add(1,2)console.log(sum);//匿名函数:没有名字的函数var fun = function (num1,num2){return num1 + num2}console.log(fun);//其实现在函数名就相当是fun//调用:使用fun来调用,有参数就给,有返回值就接var total = fun(2,3)console.log(total);</script>
5 函数的注意事项
1,如果没有显示的调用return.则方法没有返回值,如果强行接收,那么接收的就是undefined
2,函数名其实是代表整个函数(类似于数组名代表整个数组)
3.如果实参的个数小于形参的个数,多余的形参运算的时候就是undefined
<script>//1,如果没有显示的调用return.则方法没有返回值,如果强行接收,那么接收的就是undefined/* function aaa(){alert('aaa')}var bbb = aaa();alert(bbb)//undefined *///2,函数名其实是代表整个函数(类似于数组名代表整个数组)/* function aaa(){alert('aaa')}alert(aaa) *///3.如果实参的个数小于形参的个数,多余的形参运算的时候就是undefinedfunction add(num1,num2,num3){return num1+num2+num3}var sum = add(1,2)console.log(sum);//NAN/* var max = Math.max(1,3,9,4)console.log(max); */</script>
面向对象
概念
是一个思维方式<br /> 面向过程:完成一件事需要多少个步骤(重点关注在步骤)<br /> 面向对象:完成一件事需要多少个对象(重点是在找对象)
类
类是对现实生活中具有相同属性和行为的事物的一个统称 (抽象的,相当于是模板)
对象
现实生活中一个具体的存在 (具体的,通过模板创建出来的)
类和对象关系
类相当于是模板,对象是通过这个模板创建出来的一个个真实存在的个体<br /> 类中有什么,对象中就有什么<br />类和对象的关系, 可以认为是整体和个体, 抽象和具体的关系<br />通过上面的描述, 总结起来说, 就是
function 构造函数名 () {// 函数体}
- 使用
function关键字表示定义一个构造函数 - 构造函数名一般首字母大写
示例: 2-1构造函数的定义.html
function Person() {}
通过以上方式就可以定义一个Person构造函数, 相当于定义好了一个Person类
类的三要素
类名
属性:类所具有的特征
行为:类所有具有的功能
类的定义
function 类名(参数1,参数2){
}
<script>//定义类(通过构造函数来定义)function Person(){//首字母大写(构造函数的特点)}//通过类创建对象(实例化对象)var p = new Person()console.log(p);console.log(typeof p);</script>
对象的创建方式
方式一: 构造函数创建
//对象的创建方式//方式一:构造函数创建//定义类(通过构造函数来定义)function Person() {//首字母大写(构造函数的特点)}//通过类创建对象(实例化对象)var p = new Person()console.log(p);console.log(typeof p);
方式二: 字面量方式
//方式二:字面量方式//创建一个空的对象var stu1 = {}console.log(stu1);//创建一个有属性和方法的对象var stu2 = {name:'张三',age:23,study:function(){//匿名函数console.log('学习');}}console.log(stu2);//访问属性方式一console.log(stu2.name);//访问属性二console.log(stu2['name']);//引号不要漏掉//调用方法stu2.study()
构造函数的作用
通过构造函数实例化对象
在JS中, 我们通过构造函数(类)来实例化对象
语法
new 构造函数名()
示例: 2-2通过构造函数实例化对象.html
// 一. 定义一个构造函数function Person() {}// 二. 实例化一个对象, 赋值给变量pvar p = new Person();console.log(typeof p); // object
以上代码
- 通过new关键字, 产生了一个对象, 并赋值给变量p
- 通过
typeof p测试变量p的类型为object, 说明p是一个对象在构造函数中定义属性
function 类名(参数1,参数2){
属性的定义
this.属性名1=参数1
this.属性名2=参数2
}
}示例: 2-3在构造函数中定义属性.html
// 一. 定义一个学生类function Student(n, a) {this.uname = n;this.age = a;}// 二. 实例化对象var stu = new Student('xiaoming', 20);
<script>//定义类(通过构造函数来定义)function Person(name,age){//首字母大写(构造函数的特点)//定义属性this.name = namethis.age = age}//通过类创建对象(实例化对象)var p1 = new Person('张三',23)var p2 = new Person('李四',24)console.log(p1);console.log(p2);/* 手机类型号 颜色 尺寸 价格*/</script>
方法的定义
在构造函数中定义方法
function 类名(参数1,参数2){
属性的定义
this.属性名1=参数1
this.属性名2=参数2
this.方法名 = function(){
方法体代码
}
}
方法的使用(调用)
语法
对象.方法名()
- 由于方法就是一个函数, 在后面加小括号表示方法的调用
示例: 3-2调用对象的方法.html
// 三. 调用方法 -- 对象.方法名()stu.sayHi(); // 大家好
调用方法和属性
对象名.属性名
对象名.方法名
<script>//定义类(通过构造函数来定义)function Person(name,age){//首字母大写(构造函数的特点)//定义属性this.name = namethis.age = age//定义方法this.eat=function(){console.log('吃饭');}}//通过类创建对象(实例化对象)var p1 = new Person('张三',23)var p2 = new Person('李四',24)console.log(p1);console.log(p2);//调用属性和方法(必须要有对象名来调用)console.log(p1.name);p1.eat()console.log(p2.name);p2.eat()</script>
Math对象
简单使用:
<script>//圆周率console.log(Math.PI);//最大值console.log(Math.max(1,3,9));//最小值console.log(Math.min(1,3,9));</script>
绝对值和取整:
<script>//绝对值console.log(Math.abs(-1));console.log(Math.abs(1));//取整console.log(Math.ceil(1.2));//向上取整console.log(Math.ceil(1.9));console.log(Math.floor(1.2));//向下取整console.log(Math.floor(1.9));console.log(Math.round(1.2));//四舍五入console.log(Math.round(1.9));console.log(Math.round(1.5));</script>
生成随机数:
<script>//生成0-1之间的随机数 [0,1)console.log(Math.random());//生成1-10之间的随机数,包含1和10//[1,10] --> [0,10) + 1 --> [0,1)*10 + 1//[50,100] --> [0,51)+50 --> [0,1)*51 + 50//规律 生成[min,max]的随机数(包含min和max)//Math.floor(Math.random()*(max-min+1) + min)/* 1-199 */console.log(Math.floor(Math.random()*199+1));</script>
