目录
3、用动object.defineProperty()对象态添加 get,set
一、js代码位置
-
放在script标签之间
-
引入js脚本
-
注意,到了框架之后,引入方式会有不同
-
二、变量与数据类型
1、声明变量
-
let ⭐
-
let 声明的变量可以被多次赋值
-
-
const ⭐
-
const 修饰的叫常量,只能赋值一次
-
const 并不意味着它引用的内容不可修改,例如
-
-
var
var声明的变量可以被多次赋值,例如
2、基本类型(7种基本类型)
1、undefined和null
-
执行表达式或函数,没有返回结果,出现undefined
-
访问数组不存在的元素,访问对象不存在的属性,出现undefined
-
定义变量,没有初始化,出现undefined
二者共同点
-
都没有属性、方法
-
Nullish(undefined和null共同的称呼)
二者区别
-
undefined 由 js 产生
-
null 有程序员提供
-
2、String ⭐
html 代码如下,用java和js种的字符串如何表示?
java
js
-
模板字符串(Template strings)
需求:拼接URI的请求参数,如
传统方法拼接:可读性低
模板字符串方式:可读性高
3、number和bigint ⭐
-
number 类型表示的是双精度浮动小数,例如
既然是浮点小数,那么可以除零
浮点小数都有运算精度问题,例如
-
字符串转数字
-
需要表示真正的整数,需要用 bigint,数字的结尾用 n 表示它是一个 bigint 类型
4、boolean ⭐
-
Truthy
-
Falsy
在js种,并不是 boolean 才能用于条件判断,你可以在if语句种使用【数字】、【字符串】...自拍为判断条件
这时就有一个规则,当需要条件判断时,这个值被当作 true 还是 false,当作 true 的值归类为 truthy,当作 false的值归类为 falsy
-
falsy
-
false
-
Nullish(null,undefined)
-
0 或 0n 或 NaN(0和 非数字)
-
"" 或 '' 或 `` (长度为零的空字符串)
-
5、symbol
3、对象类型
1、Function ⭐⭐
定义
例子
调用函数
函数名(实参);
例子
1、默认参数
java中(spring)要实现默认参数的效果
js
2、匿名函数
语法
例
第一种场景:定义完毕后立刻调用
第二种场景:作为其它对象的方法,例如
页面有元素
此元素有一个onclick方法,会在鼠标单击这个元素后被执行,onclick方法刚开始是null,需要赋值后才能使用
3、箭头函数
(参数) => { // 函数体 return 结果; }
-
如果没有参数,()还是要保留
-
如果只有一个参数,()可以省略
-
如果函数体内只有一行代码,{}可以省略
-
如果函数体内的一行代码是返回代码,那么return也可以省略
例:
4、函数是对象
以下形式在 js 中非常常见!
-
可以参与赋值,例,具名函数也能参与赋值
-
有属性、有方法
-
其中带有 f 标记的是方法,不带的是属性
-
带有➡符号的可以继续展开,限于篇幅省略了
-
带有 [[ ]] 的是内置属性,不能访问,只能查看
-
相对重要的是 [[Prototype]] 和 [[Scopes]] 会在后面继承和作用域时讲到
-
-
可以作为方法参数
-
可以作为方法返回值
5、函数作用域
函数可以嵌套( js 代码中很常见,只是嵌套的形式更多是匿名函数,箭头函数)
看下面的例子
-
以函数为分界线划定作用域,所有函数之外是全局作用域
-
查找变量时,由内向外查找
-
在内层作用域找到变量,就会停止查找,不会再找外层
-
所用作用域都找不到变量,报错
-
-
作用域本质上时函数对象的属性,可以通过 console.dir 来查看调式
6、闭包
-
函数定义时,他的作用域已经确定好了,因此无论函数将来去了哪,都能从它的作用域中找到当时哪些变量
-
别被概念忽悠了,闭包就是指函数能够访问自己的作用域中变量
7、let、var与作用域
-
如果函数外层引用的是let变量,那么外层普通的{}也会作为作用域边界,最外层的let 也占一个 script 作用域
-
如果函数外层引用的是 var 变量,外层普通的 {} 不会被视为边界
-
如果 var 变量出现了重名,则他俩会被视为同一作用域中的同一个变量
-
如果是let,则视为两个作用域中的两个变量
-
要想里面的 e 和外面的 e 能区分开来,最简单的办法时改成let,或者用函数来界定作用域范围
2、Array ⭐
语法
API
1、push、shift、unshift、splice
2、join
3、map、filter、forEach
map 例子
-
传给 map 的函数,参数代表旧元素,返回值代表新元素,map的内部实现(伪代码)
filter 例子
-
传给 filter 的函数,参数代表旧元素,返回值 true 表示要留下的元素
forEach例子
-
高阶函数:map,filter,forEach
-
回调函数: 例如作为参数传入的函数
4、split
字符串转数组
5、升序,降序,洗牌
注意:num是一个非空数字数组
-
升序:num.sort((a,b) => a-b)
-
降序:num.sort((a,b) => b-a)
-
洗牌:num.sort(() => Math.random() > .5 ? a : b)
6、.find()
根据元素查找元素
7、去重
8、数组和 (解构)
9、差集、交集、并集
3、Object ⭐⭐
-
属性
-
方法
-
get、set
1、语法
例1 写法1
例2 写法2
例3 (例1的简写方式 重点)⭐
-
注意:对象方法这么写,仅限于对象内部
例4
调用 get,set
2、特殊:属性增删
对比以下 Java 中的 Object
-
Java 的 Object 是以类作为模板来创建,对象不能脱离类模板的范围,一个对象的属性,能用的方法都是确定好的
-
js 的对象,不需要什么模板,它的属性和方法可以随时加减
3、用动object.defineProperty()对象态添加 get,set
4、特殊:this (this的三种情况,一种特例)
先来对 Java 中的 this 有个理解
js 中的 this 也是隐式参数,但是它与函数运行时上下文相关
①、一个”落单“的函数
这是因为此时函数执行,全局对象 window 被当作了 this, window 对象的 name 属性是空串
②、同样的函数,如果作为对象的方法
这种情况下,会将当前对象作为 this
③、.call 还可以动态改变this
这回 study 执行时,就把 call 的第一个参数 stu 作为 this
例外:在箭头函数内出现的 this,以外层 this 理解
用匿名函数
-
this.name 所在的函数时【落单】的函数,因此 this 代表 window
输出结果为
用箭头函数
-
this.name 所在的函数是箭头函数,因此 this 要看它外层的 play 函数, play 又是属于 stu 的方法,因此 this 代表 stu 对象
输出结果为
不用箭头函数的做法
5、特殊:原型继承(对象之间)
-
father 是父对象,son 去调用 .m1 或 .f1 时,自身对象没有,就到父对象找
-
son 自己可以添加自己的属性和方法
-
son 里有特殊属性
__proto__
代表它的父对象,js 术语:son 的原型对象 -
不同浏览器对打印 son 的
__proto__
属性时显示不同-
Edge 打印 console.dir(son) 显示
[[prototype]]
-
Firefox 打印 console.dir(son) 显示
<protorype>
-
6、特色:基于函数的原型继承
出于方便的原因,js 又提供了一种基于函数的原型继承
配合 new 关键字,创建子对象
子对象的__proto__
就是函数的 prototype
属性
4、JSON
之前我们将 http 请求格式时,讲过 json 这种数据格式,他的语法看起来与 js 对象非常相似,例如:
一个 json 对象可以张这样:
一个 js 对象长这样
1、 json对象 与 js对象 的区别在哪儿呢???
2、json 字符串与js对象的转换
3、JSON语法
5、动态类型
静态类型语言,如 Java,值有类型,变量也有类型、赋值给变量时,类型要相符
而 js 属于动态类型语言,值有类型,但变量没有类型,赋值给变量时,没要求
例如
动态类型看起来比较灵活,但变量没有类型,会给后期维护带来困难,例如
三、运算符与表达式 ⭐
1、 ===
(严格相等)
严格相等运算符,用作逻辑判等。
补充:typeod 查看某个值的类型
2、||
(逻辑或)
需求,如果参数 n 没有传递,给它一个 【男】
推荐做法
你可能的做法
还可能时这样
一些老旧代码中可能的做法(不推荐,有潜在问题)
它的语法时
值1 || 值2
如果值1 时 Truthy,返回值1,如果值1 时 Falsy 返回值2
3、?? 与 ?.
?.
可选链操作符用于访问可能为空或未定义的属性或方法,它允许我们安全地访问嵌套对象的属性
??
空值合并操作符用于检查一个变量是否为 null 或 undefined,如果是,则返回一个默认值,否则返回该变量的值。与传统的逻辑运算符 ||
不同,??
只会在左侧的值为 null 或 undefined 时返回右侧的默认值,对于其他假值(如空字符串、0、false 等)并不会返回默认值,而是会返回它本身。
需求,如果参数 n 没有传递值或是 null,给它一个【男】
如果用传统办法
用 ??
需求,函数参数是一个对象,可能包含有子属性
例如,参数可能是
现在要访问子属性
现在希望当某个属性是 nullish 时,短路并返回 undefined
用传统办法
4、...
展开运运算符
作用1:打散数组传递给多个参数
-
传统的打散写法
-
展开运算符写法
-
打散可以理解为【去掉了】数组外侧的中括号,只剩下数组元素
-
作用2:复制数组或对象
数组
对象
注意:展开运算符复制属于浅拷贝(只能复制一层,多层的话就是引用了),例如
作用3:合并数组或对象
合并数组
合并对象
5、[]{}
解构赋值
[]
用在声明变量是
用在声明参数时
{}
用在声明变量时
用在声明参数时
四、控制语句
1、for in
主要用来遍历对象
-
其中 const n 代表遍历出来的属性名
-
注意1:方法名也能被遍历出来(它其实也算一种特殊属性)
-
注意2:遍历子对象时,父对象的属性会跟着遍历出来
-
注意3:在 for in 内获取属性值,要使用 [] 语法,而不能用 . 语法
2、for of
主要用来遍历数组,也可以时其它可迭代对象,如Map,Set等
3、try catch
五、Fetch API
Fetch API 可以用来获取远程数据,他有两种方式接受结果,同步方式与异步方式
格式
同步方式
-
await 关键字必须在一个标记了 async 的 function 内来使用
-
后续代码不会在结果返回前执行
异步方式
fetch(url,options).then(结果 => {...}) // 后续代码
-
后续代码不必等待结果返回就可以执行