Web前端 Javascript笔记3

1、垃圾回收机制

 内存中的生命周期

        1、内存分配

        2、内存使用(读写)

        3、内存回收,使用完毕之后,垃圾回收器完成

        内存泄漏:该回收的,由于某些未知因素,未释放,叫做内存泄漏

栈:数据存在其中会自动释放

堆:对象,根据程序员的操作来决定释放

一、引用计数法   

      1、记录引用次数

      2、计数 ++  或者 --

      3、引用次数为0时,释放内存

原理:跟踪记录每个值被引用的次数。

当垃圾收集器下一次运行时,它就会释放引用次数是0的值所占的内存。

如果一个对象已经没有指向他的引用了,那么就认为不在需要,

循环引用的内存,无法被释放 

let obj1={uname:"lisi"}let a=obj1//存的是内存地址,引用计数为2a=null//--,引用计数为1//缺点:占内存消耗; 循环引用问题,内存无法被释放

看看这个

两个对象被创建,并互相引用,形成了一个循环。

无法计数无法为0,他们的计数均为1,无法释放,

计数算法考虑到它们互相都有至少一次引用,所以它们不会被回收。

let obj2={a:obj3}
let obj3={b:obj2}
obj2 = null

二、标记清除

    垃圾回收器将定期从根开始,找所有从根开始引用的对象,然后找这些对象引用的对象……从根开始,垃圾回收器将找到所有可以获得的对象和收集所有不能获得的对象。

循环引用不再是问题了

在上面的示例中,函数调用返回之后,两个对象从全局对象出发无法获取。因此,他们将会被垃圾回收器回收。


2、闭包

在 JavaScript 中,闭包会随着函数的创建而被同时创建。

