Web前端 Javascript笔记3

news2024/12/23 14:37:49

1、垃圾回收机制

 内存中的生命周期

        1、内存分配

        2、内存使用(读写)

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

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

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

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

一、引用计数法   

      1、记录引用次数

      2、计数 ++  或者 --

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

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

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

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

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

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

看看这个

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

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

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

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

二、标记清除

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

循环引用不再是问题了

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


2、闭包

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

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

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

        }
        let a = outer()
        a()
        a()    //输出两次10

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

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

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

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

   let num = 0
        function test1() {

            num++
            console.log(`这是函数调用的第${num}次`)
        }

        test1()
        test1()
        num = 300
        test1()

闭包函数 

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

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

            }
            return inner
        }

        let a = outer()
        a()
        a()
        a()
        num = 21
        a()
  </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.coloradmin.cn/o/1595194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【系统分析师】需求工程☆

文章目录 0、需求工程概述1、需求的分类2、需求获取3、需求分析3.1 结构化需求分析-SA3.1.1DFD- 数据流图3.1.2 STD-状态转换图3.1.3 ER图-实体联系图 3.2 面向对象需求分析-OOA3.2.1 工具-UML图3.2.2 UML分类3.2.3 用例图 ☆3.2.4 类图 / 对象图 ☆3.2.5 顺序图3.2.6 活动图3.…

prompt 工程整理(未完、持续更新)

工作期间会将阅读的论文、一些个人的理解整理到个人的文档中&#xff0c;久而久之就积累了不少“个人”能够看懂的脉络和提纲&#xff0c;于是近几日准备将这部分略显杂乱的内容重新进行梳理。论文部分以我个人的理解对其做了一些分类&#xff0c;并附上一些简短的理解&#xf…

平面上最近点对

OJ:P1429 平面最近点对&#xff08;加强版&#xff09; - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 非常详细的博客&#xff1a;平面上最近点对 - 洛谷专栏 (luogu.com.cn) 更正式的文章&#xff1a;平面最近点对 - OI Wiki 这也是我们算法课的一个实验。不过我做的不好…

Eigen库从入门到放弃(2. Getting Started)

Eigen的头文件定义了多种类型&#xff0c;但是对于简单的来说&#xff0c;使用MatrixXd就足够了&#xff0c;MatrixXd表示任意尺寸的矩阵&#xff0c;但是要注意数据类型是double的。Eigen/Dense的头文件定义了所有MatrixXd和相关类型的成员函数。所有头文件中定义的函数都是在…

康耐视visionpro-CogFindCircleTool操作工具详细说明

◆CogFindCircleTool]功能说明: 通过用多个卡尺找到多个点来拟合所要找的圆 ◆CogFindCircleTool操作说明: ①.打开工具栏,双击或点击鼠标拖拽添加CogFindCircleTool工具 ②.添加输入图像,右键“链接到”或以连线拖拽的方式选择相应输入源 ③预期的圆弧:设置预期圆弧的…

python-numpy(3)-线性代数

一、方程求解 参考资料 对于Ax b 这种方程&#xff1a; np.linalg.inv(A).dot(B)np.linalg.solve(A,b) 1.1 求解多元一次方程一个直观的例子 # AXB # X A^(-1)*B A np.array([[7, 3, 0, 1], [0, 1, 0, -1], [1, 0, 6, -3], [1, 1, -1, -1]]) B np.array([8, 6, -3, 1]…

Unity上接入手柄,手柄控制游戏物体移动

1、unity软件上安装system input 组件。菜单栏【window】-【Packag Manager】打开如下界面,查找Input System,并且安装。 2、安装成功后插入手柄到windows上,打开菜单栏上【window】--【Analysis】--【Input Debuger】 进入Input Debug界面,可以看到手柄设备能被Unity识别。…

Flutter - iOS 开发者速成篇

首先 安装FLutter开发环境&#xff1a;M1 Flutter SDK的安装和环境配置 然后了解Flutter和Dart 开源电子书&#xff1a;Flutter实战 将第一章初略看一下&#xff0c;你就大概了解一下Flutter和Dart这门语言 开始学习Dart语言 作为有iOS经验的兄弟们&#xff0c;学习Dart最快…

快速上手Vue

目录 概念 创建实例 插值表达式 Vue响应式特性 概念 Vue是一个用于 构建用户界面 的 渐进式 框架 构建用户界面&#xff1a;基于数据渲染出用户看到的页面 渐进式&#xff1a;Vue相关生态&#xff1a;声明式渲染<组件系统<客户端路由<大规模状态管理<构建工具 V…

云服务器安装Mysql、MariaDB、Redis、tomcat

