JavaScript知识点速查

164 阅读14分钟

初识JavaScript

因为文章字数的影响,无法展示全部内容,更多内容,请跳转至我的CSDN或者我的个人站点。 我的CSDN 我的个人站点-JavaScript+Jquery知识点速查

JavaScript 标准参考教程

浏览器执行js简介

  • 渲染引擎:解析css和html
  • js引擎:编译js代码,逐行解析
  • js是基于对象和事件驱动的松散性,解释性语言。
<script type="null">
alert('我是编程语言,用来控制电脑网页弹出你好'); alert('我是编程语言,用来控制电脑网页弹出你好');
</script>

各个浏览器的js引擎也不相同,所以也会有兼容行问题。

js组成

  1. EcmaScript:JavaScript基本语法
  2. DOM:页面文档对象模型(对页面中的文档进行操作)
  3. BOM:浏览器对象模型(对浏览器窗口做出操作)

书写位置

  1. 行内式
<!-- 1.行内式的js 直接写到元素内部 -->
    <input type="button" value="唐伯虎" onclick="alert('秋香姐')">
  1. 内嵌式
  • 最好放到html下部分
 <script>
        // alert('沙漠骆驼');
    </script>
  1. 外部
  • 结构更加易读。
 <!-- 3.外部js写法 双标签 -->
    <script src="my.js"></script>

javascript标签中无需写代码,否则会被忽略!

思维导图

JavaScript

JavaScript基础

JS中 let和var的区别

  • ES6 新增了let命令,用来声明局部变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效,而且有暂时性死区的约束。 先看个var的常见变量提升的面试题目:
题目1var a = 99;            // 全局变量a
f();                   // f是函数,虽然定义在调用的后面,但是函数声明会提升到作用域的顶部。 
console.log(a);        // a=>99,  此时是全局变量的a
function f() {
  console.log(a);      // 当前的a变量是下面变量a声明提升后,默认值undefined
  var a = 10;
  console.log(a);      // a => 10
}

// 输出结果:
undefined
10
99

ES6可以用let定义块级作用域变量

在ES6之前,我们都是用var来声明变量,而且JS只有函数作用域和全局作用域,没有块级作用域,所以{}限定不了var声明变量的访问范围。 例如:

{ 
  var i = 9;
} 
console.log(i);  // 9

ES6新增的let,可以声明块级作用域的变量。

{ 
  let i = 9;     // i变量只在 花括号内有效!!!
} 
console.log(i);  // Uncaught ReferenceError: i is not defined

let 配合for循环的独特应用

let非常适合用于 for循环内部的块级作用域。JS中的for循环体比较特殊,每次执行都是一个全新的独立的块作用域,用let声明的变量传入到 for循环体的作用域后,不会发生改变,不受外界的影响。看一个常见的面试题目:

for (var i = 0; i <10; i++) {  
  setTimeout(function() {  // 同步注册回调函数到 异步的 宏任务队列。
    console.log(i);        // 执行此代码时,同步代码for循环已经执行完成
  }, 0);
}
// 输出结果
1010// 这里面的知识点: JS的事件循环机制,setTimeout的机制等

如果把 var改成 let声明:

// i虽然在全局作用域声明,但是在for循环体局部作用域中使用的时候,变量会被固定,不受外界干扰。
for (let i = 0; i < 10; i++) { 
  setTimeout(function() {
    console.log(i);    //  i 是循环体内局部作用域,不受外界影响。
  }, 0);
}
// 输出结果:
0  1  2  3  4  5  6  7  8 9

let没有变量提升与暂时性死区

用let声明的变量,不存在变量提升。而且要求必须 等let声明语句执行完之后,变量才能使用,不然会报Uncaught ReferenceError错误。

console.log(aicoder);    // 错误:Uncaught ReferenceError ...
let aicoder = 'aicoder.com';
// 这里就可以安全使用aicoder

ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。 总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。

let变量不能重复声明

let不允许在相同作用域内,重复声明同一个变量。否则报错: Uncaught SyntaxError: Identifier 'XXX' has already been declared

例如:

let a = 0;
let a = 'sss';
// Uncaught SyntaxError: Identifier 'a' has already been declared

总结

ES6的let让js真正拥有了块级作用域,也是向这更安全更规范的路走,虽然加了很多约束,但是都是为了让我们更安全的使用和写代码。

字面量

在计算机科学中,字面量(Literal)是在计算机中描述 事/物

