Html06-js数组,函数

数组

  1. 为什么要学习数组

之前学习的数据类型,只能存储一个值(比如:Number/String。

如果我们想存储班级中所有学生的姓名,此时该如何存储?

  1. 、数组的定义

所谓数组,就是将多个元素(通常是同一类型)按一定顺序排列放到一个集合中,那么这个集合我们就称之为数组。

数组是一个有序的列表,可以在数组中存放任意的数据,并且数组的长度可以动态的调整。

  1. 、通过数组字面量创建数组
// 创建一个空数组
var arr1 = []; 
// 创建一个包含3个数值的数组,多个数组项以逗号隔开
var arr2 = [1, 3, 4]; 
// 创建一个包含2个字符串的数组
var arr3 = ['a', 'c']; 

// 可以通过数组的length属性获取数组的长度
console.log(arr3.length);
// 可以设置length属性改变数组中元素的个数
arr3.length = 0;

 

  1. 获取数组元素

数组的取值

[0] 是数组中的第一个元素。[1] 是第二个。数组索引从 0 开始。

// 格式:数组名[下标]   下标又称索引
// 功能:获取数组对应下标的那个值,如果下标不存在,则返回undefined。
var arr = ['red', 'green', 'blue'];
arr[0]; // red
arr[2]; // blue
arr[3]; // 这个数组的最大下标为2,因此返回undefined

 

  1. 遍历数组

遍历:遍及所有,对数组的每一个元素都访问一次就叫遍历。

数组遍历的基本语法:

for(var i = 0; i < arr.length; i++) {
    // 数组遍历的固定结构
}
  1. 数组中新增元素

数组的赋值

// 格式:数组名[下标/索引] = 值;
// 如果下标有对应的值,会把原来的值覆盖,如果下标不存在,会给数组新增一个元素。
var arr = ["red", "green", "blue"];
// 把red替换成了yellow
arr[0] = "yellow";
// 给数组新增加了一个pink的值
arr[3] = "pink";

数组的push方法

// 格式:数组名.push()
// 如果下标有对应的值,会把原来的值覆盖,如果下标不存在,会给数组新增一个元素。
var arr = ["red", "green", "blue"];
arr.push(“pink”);

数组案例

求一组数中的所有数的和和平均值
  var sum1 = 0;
  for (var i = 0; i < arrNum.length; i++) {
    sum1 += arrNum[i];
  }
  console.log(sum1);//338
  // 平均值
  var abg = sum1 / arrNum.length;
  console.log(abg.toFixed(2));
求一组数中的最大值和最小值,以及所在位置
  var numMax = arrNum[0];//假设第一元素是最大值
  var numMin = arrNum[0];//假设第一元素是最小值
  var indexMax = 0;
  var indexMin = 0;
  for (var i = 0; i < arrNum.length; i++) {
    if (arrNum[i] >= numMax) {
      numMax = arrNum[i];
      // console.log(i);
      indexMax = i + 1;
    }
    if (arrNum[i] <= numMin) {
      console.log("啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊")
      numMin = arrNum[i];
      indexMin = i + 1;
    }
  }
  console.log("最大值是:" + numMax + ",是第" + indexMax + "个元素!");
  console.log("最小值是:" + numMin + ",是第" + indexMin + "个元素!");
将字符串数组用|或其他符号分割,返回一个字符串
  var str = "";
  var arrStr = ["我", "们", "是", "好", "孩", "子"];
  console.log(arrStr);
  for (var i = 0; i < arrStr.length; i++) {
    console.log(arrStr[i]);
    // str = str + arrStr[i] + "|";
    if (i < arrStr.length - 1) {
      str = str + arrStr[i] + "|";
    } else {
      str = str + arrStr[i];
    }
  }
  console.log(str);
  console.log(typeof str);
要求将数组中的0去掉,将不为0的值存入一个新的数组,生成新的数组
  var newArr1 = [];
  for (var i = 0; i < arrNum.length; i++) {
    if (arrNum[i] != 0) {
      // console.log(arrNum[i]);
      newArr1.push(arrNum[i]);
    }
  }
  console.log(newArr1);
  // 5、翻转数组
  var newArr2 = [];
  for (var i = arrNum.length - 1; i >= 0; i--) {
    console.log(arrNum[i]);
    newArr2.push(arrNum[i]);
  }
  console.log(newArr2);

函数

为什么要有函数

如果要在多个地方求1-100之间所有数的和,应该怎么做?

(2)、什么是函数

把一段相对独立的具有特定功能的代码块封装起来,形成一个独立实体,就是函数。

起个名字(函数名),在后续开发中可以反复调用。

函数的作用就是封装一段代码,将来可以重复使用。

(3)、函数的定义

函数声明

function 函数名(){
  // 函数体
}

函数表达式

var fn = function() {
  // 函数体
}

函数定义好后,函数体并不会执行,只要当函数被调用的时候才会执行。函数一般都用来干一件事情,需用使用动词+名词,表示做一件事情tellStory sayHello等。

(4)、函数的调用

调用函数的语法

函数名();
// 声明函数
function sayHi() {
  console.log("吃了没?");
}
// 调用函数
sayHi();

// 求1-100之间所有数的和
function getSum() {
  var sum = 0;
  for (var  i = 0; i < 100; i++) {
    sum += i;
  }
  console.log(sum);
}
// 调用
getSum();

(5)、函数的参数

为什么要有参数

function getSum() {
  var sum = 0;
  for (var i = 1; i <= 100; i++) {
    sum += i;
  }
  console.log();
}
// 虽然上面代码可以重复调用,但是只能计算1-100之间的值
// 如果想要计算n-m之间所有数的和,应该怎么办呢?

语法:

// 函数内部是一个封闭的环境,可以通过参数的方式,把外部的值传递给函数内部
// 带参数的函数声明
function 函数名(形参1, 形参2, 形参...){
  // 函数体
}
// 带参数的函数调用
函数名(实参1, 实参2, 实参3);

形参和实参

1. 形式参数:在声明一个函数的时候,为了函数的功能更加灵活,有些值是固定不了的,对于这些固定不了的值。我们可以给函数设置参数。这个参数没有具体的值,仅仅起到一个占位置的作用,我们通常称之为形式参数,也叫形参。

2. 实际参数:如果函数在声明时,设置了形参,那么在函数调用的时候就需要传入对应的参数,我们把传入的参数叫做实际参数,也叫实参。

var x = 5, y = 6;
fn(x,y); 
function fn(a, b) {
  console.log(a + b);
}
//x,y实参,有具体的值。函数执行的时候会把x,y复制一份给函数内部的a和b,函数内部的值是复制的新值,无法修改外部的x,y

函数案例

求n-m之间所有数额和
function getSum(n,m){
      var sum = 0;
      for (var i = n;i <= m;i++){
          sum += i;
      }
      console.log(sum);
    }
    getSum(1,100);//1-100
    getSum(50,100);//50-100
    getSum(2,100);//2 -100
圆的面积
function getArea(r){
      // 数学对象:Math
      console.log(Math);
      var area = Math.PI * r * r;
      console.log(area.toFixed(2));
    }
    getArea(10);
求2个数中的最大值
 function getMaxNum(m,n){
      if (m > n){
        console.log("最大值:"+ m);
      }else if (m < n) {
        console.log("最大值:"+ n);
      }else {
        console.log( m +"与"+ n + "相等");
      }
    }
    getMaxNum(150,150);
    getMaxNum(0,12);

函数的返回值

(1)、什么是返回值

当函数执行完的时候,并不是所有时候都要把结果打印。我们期望函数给我一些反馈(比如计算的结果返回进行后续的运算),这个时候可以让函数返回一些东西,也就是返回值。函数通过return返回一个返回值。

返回值语法:

//声明一个带返回值的函数
function 函数名(形参1, 形参2, 形参...){
  //函数体
  return 返回值;
}
//可以通过变量来接收这个返回值
var 变量 = 函数名(实参1, 实参2, 实参3);

函数的调用结果就是返回值,因此我们可以直接对函数调用结果进行操作。

(2)、返回值总结

1、如果函数没有显示的使用 return语句 ,那么函数有默认的返回值:undefined

2、如果函数使用 return语句,那么跟再return后面的值,就成了函数的返回值

3、如果函数使用 return语句,但是return后面没有任何值,那么函数的返回值也是:undefined

4、函数使用return语句后,这个函数会在执行完 return 语句之后停止并立即退出,也就是说return后面的所有其他代码都不会再执行。

推荐的做法是要么让函数始终都返回一个值,要么永远都不要返回值。

求阶乘
function getJie(n){
      var jie = 1;
      if(n==0){
        return 1;
      }
      for(var i=1;i<=n;i++){
        jie *= i;
      }
      return jie;
    }
    var jiecheng =getJie(7);
    console.log(jiecheng);

函数其他

  1. 、函数的命名

规则

1.由字母、数字、下划线、$符号组成,不能以数字开头
           2.不能是关键字和保留字,例如:for,while,this, name
           3.区分大小写
       规范
           1.函数名必须有意义
           2.遵守驼峰命名法
           3.建议不要用$作为函数名

  1. 、函数的覆盖问题

如果两个函数都是函数的声明,且函数名相同,那么后边的函数会覆盖前边的

function fn1() {
    console.log("函数声明");
  }
  function fn1() {
    console.log("我是第二个fn1");
  }
fn1();//我是第二个fn1

如果两个函数都是函数表达式,且函数名相同,函数的调用会调用最近的一个

 var fn2 = function () {
    console.log("第一个函数表达式fn2");
  } 
  fn2();//第一个函数表达式fn2
var fn2 = function () {
    console.log("我是第二个fn2表达式");
  }
  1. 函数的内置对象

JavaScript中,arguments对象是比较特别的一个对象,实际上是当前函数的一个内置属性。也就是说所有函数都内置了一个arguments对象,arguments对象中存储了传递的所有的实参。arguments是一个伪数组,因此也可以进行遍历。

arguments数组中前几个元素是函数的参数

callee属性:函数的本身

callee.name:函数的名字

length属性:实参的个数

callee.length:形参的个数

  1. 、匿名函数

匿名函数:没有名字的函数

匿名函数如何使用?

匿名函数不能通过直接调用来执行,因此可以通过匿名函数的自调用的方式来执行

(function () {
  	alert(123); 
  })();
  1. 、函数是一种数据类型

函数是引用数据类型

<script>
//1.可以typeof一下
function run(){
}
console.log(typeof run)//function
  1. 函数作为参数

因为函数也是一种类型,可以把函数作为参数传入

function fnNum1(x) {
    console.log(x);
    x();
  }
 fnNum1(function () { console.log("函数作为参数传入") });

因为函数是一种类型,可以把函数作为参数反出

 function fnNum2(x) {
    return x
  }
  // var num1 = fnNum2(120);
  var num1 = fnNum2(function () { console.log("函数作为参数反出") });
  console.log(num1);
  num1();

预解析

JavaScript引擎在对JavaScript代码进行解释执行之前,会对JavaScript代码进行预解析,在预解析阶段,会将以关键字var和function开头的语句块提前进行处理。

关键问题是怎么处理呢?

当变量和函数的声明处在作用域比较靠后的位置的时候,变量和函数的声明会被提升到作用域的开头。

(1)、函数提升

func();
function func(){
	alert("Funciton has been called");
}

由于JavaScript的预解析机制,上面的代码就等效于:

function func(){
	alert("Funciton has been called");
}
func()

(2)、变量提升

看完函数声明的提升,再来看一个变量声明提升的例子

alert(a);
var a = 1;

由于JavaScript的预解析机制,上面这段代码,alert出来的值是undefined,如果没有预解析,代码应该会直接报错a is not defined,而不是输出值,不是说要提前的吗?那不是应该alert出来1,为什么是undefined?

所以我们说的提升,是声明的提升。

那么再回过头看,上面的代码就等效于

var a; //这里是声明
alert(a);//变量声明之后并未有初始化和赋值操作,所以这里是 undefined
a = 1

所以变量的提升只是声明的提升

(3)、函数同名

通过上一小节的内容,我们对变量、函数声明提升已经有了一个最基本的理解。那么接下来,我们就来分析一些略复杂的情况。

观察下面这段代码

func1();
function func1(){
	console.log('This is func1');
}
func1();
function func1(){
	console.log('This is last func1');
}

输出结果为

This is last func1

This is last func1

原因分析:由于预解析机制,func1的声明会被提升,提升之后的代码为

function func1(){
console.log('This is last func1');
}
func1();
func1();

同名的函数,后面的会覆盖前面的,所以两次输出结果都是This is last func1。

(4)、变量和函数同名

alert(foo);
function foo(){}
var foo = 2;

当出现变量声明和函数同名的时候,只会对函数声明进行提升,变量会被忽略。所以上面的代码的输出结果为

function foo(){}

我们还是来把预解析之后的代码展现出来:

function foo(){};
alert(foo);
foo = 2;

再来看一种

var num = 1;
function num () {
alert( num );
}
num();

代码执行结果为:

Uncaught TypeError: num is not a function

按照常规的书写顺序,同名的函数与变量,变量会覆盖函数

直接上预解析后的代码:

function num(){
alert(num);
}
var num = 1;
num();

(5)、预解析是分作用域的

提升原则是提升到变量运行的环境(作用域)中去。

function showMsg()
{
var msg = 'This is message';
}
alert(msg); // msg未定义

还是直接把预解析之后的代码写出来:

function showMsg()
{
var msg;
msg = 'This is message';
}
alert(msg); // msg未定义

(6)、函数表达式不会提升

func();
var func = function(){
	alert("我被提升了");
};

这里会直接报错,func is not a function,原因就是函数表达式,并不会被提升。只是简单地当做变量声明进行了处理,如下

var func;
func();
func = function(){
	alert("我被提升了");
}

作用域

(1)、全局作用域

  直接编写在 script 标签之中的JS代码,都是全局作用域;

  或者是一个单独的 JS 文件中的。

  全局作用域在页面打开时创建,页面关闭时销毁;

  在全局作用域中有一个全局对象 window(代表的是一个浏览器的窗口,由浏览器创建),可以直接使用。

所有创建的变量都会作为 window 对象的属性保存。

 所有创建的函数都会作为 window 对象的方法保存。

 

(2)、局部作用域(函数作用域):

  在函数内部就是局部作用域,这个代码的名字只在函数的内部起作用

  调用函数时创建函数作用域,函数执行完毕之后,函数作用域销毁;

每调用一次函数就会创建一个新的函数作用域,它们之间是相互独立的。

将这样的所有的作用域列出来,可以有一个结构: 函数内指向函数外的链式结构。就称作作用域链。

例如:

function f1() {
function f2() {
}
}
var num = 456;
function f3() {
function f4() { 
}
}

(3)、隐式全局变量

声明变量使用`var`, 如果不使用`var`声明的变量就是全局变量( 禁用 )

因为在任何代码结构中都可以使用该语法. 那么再代码维护的时候会有问题. 所以除非特殊原因不要这么用.

下面的代码的错误

function foo () {
    var i1 = 1 // 局部
    i2 = 2, // 全局
    i3 = 3; // 全局
}

 

 对象

(1)、为什么要有对象

function printPerson(name, age, sex....) {
}
// 函数的参数如果特别多的话,可以使用对象简化
function printPerson(person) {
  console.log(person.name);
  ……
}

(2)、什么是对象

现实生活中:万物皆对象,对象是一个具体的事物,一个具体的事物就会有行为和特征。

举例: 一辆车、一部手机、一台电脑、一张桌子

车是一类事物,门口停的那辆车才是对象。特征:红色、四个轮子,行为:驾驶、刹车

(3)、JavaScript中的对象

JavaScript中的对象其实就是生活中对象的一个抽象。

JavaScript的对象是无序属性的集合。

其属性可以包含基本值、对象或函数。对象就是一组没有顺序的值。我们可以把JavaScript中的对象想象成键值对,其中值可以是数据和函数。

                            Class=”d1”

                            Key = value

对象的行为和特征

       特征---属性

       行为---方法

Tips

事物的特征在对象中用属性来表示。

事物的行为在对象中用方法来表示。

(4)、对象创建方式

对象字面量

var o = {
  name: 'zs',
  age: 18,
  sex: true,
  sayHi: function () {
    console.log(this.name);
  }
};   

new Object()创建对象

var person = new Object();
  person.name = 'lisi';
  person.age = 35;
  person.job = 'actor';
  person.sayHi = function(){
  console.log('Hello,everyBody');
}

工厂函数创建对象

function createPerson(name, age, job) {
  var person = new Object();
  person.name = name;
  person.age = age;
  person.job = job;
  person.sayHi = function(){
    console.log('Hello,everyBody');
  }
  return person;
}
var p1 = createPerson('张三', 22, 'actor');

自定义构造函数

function Person(name,age,job){
  this.name = name;
  this.age = age;
  this.job = job;
  this.sayHi = function(){
    console.log('Hello,everyBody');
  }
}
var p1 = new Person('张三', 22, 'actor');

(5)、属性和方法

1. 如果一个变量属于一个对象所有,那么该变量就可以称之为该对象的一个属性,属性一般是名词,用来描述事物的特征

2. 如果一个函数属于一个对象所有,那么该函数就可以称之为该对象的一个方法,方法是动词,描述事物的行为和功能

(6)、new关键字

构造函数,是一种特殊的函数。主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。

1.、构造函数用于创建一类对象,首字母要大写。

2.、构造函数要和new一起使用才有意义。

new在执行时会做三件事情:

1、new会在内存中创建一个新的空对象

2、new会让this指向这个新的对象

3、new会返回这个新对象

(7)、this详解

JS中this的指向问题,有时会让人难以捉摸,随着学习的深入,我们可以逐渐了解。

函数内部的this几个特点:

1. 函数在定义的时候this是不确定的,只有在调用的时候才可以确定

2. 一般函数直接执行,内部this指向全局window

3. 函数作为一个对象的方法,被该对象所调用,那么this指向的是该对象

4. 构造函数中的this其实是一个隐式对象,类似一个初始化的模型,所有方法和属性都挂载到了这个隐式对象身上,后续通过new关键字来调用,从而实现实例化

(8)、对象的使用

遍历对象的属性

通过for..in语法可以遍历一个对象

删除对象的属性

function fun() { 
  this.name = 'mm';
}
var obj = new fun(); 
console.log(obj.name); // mm 
delete obj.name;
console.log(obj.name); // undefined

JavaScript错误

  1. 、JavaScript错误

当 JavaScript 引擎执行 JavaScript 代码时,会发生各种错误。可能是语法错误,通常是程序员造成的编码错误或错别字。可能是拼写错误或语言中缺少的功能(可能由于浏览器差异)。可能是由于来自服务器或用户的错误输出而导致的错误。当然,也可能是由于许多其他不可预知的因素。

  1. 、JavaScript try 和 catch

try 语句允许我们定义在执行时进行错误测试的代码块。

catch 语句允许我们定义当 try 代码块发生错误时,所执行的代码块。

JavaScript 语句 try 和 catch 是成对出现的。
       在下面的例子中,我们故意在 try 块的代码中写了一个错字。catch 块会捕捉到 try 块中的错误,并执行代码来处理它。

var txt="";
 function message() {
	 try { adddlert("Welcome guest!"); } 
	catch(err) { txt="本页有一个错误。\n\n";
 	txt+="错误描述:" + err.message + "\n\n";
	 txt+="点击确定继续。\n\n";
	 alert(txt); 
} }
  1. finally 语句

finally 语句不论之前的 try 和 catch 中是否产生异常都会执行该代码块。

function myFunction() {
 var message, x;
 message = document.getElementById("p01"); 
message.innerHTML = ""; 
x = document.getElementById("demo").value;
 try { if(x == "") throw "值是空的"; 
if(isNaN(x)) throw "值不是一个数字";
 x = Number(x); if(x > 10) throw "太大"; if(x < 5) throw "太小"; } 
catch(err) { message.innerHTML = "错误: " + err + "."; }
 finally { document.getElementById("demo").value = ""; } }
  1. Throw 语句

throw 语句允许我们创建自定义错误。

正确的技术术语是:创建或抛出异常(exception)。

如果把 throw 与 try 和 catch 一起使用,那么您能够控制程序流,并生成自定义的错误消息。

语法:throw exception

异常可以是 JavaScript 字符串、数字、逻辑值或对象。

本例检测输入变量的值。如果值是错误的,会抛出一个异常(错误)。catch 会捕捉到这个错误,并显示一段自定义的错误消息

function myFunction() { var message, x; message = document.getElementById("message"); message.innerHTML = ""; x = document.getElementById("demo").value; try { if(x == "") throw "值为空"; if(isNaN(x)) throw "不是数字"; x = Number(x); if(x < 5) throw "太小"; if(x > 10) throw "太大"; } catch(err) { message.innerHTML = "错误: " + err; } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来给您补充一下示例代码,让它包含数组函数、对象、DOM 和 BOM 的应用。 JavaScript 代码示例: ```javascript // 数组示例 const myArray = [1, 2, 3, 4, 5]; console.log(myArray.length); // 输出数组长度 console.log(myArray[2]); // 输出数组第三个元素 // 函数示例 function addNumbers(a, b) { return a + b; } const result = addNumbers(5, 10); console.log(result); // 输出 15 // 对象示例 const myObject = { name: "张三", age: 25, address: "北京市" }; console.log(myObject.name); // 输出对象的 name 属性 // DOM 示例 const myButton = document.getElementById("myButton"); myButton.addEventListener("click", function() { alert("您点击了按钮!"); }); // BOM 示例 console.log(window.innerWidth); // 输出浏览器窗口宽度 console.log(window.location.href); // 输出当前页面的 URL ``` HTML 代码示例: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>我眼中的js</title> <link rel="stylesheet" href="style.css"> </head> <body> <header> <h1>我眼中的js</h1> <nav> <ul> <li><a href="#">首页</a></li> <li><a href="#">教程</a></li> <li><a href="#">博客</a></li> <li><a href="#">联系我们</a></li> </ul> </nav> </header> <main> <section> <h2>什么是JavaScript?</h2> <p>JavaScript是一种脚本语言,通常用于创建交互式网页。它可以让网页变得更加生动、有趣和交互性。JavaScript还可以用于创建Web应用程序、游戏、移动应用程序等。</p> </section> <section> <h2>为什么学习JavaScript?</h2> <p>JavaScript是Web开发的核心技术之一,它可以让您创建出色的Web应用程序和网站。学习JavaScript还可以提高您的编程技能,为您打开更广阔的职业发展前景。</p> <button id="myButton">点击我</button> </section> </main> <footer> <p>©2021 我眼中的js</p> </footer> <script src="main.js"></script> </body> </html> ``` 这些示例代码可以帮助您更全面地了解 JavaScript 的应用。请注意,这些代码只是示例,您可以根据您的需要进行修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值