数组

为什么要学习数组

之前学习的数据类型,只能存储一个值(比如:Number/String。我们想存储班级中所有学生的姓名,此时该如何存储?

数组的概念

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

数组的定义

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

通过数组字面量创建数组

// 创建一个空数组
var arr1 = [];
// 创建一个包含3个数值的数组,多个数组项以逗号隔开
var arr2 = [1, 3, 4];
// 创建一个包含2个字符串的数组
var arr3 = ['a', 'c']; // 可以通过数组的length属性获取数组的长度
console.log(arr3.length);
// 可以设置length属性改变数组中元素的个数
arr3.length = 0;

获取数组元素

数组的取值

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

遍历数组

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

数组遍历的基本语法:

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

数组中新增元素

数组的赋值

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

冒泡排序,从小到大

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>$永远的24k纯帅$</title><script>//冒泡排序:把所有的数据按照一定的顺序进行排列(从小到大,从大到下)var arr = [10, 0, 100, 20, 60, 30];//循环控制比较的轮数for (var i = 0; i < arr.length - 1; i++) {//控制每一轮的比较的次数for (var j = 0; j < arr.length - 1 - i; j++) {if (arr[j] < arr[j + 1]) {var temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}console.log(arr);</script>
</head>
<body></body>
</html>

函数

为什么要有函数

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

什么是函数

把一段相对独立的具有特定功能的代码块封装起来,形成一个独立实体,就是函数,起个名字(函数名),在后续开发中可以反复调用

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

函数的定义

  • 函数声明
function 函数名(){// 函数体
}
  • 函数表达式
var fn = function() {// 函数体
}
  • 特点:

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

函数的调用

  • 调用函数的语法:
函数名();
  • 特点:

    函数体只有在调用的时候才会执行,调用需要()进行调用。
    可以调用多次(重复使用)

代码示例:

// 声明函数
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();

函数的参数

  • 为什么要有参数
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

函数的返回值

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

返回值语法:

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

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

返回值详解:
如果函数没有显示的使用 return语句 ,那么函数有默认的返回值:undefined
如果函数使用 return语句,那么跟再return后面的值,就成了函数的返回值
如果函数使用 return语句,但是return后面没有任何值,那么函数的返回值也是:undefined
函数使用return语句后,这个函数会在执行完 return 语句之后停止并立即退出,也就是说return后面的所有其他代码都不会再执行。

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

arguments的使用

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

案例

求斐波那契数列Fibonacci中的第n个数是多少? 1 1 2 3 5 8 13 21…

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>$永远的24k纯帅$</title><script>//求斐波那契数列,12---144//1 1 2 3 5 8 13 21 34 55 89 144function getFib(num) {var num1=1;var num2=1;var sum=0;for(var i=3;i<=num;i++){sum=num1+num2;num1=num2;num2=sum;}return sum;}console.log(getFib(12));</script>
</head>
<body></body>
</html>

输入某年某月某日,判断这一天是这一年的第几天?

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>$永远的24k纯帅$</title><script>//输入,年月日,获取这个日期是这一年的第多少天//判断这个年份是不是闰年function isLeapYear(year) {return year%4==0&&year%100!=0||year%400==0;}//年---月---日:2017年4月28日function getDays(year, month, day) {//定义变量存储对应的天数var days = day;//如果用户输入的是一月份,没必要向后算天数,直接返回天数if (month == 1) {return days;}//代码执行到这里-----说明用户输入的不是1月份//用户输入的是7月份23日----1,2,3  +23//定义一个数组,存储每个月份的天数var months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];//小于的是输入的月份-1for (var i = 0; i < month - 1; i++) {days += months[i];}//需要判断这个年份是不是闰年if(isLeapYear(year)&&month>2){days++;}return days;}console.log(getDays(2000,3,2));//函数里面可以调用其他的函数
//    function f1() {//      console.log("我是一个函数");
//      f2();//函数的调用
//    }
//    function f2() {//      console.log("我也是一个函数");
//    }
//
//    f1();</script>
</head>
<body></body>
</html>

函数其它

匿名函数

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

匿名函数如何使用:

将匿名函数赋值给一个变量,这样就可以通过变量进行调用
匿名函数自调用

关于自执行函数(匿名函数自调用)的作用:防止全局变量污染。

自调用函数

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

(function () {alert(123);
})();

函数是一种数据类型

function fn() {}
console.log(typeof fn);
  • 函数作为参数

因为函数也是一种类型,可以把函数作为两一个函数的参数,在两一个函数中调用

  • 函数做为返回值

因为函数是一种类型,所以可以把函数可以作为返回值从函数内部返回,这种用法在后面很常见。

function fn(b) {var a = 10;return function () {alert(a+b);}
}
fn(15)();

代码规范

1.命名规范
2.变量规范   var name = 'zs';
3.注释规范// 这里是注释
4.空格规范
5.换行规范var arr = [1, 2, 3, 4];if (a > b) {}for(var i = 0; i < 10; i++) {}function fn() {}

作用域

作用域:变量可以起作用的范围

全局变量和局部变量

  • 全局变量

    ​在任何地方都可以访问到的变量就是全局变量,对应全局作用域

  • 局部变量

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

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

块级作用域

任何一对花括号({和})中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为块级作用域。
在es5之前没有块级作用域的的概念,只有函数作用域,现阶段可以认为JavaScript没有块级作用域

词法作用域

变量的作用域是在定义时决定而不是执行时决定,也就是说词法作用域取决于源码,通过静态分析就能确定,因此词法作用域也叫做静态作用域。

在 js 中词法作用域规则:

  • 函数允许访问函数外的数据.
  • 整个代码结构中只有函数可以限定作用域.
  • 作用域规则首先使用提升规则分析
  • 如果当前作用规则中有名字了, 就不考虑外面的名字
var num = 123;
function foo() {console.log( num );
}
foo();if ( false ) {var num = 123;
}
console.log( num ); // undefiend

作用域链

只有函数可以制造作用域结构, 那么只要是代码,就至少有一个作用域, 即全局作用域。凡是代码中有函数,那么这个函数就构成另一个作用域。如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域。将这样的所有的作用域列出来,可以有一个结构: 函数内指向函数外的链式结构。就称作作用域链。
// 案例1:
function f1() {function f2() {}
}var num = 456;
function f3() {function f4() {    }
}

// 案例2
function f1() {var num = 123;function f2() {console.log( num );}f2();
}
var num = 456;
f1();

预解析

JavaScript代码的执行是由浏览器中的JavaScript解析器来执行的。JavaScript解析器执行JavaScript代码的时候,分为两个过程:预解析过程和代码执行过程

预解析过程:

  1. 把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值。
  2. 把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用。
  3. 先提升var,在提升function

JavaScript的执行过程

var a = 25;
function abc (){alert(a);//undefinedvar a = 10;
}
abc();
// 如果变量和函数同名的话,函数优先
console.log(a);
function a() {console.log('aaaaa');
}
var a = 1;
console.log(a);

全局解析规则

函数内部解析规则

变量提升

  • 变量提升

    定义变量的时候,变量的声明会被提升到作用域的最上面,变量的赋值不会提升。

  • 函数提升

    JavaScript解析器首先会把当前作用域的函数声明提前到整个作用域的最前面

// 1、-----------------------------------
var num = 10;
fun();
function fun() {console.log(num);var num = 20;
}
//2、-----------------------------------
var a = 18;
f1();
function f1() {var b = 9;console.log(a);console.log(b);var a = '123';
}
// 3、-----------------------------------
f1();
console.log(c);
console.log(b);
console.log(a);
function f1() {var a = b = c = 9;console.log(a);console.log(b);console.log(c);
}

Web前端学习笔记——JavaScript之数组、函数、作用域相关推荐

  1. Web前端学习笔记——JavaScript之WEBAPI、BOM、DOM及获取页面元素

    Web API介绍 API的概念 API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访 ...

  2. Web前端学习笔记——JavaScript之面向对象游戏案例:贪吃蛇

    面向对象游戏案例:贪吃蛇 案例相关源码以上传到 GitHub :https://github.com/lipengzhou/new-snake 案例介绍 游戏演示 在线演示地址:贪吃蛇 案例目标 游戏 ...

  3. web前端学习笔记(最新)

    web前端学习笔记 大家好,我是链表哥,新的学期,新的学习,我会为您展示我的学习进程. 一:什么是WEB前端? 所谓的Web前端指的是用户所能接触到的,并服务于用户的前沿端口,经我们程序员编辑修饰后展 ...

  4. 零基础web前端学习之JavaScript 和css 阻塞

    web前端学习之JavaScript 和css 阻塞,JavaScript 是客户端和服务器端的脚本语言,可以插入HTML 页函中, 并且是目前较热门的Web 开发语言.同时, JavaScript ...

  5. web前端学习笔记之JavaScript

    文章目录 1 JavaScript简介 2 JS基础 3 JS代码编写位置 3.1 行内式 3.2 内嵌式 3.3 外联式 4 基本语法 5 字面量和变量 5.1 字面量 5.2 变量 6 标识符 7 ...

  6. 前端学习笔记——JavaScript进阶

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.JavaScript 面向对象 1. 面向对象编程介绍 1.1 两大编程思想 1.2 面向过程编程 1.3 面向对 ...

  7. web前端学习笔记之Node.js

    文章目录 01 浏览器中的JavaScript运行环境 02 什么是Node.js 03 安装Node.js 04 使用Node运行JS代码 05 fs模块 文件操作 05.1 什么是fs模块 05. ...

  8. 重学前端-学习笔记-JavaScript对象

    说明 重学前端是程劭非(winter)在极客时间开的一个专栏,在此主要整理我的学习笔记.如有侵权,请联系我,谢谢. javascript对象特征 对象具有唯一标识性:完全相同的两个对象,也不是同一个对 ...

  9. Web前端学习笔记(1)

    文章目录 一.第一部分 1.1内容一 Web前端导入 二.第二部分 2.1内容一 HTML和CSS的定义 三.第三部分 3.1内容一 宇宙第一编译器Vs Code 3.2内容二 快捷键的使用 四.第四 ...

最新文章

  1. Android Priority Job Queue (Job Manager):多重不同Job并发执行并在前台获得返回结果(四)...
  2. 在运行期通过反射了解JVM内部机制
  3. [BUUCTF-pwn]——picoctf_2018_leak_me(内涵peak小知识)
  4. python cls_关于python中的self,ins , cls的解释
  5. 9、Flutter 实现 生成二维码
  6. 实现PIX需要参考的标准资料
  7. IBM小型机维护手册
  8. python 字符串前面的“r“是个啥?
  9. 从无到有构建计算机网络
  10. 100个经典C语言程序(益智类问题)
  11. 怎么将pdf转换成jpg图片格式
  12. 驭见新知 | 给无人车戴上VR眼镜是种什么体验?
  13. Windows触发事件ID说明
  14. 防火墙的双机热备技术(上下行接口连接二层设备)
  15. [CAS]ServiceTicket [x] with service [x] does not match supplied service [x]
  16. python如何查询数据库_通过Python查询数据库信息
  17. 7.深入浅出:互补输出级——参考《模拟电子技术基础》清华大学华成英主讲
  18. ssm毕设项目水果生鲜销售系统7826c(java+VUE+Mybatis+Maven+Mysql+sprnig)
  19. IDEA中JAVA代码调试技巧
  20. Visual C++程序设计——MFC整理笔记

热门文章

  1. 解决过滤王不刷卡上机网络配置问题(总结篇)
  2. HYBBS新模板一个非常漂亮的bbs源码
  3. linux动态库修改名称(修改库文件内容)
  4. 商场弱电监控系统招标方案
  5. 4.CCNP闫辉视频笔记路由重分发
  6. 一个程序员的真实故事(下)
  7. comps电磁场模拟软件_现在主流的电机仿真分析软件是哪个,电机厂商都用哪些软件?...
  8. linux删除文件前几行,linux删除文件的前n行
  9. jQueryHTML5 UI框架Ignite UI 13.2新功能大揭秘(二)
  10. 老板运煤问题及解决方案