前置工作 进入根目录 cd / 进入/user/local文件夹 上传压缩包 rz 压缩包 Mysql 1.下载并安装MySQL官方的 Yum Repository wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5.noarch.rpm yum install mysql-…

<计算机网络自顶向下> TCPUDP套接字编程

应用实现&#xff1a;源端的应用进程交换报文实现应用协议&#xff0c;来实现各种各样的网络应用&#xff08;dash&#xff0c;email, etc&#xff09; 而应用层通信不可以直接通信&#xff0c;需要借助下层的服务才可以进行&#xff0c;通过层间接口交给下层&#xff0c;通过…

Linux(Ubuntu) 查看并删除使用【dpkg】安装的软件【mysql 8.3安装失败---原因调查(Depends: libc6 (>= 2.35) but 2.31-0ubuntu9.1)】

目录 ■前言 ■查看安装的软件 ■删除安装的软件 正常删除&#xff08;dpkg -r xxxxName&#xff09; 问题解决&#xff1a;use --purge to remove them too ■其他调查信息 命令 图片1 图片2 图片3 图片4 图片5&#xff08;和镜像库有关&#xff09; 图片6 ■前…

在MOS管栅极前加100Ω电阻,有啥妙用

我们经常会听到在MOSFET栅极前增加一个电阻。那么&#xff0c;为什么要增加这个电阻&#xff0c;进一步地来讲&#xff0c;为什么要增加一个100Ω电阻&#xff1f; 在MOSFET的栅极前增加一个电阻&#xff1f; MOS管是电压型控制器件&#xff0c;一般情况下MOS管的导通&#x…

【学习笔记十五】批次管理和容量管理

一、批次管理 1.配置 SAP EWM 特定参数 激活仓库的批次管理 2.ERP端物料需要启用批次管理 3.EWM物料需要启用批次管理 一般是ERP启用批次管理&#xff0c;相关的配置也会传输到EWM系统 4.建立批次主数据 5.创建采购订单并创建内向交货单&#xff0c;维护批次 6.维护产品主数…

Ubuntu 22.04 开机自动挂载webdav - 设置开机自启脚本 - 解决坚果云webdav无写入权限

效果图&#xff1a; 前言&#xff1a; 1&#xff09;亲测/etc/fstab的办法没有成功自动挂载&#xff0c;换成传统的rc.local可以解决&#xff1b; 2&#xff09;rc-local.service是系统自带的一个开机自启服务&#xff0c;但是在 ubuntu 20.04 上&#xff0c;该服务默认没有开…

NLP_知识图谱_图谱问答实战

文章目录 图谱问答NERac自动机实体链接实体消歧 多跳问答neo4j_graph执行流程结构图![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1577c1d9c9e342b3acbf79824aae980f.png)company_data![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/20f567d877c743b…

深度学习图像处理基础工具——opencv 实战信用卡数字识别

任务 信用卡数字识别 穿插之前学的知识点 形态学操作 模板匹配 等 总体流程与方法 1.有一个模板 2 用轮廓检测把模板中数字拿出来 外接矩形&#xff08;模板和输入图像的大小要一致 &#xff09;3 一系列预处理操作 问题的解决思路 1.分析准备&#xff1a;准备模板&#…

libbpf-bootstrap库的代码结构介绍(用户层接口介绍),编译链接语句详细介绍,.skel.h文件介绍+示例,bpf程序的后续处理+文件关系总结

目录 libbpf-bootstrap 代码结构介绍 用户层函数 编译 查看 生成内核层的.o文件 第一模块 第二模块 第三模块 第四模块 第五模块 生成辅助文件(.skel.h) 介绍 示例 生成代码层的.o文件 第一模块 第二模块 第三模块 链接出可执行文件 后续总结 libbpf-bootst…

舒欣上门预约系统源码-按摩预约/家政预约全行业适用-小程序/h5/app

上门预约或者到店预约均可&#xff0c;家政&#xff0c;按摩&#xff0c;等等上门类行业均可适用。&#xff08;后台的技师及前台技师这两个字是可以更改的&#xff0c;例如改成家政老师&#xff0c;保洁&#xff0c;等等&#xff09; 视频教程是演示搭建的小程序端&#xff0c…

stm32报错问题集锦

PS&#xff1a;本文负责记录本人日常遇到的报错问题&#xff0c;以及问题描述、原因以及解决办法等&#xff0c;解决办法百分百亲测有效。本篇会不定期更新&#xff0c;更新频率就看遇到的问题多不多了 更换工程芯片型号 问题描述 例程最开始用的芯片型号是STM32F103VE&#…