javascript是否写分号结尾

  • 根据具体情况实际选择
  • 写和不写都可以

javaScript输入输出语句

方法说明归属
alert(msg)浏览器弹出警示框浏览器
console.log(msg)浏览器控制台打印输出信息浏览器
prompt(info)浏览器弹出输入框,用户可以输入浏览器
doucument.write()页面输出内容,识别标签浏览器

注意:

alert主要用来显示消息给用户,console.log()用来给程序员查看自己运行时的消息。

prompt取过来的值是字符类型的

变量

  • 属性值:var(variable的缩写)
  • 装数据的盒子

变量语法拓展

  • 更新变量:变量值以最后一次赋的值为准
  • 同时声明多个变量:声明一个变量后,中间用逗号隔开
  • let声明变量 let即关键字(let:允许,许可,让,要),所谓关键字是系统专门提供的用来声明的变量的词语
var myfirstname = 99,
            kjlj = 54;

声明变量的特殊情况

情况说明结果
var age;console.log(age);只声明不赋值undefined(未定义)
console.log(age);不声明,不赋值,直接使用报错
age = 10;console.log(age);不声明,只赋值10

变量的命名规范

  • 字母,数字,下划线,美元符号组成
  • 严格区分大小写
  • 不能以数字开头。18age是错误的
  • 不能是关键字,保留字命名:var,fo,while
  • 变量名必须有意义
  • 遵循驼峰命名,首字母小写,后面单词的首字母大写:myFirstName
  • 推荐翻译网站:有道

常量

  • 概念:使用const声明的变量为‘常量’
  • 使用场景:当一个变量永远不会改变的时候,使用 const来声明,而不是let.
  • 命名规范:和变量一致

注意:常量不允许重新赋值,声明的时候必须赋值(初始化) 小技巧:不需要重新赋值的数值用const

变量声明关键字总结

let - 现在实际开发的声明方式(2022) var - 以前的声明变量的方式,会有很多问题(2019) const -类似于let ,但是变量值无法被修改

数据类型

  • js的变量数据类型是只有程序在运行过程中,根据等号右边的值来确定的。
  • js是动态语言,变量的数据类型是可以变化的。
  • typeo检测变量的数据类型
  • 可以通过控制台输出的字体颜色来判断到底是哪个字符类型(蓝色,数字;黑色,字符串;灰色 ,未定义)

数据类型的分类

  • 简单数据类型(Number,String,Boolean,Underfined,Null)
  • 引用数据类型(object)

简单数据类型(栈)

简单数据类型说明默认值typeof结果
Number数字型,包含整型值和浮点型值,如:21,0.210
Booolean布尔值类型,如true,false,等价于0,1false
symbol定义的值具有唯一性
string字符串类型“”
Undefinedvar a;声明了变量a,但没有给值,此时a=undefinedundefinedundefined
Nullvar a= null;声明了变量a为空值nullobject

数字型Number

  • 可以是整数,小数,正数,负数。
  • 最常见的有二进制,八进制,十六进制。
  • isNaN():这个方法用来判断非数字,并且返回一个值,如果是数字返回 false ,如果不是返回的是true。

Snipaste_2022-06-14_09-26-24

特殊值
  • Infinity,无穷大
  • -Infinity, 无穷小
  • Number.Max_Value,数字型最大值
  • Number.Min_Value,数字型最小值
  • NaN,缩写:not a number,代表一个非数值
		//1.八进制 0~7
        var num1 = 010;
        console.log(num1);
        //2.十六进制 0~9 a~f
        var num2 = 0x9;
        console.log(num2);
        //数字型最大值
        console.log(Number.MAX_VALUE);
        //无穷大
        console.log(Number.MAX_VALUE * 2); //Infinity
        //数字型的最小值
        console.log(Number.MIN_VALUE);
        //无穷小
        console.log(Number.MIN_VALUE * 2); //-Infinity
        //非数字 NaN

NaN代表一个计算错误。它是一个不正确的或者未定义的数学操作所到的的结果

NaN是粘性的。任何对NaN的操作都会返回NaN

在Js中八进制前面加0,十六进制前面加0X

未定义类型(undefined)

未定义是比较特殊的类型,只有一个值 undefined.

  • 什么情况下出现未定义类型 只声明变量,不赋值的情况下,变量默认值为 undefined,一般很少【直接】为某个变量赋值为

字符串型String

  • 字符串可以是引导中的任意文本,其语法为双引号(“ ”),和单引号(' ')或反引号包裹的数据( ``` `)
  • html使用双引号,js推荐使用单引号
  • 字符串嵌套(外单内双)
