「掘金日新计划 · 8 月更文挑战」的第2天——这样,轻松学习JavaScript 上

100 阅读13分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

image.png

前言:

距离下班还有半小时,说实话真的很困,熬夜不好,不能熬夜了,但是每次这么说,每次还是会熬夜的,第二天就困困困,好啦,说正事吧,前阵子把前端三兄弟HTML和CSS整理完了,却忘记把最主要的JavaScript整理好。今天正好把它整理好,如有不足之处,望指正。

一、JavaScript简介

1.什么是JavaScript

JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。虽然它是作为开发Web页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式、声明式、函数式编程范式。 [1] 【百度百科】

2.JavaScript的背景

JavaScript在1995年由Netscape公司的Brendan Eich,在网景导航者浏览器上首次设计实现而成。因为Netscape与Sun合作,Netscape管理层希望它外观看起来像Java,因此取名为JavaScript。但实际上它的语法风格与Self及Scheme较为接近。 [2] 【百度百科】

JavaScript的标准是ECMAScript 。截至 2012 年,所有浏览器都完整的支持ECMAScript 5.1,旧版本的浏览器至少支持ECMAScript 3 标准。2015年6月17日,ECMA国际组织发布了ECMAScript的第六版,该版本正式名称为 ECMAScript 2015,但通常被称为ECMAScript 6 或者ES2015【百度百科】

3.JavaScript的组成

  • ECMAScript
  • DOM
  • BOM

4.JavaScript的引用

1)内部引用

<script> 标签内

2)外部引用

通过script 标签的src 属性引入js文件

注意:不要同时使用内部引用和外部引用

二、JavaScript中的基本语法及术语

  1. JavaScript中的基本语法

1)语句:

  • 值、运算符、表达式、关键词和注释
  • 语句会按照它们被编写的顺序逐一执行
  • 以分号结束语句不是必需的,是代码⻛格问题字面量

2)字面量

  • 一般固定的值称为字面量比如: 3.14 、nick
  • {} 对象字面量
  • [] 数组字字面量
  • function test() {} 函数字面量变量

3)变量

  • 使用var 定义变量
  • 变量声明是弱类型的,可以随时更改
  • 变量可以通过变量名访问,字面量是一个恒定的值运算符

4)运算符

  • 赋值,算术和位运算符
  • 条件,比较及逻辑运算符
  • 在运算符旁边( = + - * / )添加空格是个好习惯: 关键字

5)关键字

  • 用于标识要执行的操作
  • 比如var 是告诉浏览器创建一个变量保留字

6)保留字

  • 以后可能会实现的关键字
  • 可以不记,编辑器会变色关键字

2. 面向对象的概念

1).什么是面向对象

维基百科: 面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是种具有对象概念的程序编程典范,同时也是一种程序开发的抽象方针。它可能包含数据、属性、代码与方法。对象则指的是类的实例!!!它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据。在面向对象程序编程里,计算机程序会被设计成彼此相关的对象

可能上面说的太过专业化,一开始我也没咋搞懂,知道别人告诉我一个生活中的例子,我才能对应起来,我把这个分享给你们

比如说我现在特别想吃酸菜鱼

  • 面向过程(就是指代一个过程)

1.买材料,鱼 酸菜...
2.洗菜,洗🐟
3.烧鱼
4.吃鱼

  • 面向对象(有一个对象)

1.找到酸菜鱼店面
2.点🐟
3.吃鱼

总之:js里面万物皆对象

创建对象

var Person = new Object()

对象里面有属性,有方法

三、JavaScript中变量

1.js中的变量的类型

1).原始类型

原始类型保存在栈内存里  7种原始类型

原始类型含义
Boolean非真即假
Null指的是你声明了一个对象未设置值——可以理解尚未创建的对象
Undefined声明了变量,但是没有赋值
Number超过一定的范围,会丢失精度
String在js里 字符串使用单引号或者双引号围住的
Symboles6提出的概念
BigInt

2).引用类型

引用类型含义
Object万物皆对象

3).原始类型和引用类型区别

  • 原始类型 值是保存在栈内存,按值保存
  • 引用类型 栈内存里保存的指针, 堆内存里保存的是值

2.变量的声明规范

1).变量声明和变量赋值

  • 单一声明
  • 多个声明

2).声明规范

(1). 必须是以字⺟、下划线 ( _ ) 或者美元符号 ( $ )
(2). 开头变量是对大小写敏感的
(3). 关键字和保留字不能用

3).建议

1.定一个语义化变量名
2.小驼峰命名变量 myHeader
3.构造函数是用每个单词都是大写的 Person
4.建议不要用拼音

3.变量运算

