关于JS
-
JavaScript是一门解释型语言,所谓解释型值语言是指不需要被编译为机器码在执行,而是直接执行。
-
JavaScript是一门动态语言,所谓的动态语言可以暂时理解为在语言中的一切内容都是不确定的。比如一个变量,现在个整型,下一时刻可能会变成字符串了。
-
类似于 C 和 Java 的语法结构
JavaScript的语法结构与C和Java很像,向for、if、while等语句和Java的基本上是一模一样的。 -
Java也是一门面向对象的语言,但是JavaScript是基于原型的面向对象
-
严格区分大小写
数据类型
1.原始值
-
Number
- 大–>近似值 infinity无穷
- 非法数值NaN
- typeof->“number”
-
BigInt 大整数
- 大整数用来表示一些比较大的整数
- 大整数使用n结尾,它可以表示的数字范围是无限大
typeof ->“bigint”
-
字符串
- 模板字符串
- typeof->“string”
-
布尔值
- typeof->“boolean”
-
空值
- typeof->“object”
-
未定义Undefined
- typeof->“undefined”
-
Symbol(唯一符号)
- typeof->“symbol”
2.对象
对于上述基本类型 有对应的包装类
但他们进行类型转化的时候
他们就会临时转化为对应的包装类
从而可以调用其中的方法
对于页面来说 一切都是对象
最大的对象是object
在页面里 window代表整个视口
而document表示整个页面 通过dom(文档对象模型)可以实现动态修改页面 让页面有行为
实现方式:
1.对象字面量
let 对象名={
属性名:属性值,
[属性名]:属性值,
对象名:{},
}
2.类实例
class 类名 {}
const 类名 = class {}
let 对象名=new 类名
对于new的理解:
当使用new去调用一个函数时,这个函数将会作为构造函数调用
使用new调用函数时,将会发生这些事:
创建一个普通的JS对象(Object对象 {}), 为了方便,称其为新对象
新对象的隐式原型=构造函数的显示原型
使用实参来执行构造函数,并且将新对象设置为函数中的this
如果构造函数返回的是一个非原始值,则该值会作为new运算的返回值返回(千万不要这么做) 如果构造函数的返回值是一个原始值或者没有指定返回值,则新的对象将会作为返回值返回 通常不会为构造函数指定返回值
OOP
JS的ocp思想
同其他语言
js也是有三大特性 封装 继承 多态
- ocp开闭原则
- 程序应该对修改关闭,对扩展开放
- 子类可以重写父类的同名方法
- 子类重写构造函数,需要在里面super(…)调用下父类的构造器
对象的结构
-
对象自身
- 直接通过对象所添加的属性,位于对象自身中
- 在类中通过 x = y 的形式添加的属性,位于对象自身中
-
原型(prototype)
-
在对象中会有一个属性用来存储原型对象,这个属性叫做proto(隐式原型)
-
原型对象也负责为对象存储属性,当我们访问对象中的属性时,会优先访问对象自身的属性,对象自身不包含该属性时,才会去原型对象中寻找
-
会添加到原型对象中的情况:
- 在类中通过xxx(){}方式添加的方法,位于原型中
- 主动向原型中添加的属性或方法
-
对于原型的理解:
继承关系链===原型链
所有的同类型对象它们的原型对象都是同一个,也就意味着,同类型对象的原型链是一样的
原型就相当于是一个公共的区域,可以被所有该类实例访问,可以将该类实例中,所有的公共属性(方法)统一存储到原型中 (这样我们只需要创建一个属性,即可被所有实例访问)
关于浅拷贝和深拷贝:
区别:浅拷贝基本类型之前互不影响,
引用类型其中一个对象改了地址,
就会影响另一个对象。
深拷贝改变新对象不会影响原对象,
他们之前互不影响.
浅拷贝就是复制一层,深拷贝是所有层或多层
const arr3 = structuredClone(arr) // 专门用来深拷贝的方法
const obj2 = JSON.parse(JSON.stringify(obj)) //能使用JSON实现深复制
内建对象
1 .map
存储键值对的数据
(a,b) 其中 a b 可为任何类型
创建:const map=new Map()
方法:
map.size() //获取map中键值对的数量
map.set(key, value) //向map中添加键值对
map.get(key) //根据key获取值
map.delete(key) //删除指定数据
map.has(key) //检查map中是否包含指定键
map.clear() //删除全部的键值对
map.keys() //获取map的所有的key
map.values() //获取map的所有的value
map.forEach((key,value)=>{...}) //遍历map
Array.from(map)
[...map] //将map转换为数组
const m=new Map();
m.set(NaN,0);
m.set(undefined,-1);
m.set("name","小米");
let keys=m.keys();
console.log(keys);
let values=m.values();
console.log(values);
let array=Array.from(m);
console.log(array)
//遍历
for(const entry of m){
console.log(entry);
}
//解构遍历
for(const[key,value]of m){
console.log(key,value);
}
m.forEach((key,value)=>{
console.log(key,value);
})
- set
相当于去重后的数组
实现:
new Set()
new Set(iterable)//iterable可迭代对象
方法
方法:
size()//获取数量
add()//添加元素
has()//检查元素
delete()//删除元素
[...set]//转换为数组
- math
一个数学工具类
方法:
Math.abs() //求一个数的绝对值
Math.min() //求多个值中的最小值
Math.max() //求多个值中的最大值
Math.pow() //求x的y次幂
Math.sqrt() //求一个数的平方根
Math.floor() //向下取整
Math.ceil() //向上取整
Math.round() //四舍五入取整
Math.trunc() //直接去除小数位
Math.random() //生成一个0-1之间的随机数
- date
创建:new Date()
直接通过new Date()创建时间对象时,它创建的是当前的时间的对象
可以在构造函数中传递一个表示时间的字符串
字符串的格式:月/日/年 时:分:秒 ,年-月-日T时:分:秒
方法
getFullYear() //获取4位年份
getMonth() //返当前日期的月份(0-11)
getDate() //返回当前是几日
getDay() //返回当前日期是周几(0-6) 0表示周日
getTime() //返回当前日期对象的时间戳
/*时间戳:自1970年1月1日0时0分0秒到当前时间所经历的毫秒数,
计算机底层存储时间时,使用都是时间戳*/
Date.now() //获取当前的时间戳
正则表达式
很多的语言都有正则表达式 可以理解为一个正确的规则 计算机可以提取和识别
提取出来
正则表达式也是JS中的一个对象,所以要使用正则表达式,需要先创建正则表达式的对象
创建方式
new RegExp()
可以接收两个参数(字符串) 1.正则表达式 2.匹配模式(i/g 忽略大小写 全局便利)
可以传参数,动态生成正则表达式
使用转义字符
let reg = new RegExp(“\w”, “i”)
使用字面量来创建正则表达式:/正则/匹配模式
let reg = /a/i
正则表达式.test(#字符串)检查字符串是否符合,返回ture/false
正则表达式.exec(#字符串) 获取字符串中符合正则表达式的内容,返回数组(可以通过在正则表达式里加括号的方式进行分组)
不开全局模式此方法只会匹配第一个
开了之后调一次匹配一个,下次调用从上次匹配的结尾开始
let str = "abcaecafcacc"
// 提取出str中符合axc格式的内容
let re = /a(([a-z])c)/ig
let result = re.exec(str)
console.log(result)
while(result){
console.log(result[0], result[1], result[2])
result = re.exec(str)
}
垃圾回收
如果一个对象没有任何的变量对其进行引用,那么这个对象就是一个垃圾
垃圾对象的存在,会严重的影响程序的性能
在JS中有自动的垃圾回收机制,这些垃圾对象会被解释器自动回收,我们无需手动处理
对于垃圾回收来说,我们唯一能做的事情就是将不再使用的变量设置为null