转义符解释说明
\n换行符
\斜杠|
''单引号
''''双引号
\ttab缩进
\b空格,b是blank的意思

注意事项:

  1. 引号必须成对出现
  2. 单引号和双引号可以相互嵌套,口诀外双内单,或者外单内双
  3. 必要时可以使用转义符 \,输出单引号或双引号

引用数据类型(堆)

  • 包括:

1、对象(Object)类型,是一组由键、值组成的无序集合;数据类型 object

2、数组(Array)类型,是一组按顺序排列的数据的集合;数据类型 object

3、函数(Function)类型,是一段具有特定功能的代码块。数据类型 function

字符串拼接

引号拼接字符串(ES5)

场景:+运算符可以实现字符串的拼接。 口诀:数字相加,字符相连

	<script>
        //1.检测获取字符串的长度 length
        var str = 'my name is andy';
        console.log(str.length); //15
        //2.字符串拼接+,'数值相加,字符相连'
        console.log('沙漠' + '骆驼');
        console.log('小李' + 18 + '岁');
        var age = 18;
        console.log('小李' + age + '岁');

        console.log(24 + 24); //48
    </script>

模板字符串(ES6)

  • 使用场景: 拼接字符串和变量 在没有它之前,要拼接字符串比较麻烦
  • 语法 反引号·· 内容拼接变量时,用${}包住变量
    <script>
        let age = 18
        document.write(`我今年${age}岁了`)
		var nan = 10 ,nv = 44;
		console.log(`本班男生${nan}人,女生${nv}人,共计${nan + nv}人`);
    </script>

Snipaste_2022-06-14_09-45-09

数据类型的转换

隐式转换

某些运算符(除加法四则运算),if条件被执行时,系统内部自动将数据类型进行转换,这种转换称为隐式转换。

  • 规则: + 号两边只要有一个是字符串,就会把另外一个转成字符串(拼接) 除了+以外的算术运算符,比如 - * /等都会把数据转换成数据类型。
  • 缺点 转换类型不明显,靠经验总结
  • 小技巧 +号作为正号解析可以转换成字符串类型 任何数据和字符串相加的结果都是字符串

加法:操作数是number型;

操作数是undefined,null,boolean,隐式调用Number()进行数据类型的转换

强制转换

转换为字符串

方式说明案例
toString()转换成字符串var vm = 1;alert(num.toString())
String()强制转换转换成字符串var num =1;slert(String(num));
加号 拼接字符串和字符串拼接的结果都是字符串var num =1;alert(num+"我是字符串")
    <script>
        // 1.把数字类型转换为字符串型 变量.toString()
        var num = 10;
        var str = num.toString();
        console.log(str);
        console.log(typeof str);
        // 2.利用String(变量)
        console.log(String(num));
        //3.利用+拼接字符串的方法实现转换效果,隐式转换
        console.log(num + '');
    </script>

转换为数字型(重点)

方式说明案例
parselnt(string)将stirng类型转成整数数值型parselnt('78')
parseFloat(string)将string类型转换成浮点数数值型parseFloat('78.21')
Number()强制转换函数将string类型转换成数值型Number('12')
js隐式转换(. * / )利用算数运算隐式转换为数值型'12'-0

转换为布尔型

  • 代表空,否定的值会被转换成false,如''(空字符串)0NAN,null,underfined
  • 其余值都会转换成true
  • 隐式转换:
  1. 有字符串的加法""+1,结果是"1"
  2. 减法 - (像大多数运算一样)只能用于数字,它会使空字符串""转换为 0
  3. null经过数字转换后会变为0
  4. underfined经过数字转换后会变为 NaN
方式说明案例
Boolean()函数其他类型转换成布尔值Boolean('true')

Snipaste_2022-06-14_10-52-43

运算符

前置递增

  • 变量先加一,然后返回结果
var num = 0
++num

后置递增

  • 先表达式返回原值,后面变量再自加一
var num = 0
num++

比较运算符

运算符名称说明案例结果
==判断号(会转型)37 == 37true
=== !==全等要求值和数据类型都一致37 === ‘37’false

逻辑运算符

逻辑运算符号说明案例
&&逻辑与,andtrue&&false
||逻辑或,ortrue||or
!逻辑非,not!true

逻辑中断

  • 短路运算的原理:当有多个表达式时,左边的表达式可以确定结果时,就不再继续运算右边表达式的值;

逻辑与

  • 语法:表达式1&&表达式2
  • 如果第一个表达式值为真,则返回表达式2
  • 如果第一个表达式值为假,则返回表达式1

逻辑或

  • 语法:表达式1 | | 表达式2
  • 如果第一个表达式值为真,则返回表达式1
  • 如果第一个表达式值为假,则返回表达式2

赋值运算符

  • 概念:用来把数据赋值给变量的运算符
赋值运算符号说明案例
=直接赋值var user='sss'
+=,-=加,减一个数后再赋值var age=10;age+=5;//5
* =,/=,%=乘,除,取模后赋值var age=2;age * =5//10

运算符优先级

优先级运算符顺序
1小括号()
2一元运算符++,-,!
3算数运算符先 * / %后+ -
4关系运算符> >= < <=
5相等运算符== != === !==
6逻辑运算符**先&& 后**
7赋值运算符=
8逗号运算符.

注意:&&的权重比||

不同数字类型运算符之间的操作

比较运算符 : > ,< >= , <= ,== ,!=, ===, !==,返回值是布尔类型

  1. 都是number型,大小进行比较
  2. 都是string型,按位按照ASCII表1进行比较
  3. number,string :隐式调用Number()把string 转为number进行计算
  4. ==:值相等
  5. ===:值相等,数据类型相同
  console.log(2 > "100");  //false  "100"转为 100 与2进行比较
  console.log("234" > "100"); //true  这种比较为ASCII码比较,依次取每个字符,字符转为ASCII码进行比	较
  console.log("15" > "9");  //false       
  console.log(15 > 9); //ture
  console.log(12 == "12"); //true
  console.log(1 == true); //ture  Number(true)转换成1
  console.log(0 === false); //false 
  console.log(0 == undefined); //false Number(undefined)转换成NaN
  console.log(0 == ""); //true
  console.log(0 == " "); //true

算术运算符:+,-,*,/,%,++,--,**

  console.log(1 + 133);  //134
  console.log(1 + "133");  //1133
  console.log(1 - "133"); //-132
  console.log(1 - "abc");  //NAN  直接是非数字类型

逻辑运算符:隐式调用Boolean()判断真假

  1. 0,false,null,undefined,NaN,"" 这些为假
  2. &&:返回第一个假值,运用(短路原则)会返回第一个假值
  3. ||: 返回第一个真值(短路原则)
  var num = 10, bool = true, str = "abc";
  console.log(num && bool && 0); //0 
  console.log(num && str); //"abc"
  console.log(bool && str); //"abc"


  console.log(0 && str); //0
  console.log(false && num); //false
  console.log(undefined && num); //undefined

  console.log(str && false); //false
  console.log(0 && ""); //0
  console.log("" && 0); // ""

  console.log(num || bool || 0); //10
  console.log(num || str); //10
  console.log(bool || str); //true

  console.log(0 || str); //"abc"
  console.log(false || num); //10
  console.log(undefined || num); //10

  console.log(str || false); //10
  console.log(0 || ""); //""  没真值,只能返回第二个
  console.log("" || 0); //0

取反:!

真变假假变真

  var num = 10, bool = true, str = "abc";
  console.log(!true); //false
  console.log(!0); //true
  console.log(!str); //false

短路的代码不会执行

  console.log(str && num++); //10  && 期望返回第一个假值,没有假值,就返回最后一个真值,两个都是真值,返回第二个num++
  console.log(num);  //11
  console.log(false && ++num);  //false  
  console.log(num);  //11  被短路的代码不运行了,所以还是11
  console.log(num++ || 0); //11 最后做自增运算 12
  console.log(0 || ++num); //13
  console.log(0 || str > num); //fales   返回 str>num 的结果NaN
  console.log(num);   //13

表达式和语句

  • 表达式: 表达式是可以被求值的代码,javaScript引擎会计算出一个结果
  let x = 7
  3+4
  num++
  • 语句; 语句是一段可以执行的代码。 比如:prompt( )可以弹出一个输入框,还有if语句 for循环语句等等

区别: 表达式:表达式可以被求值,所以它可以写在赋值语句的右侧 语句:而语句不一定有值,比如alert()for 和break等语句就不能用于赋值。

流程控制

  1. 顺序结构
  2. 分支结构
  • 根据不同的条件,执行不同的路径,得到不同的结果。

if语句

    <script>
        //1. if 的语法结构
        // if (条件表达式) {
        //     //执行语句
        // }
        if (3 > 5) {
            alert('沙漠骆驼');
        }
    </script>

案例(判断闰年)

  • 算法:可以被4整除且不能整除100的为润年或者可以被400整除的就是润年

三元表达式

条件表达式?表达式1:表达式2

  • 如果条件表达式结果为正,则返回表达式一的值,否则返回表达式二的值

数字补零案例

    <script>
        var time = prompt('输入数字')
        var resule = time < 10 ? '0' + time : time;
        alert(resule);
    </script>

switch语句

  • switch语句是多分支语句,可以实现多对一。
    <script>
        switch (表达式) {
            case value1:
                执行语句1;
                break;
            case value2:
                执行语句2;
                break;
            default:
                执行最后的语句

        }

在判断条件中,条件为真的情况

  1. 如果是数字:0是否,1是真
  2. 如果是字符串:字符串不空是真,字符串空是假

if/else和switch的区别

  • 一般情况下可以相互替换
  • switch...case语句通常在处理case为比较确定值的情况,而if...else..语句更加灵活,通常用与范围判断(大于,等于某个范围)
  • switch语句进行条件判断后直接执行程序的条件语句,效率更高是。而if...else.语句有几种条件,就得判断多次。
  • 分支比较小的情况下,if...else语句执行效率比switch高。
  • 分支比较多的情况下,switch语句执行效率高,而且结构清晰。
  1. 循环结构
  • 执行规律任务,重复执行多次语句

for循环

掌握 for 循环语句,让程序具备重复执行能力

for 是 JavaScript 提供的另一种循环控制的话句,它和 while 只是语法上存在差异。

for语句的基本使用

  1. 实现循环的 3 要素
<script>
  // 1. 语法格式
  // for(起始值; 终止条件; 变化量) {
  //   // 要重复执行的代码
  // }

  // 2. 示例:在网页中输入标题标签
  // 起始值为 1
  // 变化量 i++
  // 终止条件 i <= 6
  for(let i = 1; i <= 6; i++) {
    document.write(`<h${i}>循环控制,即重复执行<h${i}>`)
  }
</script>
  1. 变化量和死循环,for 循环和 while 一样,如果不合理设置增量和终止条件,便会产生死循环。

  2. 跳出和终止循环

<script>
    // 1. continue 
    for (let i = 1; i <= 5; i++) {
        if (i === 3) {
            continue  // 结束本次循环,继续下一次循环
        }
        console.log(i)
    }
    // 2. break
    for (let i = 1; i <= 5; i++) {
        if (i === 3) {
            break  // 退出结束整个循环
        }
        console.log(i)
    }
</script>

结论:

  • JavaScript 提供了多种语句来实现循环控制,但无论使用哪种语句都离不开循环的3个特征,即起始值、变化量、终止条件,做为初学者应着重体会这3个特征,不必过多纠结三种语句的区别。
  • 起始值、变化量、终止条件,由开发者根据逻辑需要进行设计,规避死循环的发生。
  • 当如果明确了循环的次数的时候推荐使用for循环,当不明确循环的次数的时候推荐使用while循环

注意:for 的语法结构更简洁,故 for 循环的使用频次会更多。

循环嵌套

利用循环的知识来对比一个简单的天文知识,我们知道地球在自转的同时也在围绕太阳公转,如果把自转和公转都看成是循环的话,就相当于是循环中又嵌套了另一个循环。

universe

实际上 JavaScript 中任何一种循环语句都支持循环的嵌套,如下代码所示:

64791826139

// 1. 外面的循环 记录第n天 
for (let i = 1; i < 4; i++) {
    document.write(`第${i}天 <br>`)
    // 2. 里层的循环记录 几个单词
    for (let j = 1; j < 6; j++) {
        document.write(`记住第${j}个单词<br>`)
    }
}

记住,外层循环循环一次,里层循环循环全部

倒三角

 // 外层打印几行
for (let i = 1; i <= 5; i++) {
    // 里层打印几个星星
    for (let j = 1; j <= i; j++) {
        document.write('★')
    }
    document.write('<br>')
}

64791867895

九九乘法表

样式css

span {
    display: inline-block;
    width: 100px;
    padding: 5px 10px;
    border: 1px solid pink;
    margin: 2px;
    border-radius: 5px;
    box-shadow: 2px 2px 2px rgba(255, 192, 203, .4);
    background-color: rgba(255, 192, 203, .1);
    text-align: center;
    color: hotpink;
}

javascript

 // 外层打印几行
for (let i = 1; i <= 9; i++) {
    // 里层打印几个星星
    for (let j = 1; j <= i; j++) {
        // 只需要吧 ★ 换成  1 x 1 = 1   
        document.write(`
		<div> ${j} x ${i} = ${j * i} </div>
     `)
    }
    document.write('<br>')
}

while循环

  • 条件为true,执行循环语句,否则推出循环

do while循环

  • do while循环其实是while循环的一个变体,该循环会先执行一次代码块,然后对条件表达式进行判断,如果为真,就会重复执行循环体,否则退出循环。

continue关键字

  • 用于立即跳出本次循环,继续下一次循环(本次循环中,continue之后的代码就会少执行一次)

break关键字

  • 立即跳出整个循环(循环结束)

数组(Array)

知道什么是数组及其应用的场景,掌握数组声明及访问的语法。

  • 数组就是一组数据的集合,存储在单个变量下的优雅方式。
  • 数组里面的数据一定要逗号隔开
  • 数组里面的数据比如,1,2,我们称为数组元素。
  • 任意数据类型都可以放入
  • 数组在 JavaScript 中并不是新的数据类型,它属于对象类型。
<script>
  // 1. 语法,使用 [] 来定义一个空数组
  // 定义一个空数组,然后赋值给变量 classes
  // let classes = [];

  // 2. 定义非空数组
  let classes = ['小明', '小刚', '小红', '小丽', '小米']
</script>

通过 [] 定义数组,数据中可以存放真正的数据,如小明、小刚、小红等这些都是数组中的数据,我们这些数据称为数组单元,数组单元之间使用英文逗号分隔。

创建数组

  1. 利用new 创建数组
    <script>
        var arry = new Array(); //创建了个一空数组
    </script>	
  1. 利用数组字面量创建数组
    <script>
        var arr = []; //创建了一个空数组
        var arr1 = [1, 2, 'pingk老师', true];
        //数组里面的数据一定要逗号隔开
        //数组里面的数据比如,1,2,我们称为数组元素。
    </script>
  1. 进阶
    <script>
        var arr = new Array(2);//这个2表示数组长度为2,里面有两个空值
        var arr1 = new Array(2,3);//等价于[2,3]
        console.log(arr1);
    </script>

获取数组元素

1.数组的索引

  • 下标:用来访问数组元素的序号(数组下标从开始)
console.log(arr1[2]);

检测数组方法

  1. Instanceof 运算符 它可以用来检测是否是数组
    <script>
        var arr = [];
        var obj ={};
        console.log(arr instanceof Array);//true
        console.log(ogj instanceof Array);//false
    </script>
  1. Array.isArray(参数);H5新增的方法,ie9以上版本支持
	console.log(Array.isArray(arr));//true

遍历数组

    <script>
        var arr = ['red', 'green', 'blue'];
        for (var i = 0; i <= 2; i++) {
            console.log(arr[i]);
        }
    </script>

案例(求数组最大值)

    <script>
        var max = 1;
        var arr = [1, 2, 3, 66, 78, 234, 123, 12, 345, 435];
        for (var i = 0; i <= arr.length; i++) {
            if (max < arr[i]) {
                max = arr[i];
            }
        }
        console.log(max);

案例(数组转换为分割字符串)

    <script>
        var str = '';
        var arr = ['red', 'blue', 'green'];
        var step = '|'
        for (var i = 0; i < arr.length; i++) {
            str += arr[i] + step;
        }
        console.log(str);
    </script>

数组长度

  • 数组名后面加**.length**属性可以得到数组长度;
  • 数组长度是元素个数,不要跟索引号混淆;
  • arr.length是动态检测数组元素的个数;
    <script>
        var arr = ['red', 'green', 'blue'];
        for (var i = 0; i <= arr.length; i++) {
            console.log(arr[i]);
        }
    </script>

数组新增元素

  1. 可以通过修改length长度新增数组元素。
    <script>
        var arr = ['red', 'blue', 'green'];
        console.log(arr.length);
        arr.length = 5; //数组长度修改为5
        console.log(arr);//修改后最后两个元素没有给值,所以是undefined
    </script>
  1. 可以通过修改数组索引新增数组元素(追加数组元素)
    <script>
        var arr1 = ['red', 'blue', 'green'];
        arr1[3] = 'pink';
        console.log(arr1);
        arr1[0] = 'yellow'; //替换原来的数组元素
    </script>

筛选数组

  1. 方法一
    <script>
        var arr = [2, 0, 1, 22, 121, 454, 3, 35, 435, 45];
        var newArry = [];
        var j = 0;
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] >= 10) {
                newArry[j] = arr[i];
                j++;
            }
        }
        console.log(newArry);
    </script>
  1. 方法二
  • 注意:方法二用新数组的长度来代替方法一中的j变量;
    <script>
        var arr1 = [2, 0, 1, 22, 121, 454, 3, 35, 435, 45];
        var newArry1 = [];
        for (var i = 0; i < arr.length; i++) {
            if (arr1[i] >= 10) {
                newArry1[newArry1.length] = arr[i];
            }
        }
        console.log(newArry1);
    </script>

操作数组

数组做为对象数据类型,不但有 length 属性可以使用,还提供了许多方法:

  1. push 动态向数组的尾部添加一个单元
  2. unshit 动态向数组头部添加一个单元
  3. pop 删除最后一个单元
  4. shift 删除第一个单元
  5. splice 动态删除任意单元

使用以上4个方法时,都是直接在原数组上进行操作,即成功调任何一个方法,原数组都跟着发生相应的改变。并且在添加或删除单元时 length 并不会发生错乱。

<script>
  // 定义一个数组
  let arr = ['html', 'css', 'javascript']

  // 1. push 动态向数组的尾部添加一个单元
  arr.push('Nodejs')
  console.log(arr)
  arr.push('Vue')

  // 2. unshit 动态向数组头部添加一个单元
  arr.unshift('VS Code')
  console.log(arr)

  // 3. splice 动态删除任意单元
  arr.splice(2, 1) // 从索引值为2的位置开始删除1个单元
  console.log(arr)

  // 4. pop 删除最后一个单元
  arr.pop()
  console.log(arr)

  // 5. shift 删除第一个单元
  arr.shift()
  console.log(arr)
</script>

冒泡排序

  • 是一种算法,把一系列的数据按照一定的顺序进行排列显示(从小到大,或者从大到小),一次比较两个元素,如果顺序错误就把他们交换过来,走访数列的工作是重复进行的,直到没有需要再交换,也就是说该数列已经排序完成。
<body>
  <script>
    let arr = [6, 23, 1, 56, 78, 86]
    for (let i = 0; i < arr.length - 1; i++) {
      for (let j = 0; j < arr.length - i - 1; j++) {
        //开始交换
        if (arr[j] > arr[j + 1]) {
          //交换两个变量
          let temp = arr[j + 1]
          arr[j + 1] = arr[j]
          arr[j] = temp
        }
      }
    }
    console.log(arr);
  </script>
</body>

注意:一共需要的趟数是 arr. length-1,每一趟需要交换的次数是 arr.length -i - 1。i是外侧循环

数组重要方法操作

<script>
    var arr = [1, 2, 3, 4, 5]
    console.log(arr);

    // forEach  遍历
    arr.forEach(function (v, i) {
      // console.log(v);
      // console.log(i);
    })

    //push向数组末尾添加一个或者多个元素,会改变原数组
    arr.push("a", "b", "10")
    console.log(arr);

    //every() 当元素全部满足条件的时候返回true,有一个不满足就会返回false


    var result = arr.every(function (v, i) {
      return v > 5;
    })
    //some()只要有一个满足就返回true
    console.log(result);
    var result1 = arr.some(function (v, i) {
      return v > 5;
    })

    console.log(result1);


    //splice(位置(元素下标),删除的元素个数)   删除  会影响原数组
    arr.splice(2, 2)
    console.log(arr);

    //findIndex返回满足条件的元素,首次出现的位置 ,如果没有就返回-1
    var result2 = arr.findIndex(function (v, i) {
      return v == 5;
    })
    console.log(result2);

    //join() 把数组转换成字符串,不会影响原数组

    console.log(arr.join("-"));

    //filter()   过滤 返回满足条件的元素,构成新数组
    var result3 = arr.filter(function (v, i) {
      return v < 5;
    })

    console.log(result3);

    //map()   映射
    var result4 = arr.map(function (v, i) {
      return v * 4
    })
    console.log(result4);
  </script>

Snipaste_2022-06-18_17-09-11

函数

  • 封装了一段可以重复执行的代码块
  • 实例(求num1~num2的累加和)
    <script>
        //函数
        function getSum(num1, nmu2) {
            var sun = 0;
            for (var i = num1; i <= nmu2; i++) {
                sun += i;
            }
            console.log(sun);
        }

        getSum(1, 100)//调用函数
    </script>

函数分类

具名函数


	funcation fn(){}
	fn()

匿名函数

没有名字的函数,无法直接使用。 使用方式:

  1. 函数表达式 将匿名函数赋值给一个变量,并且通过变量名称进行调用,我们称这个为函数表达式。 语法:
    let fn = function(){
      //函数体
    }	
  1. 立即执行函数 场景介绍:避免全局变量之间的污染 语法:
	//方式一
    (function () { console.log(11); }());
    //方式二
    (function () { console.log(11); })();
    //不需要调用,立即执行
    (function (x, y) { console.log(x + y); })(1, 2);
    

注意:多个立即执行函数需要用分号;隔开

注意: 函数表达式和具名函数不同,如果是具名函数,那它的调用可以用在任何位置(函数体上下都可以) 函数表达式不行,因为let的关系,只能在声明后才可以调用

函数使用

  1. 声明函数
    <script>
        function 函数名() {
            函数体
        }
    </script>
  • funcation是声明函数的关键字,全部小写
  • 函数是做某件事情,函数名一般是动词
  • 函数不调用自己不执行
  1. 调用函数
  • 调用函数时,一定不要忘记添加小括号!
函数名();

函数的参数

  1. 形参
  • 在声明函数的小括号里面是形参(形式上的参数)
  • 形参是用来接受实参的,形参类似于变量(不用声明的变量)
	function 函数名(形参1, 形参2...) {

    }
  1. 实参
  • 在函数调用的小括号里是实参(实际的参数)
	函数名(实参1, 实参2...);

函数形参和实参匹配问题

    <script>
        function getSum(num1, nmu2) {
            console.log(num1 + num2);
        }
        getSum(1, 2); //实参个数和形参个数一致,正常输出结果
        getSum(1, 2, 3); //实参个数多于形参的个数,会取到形参的个数
        getSum(1); //形参可以看作是不用声明的变量, num2是一个变量但是没有接收值 结果就是undefined
    </script>

注意:

  1. 实参多于形参, 多的不参与运算,多的会保存到arguments对象中(数组类型
  2. 实参少于形参,少的就时undefined

retuen语句

  • 函数只是实现某种功能,最终的结果需要返回函数的调用者,通过return实现的
  • retuen 终止函数,retuen后面的代码不会被执行
        function 函数名() {
            return 需要返回的结果;
        }
	function fn() {
            return 20;
        }      
    console.log(fn())

注意:当函数(fn)调用时,相当于调用者 fn( ) = 返回值 console.log( fu( ) )才能拿着到20 函数有返回值时,就返回该值,没有返回值就返回 undefined

arguments使用

  • arguments对象中存储了传递过来的实参。
  • argunmets是伪数组:1.具有数组的length属性,按照索引的方式进行存储。
  • 可以按照数组的方式遍历arguments

作用域

  • javaScript作用域:就是代码名字在某个范围内起作用和效果,是为了提高程序的可靠性,更重要的是减少命名冲突。

作用域(es5)分为两种

  1. 全局作用域:整个script标签,或者是单独的js文件全局有效

  2. 局部作用域(函数作用域):在函数内部就是局部作用域,这个代码的名字就只在函数内部起效果。局部有效

注意: 变量有一个坑 如果函数内部,变量没有声明,直接赋值,也会当全局变量来看,但是强烈不推荐。

变量的作用域

  1. 全局变量:在全局作用下的变量分为用var声明的和不用var声明的(不推荐)
  2. 局部变量:在局部作用域下的变量,后者在函数内部的变量就是局部变量,形参属于局部变量

执行效率

  • 全局变量只有浏览器关闭时才会销毁,比较占用内存资源
  • 局部变量当程序执行完毕就会销毁节约内存资源

块级作用域

  • 现阶段我们js,我们没有块级作用域(2015年已经有了ES6)
  • es6后新增块级作用域

作用域链(就近原则

  • 内部函数访问外部函数的变量,采取的是链式查找的方式来决定值,这种结构我们称为作用域链

变量的访问原则

  • 只要是代码,就至少有一个作用域
  • 写在函数内部的局部作用域
  • 如果函数中还有函数,那么在这个作用域中就可以诞生一个作用域
  • 访问原则:在能够访问到的情况下,先局部,局部没有在找全局

附录

ASCII表

ASCII

ECMAScript6

Footnotes

  1. 附录ASCLL表