1).运算优先级高于赋值
2).同类型的运算——直接值进行
3).运算不同类型的运算——类型转换,值进行运算

4.常⻅的运算符

一类数学符号,可以根据两个值(或变量)产生结果

1).算数运算符

+
-
*
/
%
可以和等号组合(复合赋值运算符) a += 2 => a = a + 2

2).关系运算符
1.大小比较   2.等值比较

3).自增自减
1.++  2--

5.js当中的真真假假

  • 真——满足条件就是真,变量可转为布尔值true
  • 假——不满足条件就是假变量可转为布尔值false

1)真与假的运算

  • 与  &&\
  • 或  ||\
  • 非  !

2)6个假变量

1.false (布尔型)
2.null (用于定义空的或者不存在的引用)
3.undefined (未定义值)
4.0 (数字类型)
5. "" '' (空字符串) (字符型)
6. NaN(not a Number)

四、JavaScript中的流程控制语句

1.js基础语法之如何进行判断

1)语法

    条件可以是表达式或者变量
   // 语句1
} else {
   // 语句2
}
  1. == 和 ===的区别
  • == 会先判断数据类型一不一致,不一致的话就会转换数据类型\
  • ===直接进行值判断

注意:
判断条件是否互斥
else if 有个好处,是满足了条件后,直接停止了
保证有个else,避免出现异常

2.使用三元运算改造判断

1)语法

条件 ? 表达式1 : 表达式2\
// 条件为true时,执行表达式1,否则执行表达式2

2)使用场景 非真即假的场景 3)注意 自带return

a > 0 ? str = 'ss' : str = 'sss'

4)条件链

str = a > 0 ? (a > 3 ? '大于3' : '小于等于3') : '小于等于0'

3.js中的switch语句

1)语法

switch(表达式) {
    case n:
    代码块
    break;              
    case n:
    代码块
    break;
    default:
   默认代码块
}

2)和if 的选择
有3,4种以上条件的时候,就可以考虑使用switch

注意:内部严格按照=== 的规则,一定要值和类型相等才行使用break语句打断程序

4.for循环

1)语法

for (语句 1; 语句 2; 语句 3) {
要重复的代码块
}
// 语句1 声明一个变量
// 语句2 指定循环跳出条件
// 语句3 控制变量的变化

注意:
语句1,2,3都不是必需的
语句2不写的话,必须在代码块里使用break中断循环

5.while循环

1)语法

while (条件) {
代码块
}


do {
代码块
}while (条件);

注意:
别忘了改变条件中的变量,不然就写了个死循环
do while 始终比while 多一次循环 !!!

五、JavaScript重点——函数

1.函数及函数的组成

1)语法

function name(参数 1, 参数 2, 参数 3) {
要执行的代码
}

//实例
function sum(a, b) {
// return undefined return a * 10 + b
}

注:return 只能在函数里使用

2.形参和实参

  • 形参——声明函数的时候定义的一个参数
  • 实参——调用函数的时候传的一个参数

注:
形参和实参是一一对应的
数量可以不对应
函数可以设置默认参数
定义形参的时候需要语义化
实参可以是字面量也可以是变量

3.声明的方法

1)声明方式

//1函数声明
function name(参数) {
// 执行语句
}
// Date
// Array

//2.(匿名)函数表达式
//3.new Function()

注:
声明函数过程中,函数里的语句是不会执行
只有当调用函数的时候,函数里的语句才会执行

4.返回值

1)函数的作用
在恰当的时机里, 执行一段代码将值处理后,返回回来

2)return的作用
1.返回值 
2.中断函数
3.只能写在函数体里面

5.变量作用域

1)变量

  • 全局变量——挂载到window 对象上的
  • 局部变量——函数体内部声明的变量

2)作用域链
内层函数是可以访问外层函数声明的一个变量

6.js中函数隐藏的参数

arguments

作用: 1)取参数

传入的实参都能在函数体里通过arguments类数组取到 image.png

如果下面多取了参数硬加在里面,使用arguments来取参数但是要在return之前,因为return会中断执行 image.png

2)具有数组的一些特点

1.通过索引取参  2.有长度 image.png

7.递归

含义——函数自己调用自己
注意:要有终止递归的条件,不然就变成死循环了

8.立即执行函数

1)含义
相当于一个一次性的函数

2)实例

以() [] 开头的语句,前面的语句必须加分号,否则会解析错误 image.png

3)两种写法

(1)把整个自调用函数用括号括起来了

image.png (2)函数声明变成表达式的方法  只要将函数声明变成表达式就可以执行

image.png

4)特点

1.自动执行
2.执行完成以后销毁

5)证明销毁 可以传参数

六、JavaScript中的闭包