内层函数+外层函数的变量 与函数,内层函数使用了外层函数的变量

   function outer() {let i = 10function inner() {console.log(i)}return inner//外部函数调用内部函数实现功能}let a = outer()a()a()    //输出两次10

 外部可以访问函数内部的变量

闭包会在父函数外部,改变父函数内部变量的值。

下面这个函数,他不是改变了全局变量,而是函数可以访问全局变量并且利用表达式与打印,进行函数内部的输出表达,当出了这块函数,全局变量num还是0.

JavasSript 语言的特别之处就在于:函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量。

   let num = 0function test1() {num++console.log(`这是函数调用的第${num}次`)}test1()test1()num = 300test1()

闭包函数 

一个函数的返回值是一个内部函数,并且这个内部函数调用了父级函数的变量。

   <script>function outer() {let num = 0function inner() {num++console.log(`这是函数调用的第${num}次`)}return inner}let a = outer()a()a()a()num = 21a()</script>


3、Math对象

是一个内置对象,它拥有一些数学常数属性和数学函数方法。

来看看常用的数学成员,更多的成员可以上网查。

成员作用
E欧拉常数,也是自然对数的底数,约等于 2.718
PI获取圆周率,结果为3.141592653589793。
abs(x)返回一个数的绝对值。
sqrt(x)获取x的平方根
cbrt(x)返回一个数的立方根。
max(x)返回零到多个数值中最大值。
min(x)返回零到多个数值中最小值。
pow(x,y)返回一个数的 y 次幂。
ceil(x)向上取整。
floor(x)向下取整。
round(x)

返回四舍五入后的整数。

random返回一个 0 到 1 之间的伪随机数。随机数[0,1)
log(x)返回一个数的自然对数(㏒e,即 ㏑)。
log2(x)/log(x)返回一个数以 2或者10 为底数的对数。
sign(x)返回一个数的符号,得知一个数是正数、负数还是 0

获取n~m的随机数

console.log(Math.floor(Math.random()*((n-m)+1))+m)


4、Date对象

创建Date对象,将返回一个字符串,以下是四种创建方法

let d1 = new Date();     //获取当前时间
let d2= new Date(milliseconds); // 参数为毫秒
let d3 = new Date(dateString);
let d4 = new Date(year, month, day, hours, minutes, seconds, milliseconds);

  • milliseconds 参数是一个 Unix 时间戳,它是一个整数值,表示自 1970 年 1 月 1 日 00:00:00 UTC(the Unix epoch)以来的毫秒数。

  • dateString 参数表示日期的字符串值。

  • year, month, day, hours, minutes, seconds, milliseconds 分别表示年、月、日、时、分、秒、毫秒。

 <script>let today=new Date()console.log('today='+today)let d1 = new Date("October 13, 1975 11:13:00")console.log('d1='+d1)let d2=new Date("2022-2-17 23:03:46")console.log('d2='+d2)let d3=new Date(100000000000)console.log('d3='+d3)let d4=new Date(2018,8,19,6,26,21)console.log('d4='+d4)</script>

方法描述
getDate()从 Date 对象返回一个月中的某一天 (1 ~ 31)。
getDay()从 Date 对象返回一周中的某一天 (0 ~ 6)。
getFullYear()从 Date 对象以四位数字返回年份。
getHours()返回 Date 对象的小时 (0 ~ 23)。
getMinutes()返回 Date 对象的分钟 (0 ~ 59)。
getMouth()从 Date 对象返回月份 (0 ~ 11)。
getSeconds()返回 Date 对象的秒数 (0 ~ 59)。

getMilliseconds()

返回 Date 对象的毫秒数 (0 ~ 59)。
getTime()返回 1970 年 1 月 1 日至今的毫秒数(0~999。
parse()返回1970年1月1日午夜到指定日期(字符串)的毫秒数。
setDate()设置 Date 对象中月的某一天 (1 ~ 31)。
setFullYear()设置 Date 对象中的年份(四位数字)。
setHours()设置 Date 对象中的小时 (0 ~ 23)。
setMinutes()设置 Date 对象中的分钟 (0 ~ 59)。
setMouth()设置 Date 对象中月份 (0 ~ 11)。
setSeconds()设置 Date 对象中的秒钟 (0 ~ 59)。
setTime()setTime() 方法以毫秒设置 Date 对象。
setYear()已废弃。请使用 setFullYear() 方法代替。
toDateString()把 Date 对象的日期部分转换为字符串。
toString()把 Date 对象转换为字符串。
toTimeString()把 Date 对象的时间部分转换为字符串。
UTC()根据世界时返回 1970 年 1 月 1 日 到指定日期的毫秒数。

举个例子 

    <script>let date=new Date()console.log(date+'')let y=date.getFullYear()console.log(y+'年')let m=date.getMonth()console.log(m+'月')let day = date.getDate()console.log(day+'号')// 时分秒let hh = date.getHours()let mm = date.getMinutes()let ss = date.getSeconds()console.log(hh+'时')console.log(mm+'分')console.log(ss+'秒')let w = date.getDay()console.log('星期'+w)console.log(date.toString()+' toString()')console.log(date.toTimeString()+' toTimeString()')console.log(date.toDateString()+' toDateString()')</script>


  

5、展开运算符

关于数组内全部元素的输出,除了遍历,还有没有不遍历的方法??

假如有一个数组,你要如何将其中的元素不遍历也可以输出?

let a=[3,2,11]

我想大家一般直接这样:

 let c=a[0]

 let c1=a[1]

 let c2=a[2]

那么问题来了,要是,数组里的元素有上万个呢,虽然有点夸张,但是,它不能被忽视对吧

哈哈,不装了,介绍一下一个运算符,它是三个英文的句号

展开运算符...

不仅是数组,还有字符串也可用

 <script>let a=[3,2,11]//...展开运算符,可以把数组与对象展开document.write(...a+'<br>')//将列表拆开document.write(Math.max(...a))//不可以接数组与对象,可以是一串数字</script>


6、获取元素对象

在 HTML DOM 中, 元素对象代表着一个 HTML 元素。

方法

document.getElementById()

document.getElementsByClassName()

返回文档中所有指定类名的元素集合

document.getElementsByName()

document.getElementsByTagName()

返回指定标签名的所有子元素集合。

 Document.querySelector("选择器")

拿到满足第一个。

querySelectorAll(" ")

拿到伪数组。

<body><p>段落111</p><p>段落222</p><p>段落333</p><p>段落444</p><div>你是一个盒子111</div><div>你是一个盒子222</div><div>你是一个盒子333</div><ul><li>11111111小li</li><li name="k2">2222222小li</li><li class="f3">333333小li</li><li id="d4">4444444小li</li></ul><script>let k2=document.getElementsByName("k2")console.log(k2)let f3=document.getElementsByClassName("f3")console.log(f3)let d4=document.getElementById("d4")console.log(d4)let d=document.getElementsByTagName("div")let p1=document.querySelector("p")console.log(p1)let p2=document.querySelectorAll("p")console.log(p2)for (let i in p2) {console.log(p2[i])}</script>
</body>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/618521.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# Window form 自定义控件的结构和设计(三)

C# Window form 自定义控件的结构和设计(三) 一、前面介绍了如何来创建第一个自定义的控件&#xff0c;以及一个测试程序。下面我们来看下如何在自定义控件中添加属性。 C#和其他.NET语言支持属性作为语言的第一类成员。把属性作为语言的基础属性有两点主要的有点&#xff1a…

PoE 技术

1 PoE 技术产生背景 随着 WLAN 、 VoIP 、网络视频监控等新业务的飞速发展,大量的无线 LAN 访问点、 IP 电话、 IP 网络摄像头等基于 IP 的终端出现在工业现场。这些设备通常数量众多、位置特殊 、 布线复杂、设备取电困难,其实施部署不仅消耗大量人力物力,…

karpathy building make more --- 1

1 Introduction 作为一个机器学习的小白&#xff0c;希望和karpathy 大神的这个课程&#xff0c;掌握机器学习的基础概念和方法。 2 任务 根据一个名字文件&#xff0c;做一个起名字的模型。 3 方案1 用统计的方法来实现&#xff0c;我们希望统计每个词的关联性&#xff0…

使用新一代一站式 AI Bot 开发平台扣子coze,搭建我的第一个AI Bot(前端魔法师) ,

目录 1.概述​ 2.功能与优势 3.使用扣子 4.人设与回复逻辑 5.添加插件 6.预览与调试 7.发布bot Store 8.环境大家体验&#xff08;给大家内置了比较屌的插件&#xff09; 9.推荐阅读&#xff1a; 1.概述​ 扣子是新一代一站式 AI Bot 开发平台。无论你是否有编程基础…

[Spring Cloud] (2)gateway全局异常捕捉统一返回值

文章目录 处理转发失败的情况全局参数同一返回格式操作消息对象AjaxResult返回值状态描述对象AjaxStatus返回值枚举接口层StatusCode 全局异常处理器自定义通用异常定一个自定义异常覆盖默认的异常处理自定义异常处理工具 在上一篇章时我们有了一个简单的gateway网关 [Spring C…

docker 安装 nginx + httpd + php-fpm

原文地址&#xff1a;http://www.taoluyuan.com/index.php/archives/30/#2 展示 1.安装 1.1安装docker 1.2安装nginx 1.3安装apache-httpd 1.4安装php-fpm 2.配置nginx反向代理 httpdphp-fmp 1.安装 1.1安装docker 移除旧的版本&#xff1a; sudo yum remove docker 安装…

启动nginx时报错:signal process started

解决方案&#xff0c;直接使用该命令启动&#xff0c;指向nginx.conf配置文件&#xff1a; nginx -c /www/wdlinux/nginx/conf/nginx.conf 启动成功&#xff1a;

产生死锁的四个必要条件

产生死锁的四个必要条件 互斥使用: 一个资源每次只能被一个线程使用。这意味着如果一个线程已经获取了某个资源&#xff08;比如锁&#xff09;&#xff0c;那么其他线程就必须等待&#xff0c;直到该线程释放资源。 不可抢占: 已经获得资源的线程在释放资源之前&#xff0c;不…

[尚硅谷flink] 检查点笔记

在Flink中&#xff0c;有一套完整的容错机制来保证故障后的恢复&#xff0c;其中最重要的就是检查点。 文章目录 11.1 检查点11.1.1 检查点的保存1&#xff09;周期性的触发保存2&#xff09;保存的时间点3&#xff09;保存的具体流程 11.1.2 从检查点恢复状态11.1.3 检查点算法…

如何在Windows安装LocalSend并结合内网穿透实现公网跨平台远程文件互传

文章目录 1. 在Windows上安装LocalSend2. 安装Cpolar内网穿透3. 公网访问LocalSend4. 固定LocalSend公网地址 本篇文章介绍在Windows中部署开源免费文件传输工具——LocalSend&#xff0c;并且结合cpolar内网穿透实现公网远程下载传输文件。 localsend是一款基于局域网的文件传…

【菜狗学前端】原生Ajax笔记(包含原生ajax的get/post传参方式、返回数据等)

这回图片少&#xff0c;给手动替换了~祝看得愉快&#xff0c;学的顺畅&#xff01;哈哈 一 原生ajax经典四步 (一) 原生ajax经典四步 第一步&#xff1a;创建网络请求的AJAX对象&#xff08;使用XMLHttpRequest&#xff09; JavaScript let xhr new XMLHttpRequest() 第二…

【C语言】简易版扫雷+进阶版扫雷

目录 前言 一、分模块化 二、准备雷盘 2.1 游戏菜单 2.2 创建雷盘思路 2.3 构建雷盘 2.4 雷盘展示 2.4.1 初始化雷盘 2.4.2 打印雷盘 三、排雷 3.1 布置雷 3.2 排查雷 四、进阶版扫雷 总结 前言 C语言实现扫雷小游戏&#xff0c;帮我们更进一步的掌握数组、模块化…