1).一个例子引入闭包

声明的var count是一个全局变量,在函数体外面声明的话它是可以在外部直接修改的 1.全局变量 image.png

在调用函数的时候虽然声明了一个变量,但是每次调用这个函数,就会初始化这个变量,也就是不断的初始化不断地加12.局部变量

image.png

需求——在函数的外界访问到函数的内部的一个变量(可以通过一个函数(这个函数又被成为闭包))

2).函数上下文

(1)上下文

  • 全局上下文——它有个全局对象windows,windows指的就是一个浏览器,无论是声明一个变量,还是一个函数,统统挂在的都是windows对象里面

  • 函数上下文——全局对象里面声明了一些变量

(2)函数上下文产生、销毁

  • 产生——函数执行的时候会形成自己的上下文(环境,对象)
  • 销毁——函数执行结束的时候就结束

(3)总结 函数在执行的那一瞬间再调用内部的函数会产生函数上下文

image.png image.png 3)闭包

(1).为什么需要是闭包

  • JavaScript 变量属于本地或全局作用域
  • 全局变量能够通过闭包实现局部(私有),只有调用函数才能改变变量

(2).产生闭包

通过调用函数时返回其内部的函数

(3)闭包的副作用

产生内存泄漏

(4)通过闭包能实现什么

实现外界访问函数体内部的变量

(5)一句话总结闭包

有权访问另一个函数作用域中的变量的函数

image.png 函数体内部的变量时只能通过内部的函数(闭包)去访问,不仅可以访问还可以对它进行操作,将inner这个函数return回去,(因为inner课可以访问count所以可以将它抛出去)用一个add变量接住并且调用函数test,(这个时候就产生了一个函数上下文,这个函数上下文就绑定在这个内部的函数函数上面了,因为它已经return出去了,产生出一个实体,被add接住了),调用这个add

七、JS中对象

1.对象

除了原始值,其他都是对象

原始值:Undefined、Null、Boolean、Number、 Symbol、BigInt 和String  Null不是一个对象,是代表对象还未创建的变量

2.可以使用typeof 判断原始类型

栈内存里面保存的是对象的地址,这个地址指向的就是这个对象,原始类型的这个值就保存在栈里面

image.png

3.语法

image.png

4.js对象中的一些常⻅操作

  • 查 1.通过. 运算符可以访问对象属性
    2.或者[] 操作符访问, [] 里面可以写变量,也可以写字符串

image.png

遍历信息

image.png

  • 增 通过创建属性

image.png

  • 改 直接在属性上面改

  • 删 通过delete 运算符

5.对象中的方法怎么访问自己的属性

1).通过对象.

image.png 2).通过this 访问对象自己

image.png 3).对象里面的属性是用,隔开的this在哪里输出,就指代那个对象

image.png

6.js中创建对象的几种方式

1).对象字面量 声明一个对象,赋值给一个变量

image.png

2).构造函数 1.Object

2.自定义构造函数(大驼峰) this指向的是对象的本身 使用new 实例化一个对象,就像工厂一样 3.构造函数的参数 固定参数——不知道创建对象实例的时候,传入的参数是什么位置也要严格对应 image.png

不定参数 image.png

3).js底层剖析之new

  • 创建了一个空的对象
  • 帮助我们把对象返回回来
  • 改变了this的指向,指向了空对象

image.png New 创建了一个空对象,改变了this的指向,指向空对象,然后把对象返回回来

八、js-原型全面剖析

1.原型prototype的基本概念

function Person() {} 
console.log(Person.prototype)

image.png

是Person的一个属性,也是一个对象,这个对象又有一个属性constructor,这个属性又指向person

2.原型的作用

image.png

如果直接输出person,是看不见的输出创建对象的country属性是能看见的,这个就是原型的作用

image.png Prototype能够设置实例化出来的对象的属性,能够透过构造函数的prototype属性能够设置创建出来的属性

1)给构造出的对象设置公共的属性或方法

image.png Prototype作为一个隐藏属性保存到实例化对象里面

image.png 输出为undefined,传入的对象是obj,new传入对象是空对象,没有name这个属性。构造函数的内部属性会覆盖掉原型上

2)建立了构造函数和实例化出来对象的联系(通过new创造出来的)

3)构造函数和原型都能写方法)选择问题:

  • 凡是方法写在原型上 (方法为什么不写在构造函数——写在构造函数里的方法和属性会重新克隆一次,会导致占用内存较高)
  • 需要配置的属性是写在构造函数上实例化对象的时候
  • 实例化对象不能对原型上的属性进行改动

总结:只有构造函数才能对原型上的属性进行改动 原型(说实质的话)就是构造函数的属性