Web前端 JavaScript笔记7

news2025/1/13 22:49:49

js的执行机制

  js是单线程

        同步:前面一个任务执行结束之后,执行后一个

        异步:异步任务,引擎放在一边,不进入主线程,而进入任务队列的任务

        js通过浏览器解析,浏览器靠引擎解析

        `回调函数`同步任务执行完之后,再回到任务队列里查看异步任务

        常见的异步任务是:settimeout 、setInterval 、事件等等

<script>
        setTimeout(()=>{
        console.log("世界那么拥挤吗,多我一个聪明的人怎么了55555")
    },1000)
        console.log("11111")
        setTimeout(()=>{
        console.log("好想睡觉")
    },0)
        console.log("22222")
        console.log("33333")
</script>

可以看到,拥有定时器的输出语句即使定了0秒,也是后面执行 


对象

1、定义(字面量)

对象的定义通过{}来实现,{}里有函数与变量,但在对象里他们叫属性与方法

对象的成员以键值对的形式出现,多个成员之间用逗号隔开。如下

let cat={
            "name":"Tom",
            "age":0,
            "eat":()=>{
                console.log("猫喜欢吃鱼")
            }
        }
console.log(cat)

2、 访问对象成员

对象名.成员

console.log("猫猫的名字"+cat.name)
console.log("猫猫的年龄"+cat.age)
cat.eat()

3、 对象成员遍历

使用 for ....in.....可以遍历对象成员

  for(let i in cat){
           console.log(i+":"+cat[i])
       }


构造函数

构建对象是创造对象的另一种方式

构造函数可以创造出一组具有相同特征的对象

可以通过动物函数构造出小猫,小狗,小鸟对象。这些对象基于构造函数这一个模板创造,同时又各有自己的特征。

定义1、 

function 函数名(参数){

        let 对象名={}        //创建一个空对象

        对象名.属性=参数

        对象名.方法名=()=>{方法内容}

        return 对象名

}

 <script>
    function a(name,age,action){
    let animal={}
    animal.name=name
    animal.age=age
    animal.action=action
    animal.happy=()=>{console.log("冬暖夏凉,吃好睡好")}
    return animal
 }
    let cat=a("小猫",9,"喵喵叫")
    let dog=a("小狗",5,"汪汪叫")
    console.log(cat)          
    console.log(dog)         
</script>

定义2 

function 对象名(参数){

this.参数=参数值

this.方法=function(){

        方法内容

}}

function animal(name,age,action){
    this.name=name
    this.age=age
    this.happy = function() {
    console.log("睡个12个小时")}
  this.hobby=()=>{
      console.log("吃吃吃,好吃爱吃")}
}
let cat =new animal("猫咪",2,"喵喵喵")   
let dog =new animal("狗狗",2,"汪汪汪")
console.log(cat)          
console.log(dog)  
cat.hobby() 


深拷贝与浅拷贝

 浅拷贝 : 指两个js 对象指向同一个内存地址,其中一个改变会影响另一个;

  <script>
        let a=[1,2,3,4]
        let a2=a
        a2.push("kaka")
        console.log(a)
        console.log(a2)
</script>

将数组a赋值与于a 2,a2发生改变,a也随之发生改变,是因为数组a将地址赋给了a2

深拷贝 :真正创建一个对象的副本,就是复制一个对象,复制后的新对象重新指向一个新的内存地址,两个对象改变互不影响。

<script>
        let a=[1,2,3,4]
        let a2=[...a]
        a2.push("kaka")
        console.log(a)
 </script>

但是,复制的对象里面有元素是个数组,拆开对象复制元素的时候,并没有拆开元素里的数组,等同于浅拷贝的地址赋值。 

    <script>
        let a=[1,2,3,4,["哈哈"]]
        let a2=[...a]
        a2[4].push("kaka")
        console.log(a)
        console.log(a2)
    </script>

解决方法:让被复制的相对应的数组元素 ,另外赋值为拆开的原数组元素

    <script>
        let a=[1,2,3,4,["哈哈"]]
        let a2=[...a]
        a2[4]=[...a[4]]
        a2.push("kaka")
        console.log(a)
        console.log(a2)
    </script>


原型

假如,由构造函数创建的多个对象里,都有个一模一样的属性或方法,那么有相同属性方法的不同对象创建,会浪费内存。于是就有原型的出现。

原型是一个对象,包括构造函数共同的属性方法。原型对象是通过构造函数的prototype属性创建的。

下面这个例子两个对象之间有相同的函数,用关系运算符就知道他们连地址都不一样。 

function animal(name,age,action){

    this.name=name
    this.age=age
    this.hobby=()=>{
      console.log("吃吃吃,好吃爱吃")}
}

let cat =new animal("猫咪",2,"喵喵喵") 
let dog =new animal("狗狗",2,"汪汪汪")
console.log(cat.hobby===dog.hobby )

 

将同样的方法变成原型的共享方法 ,使其只占一块内存地址

构造函数名.prototype.属性/方法

function animal(name,age,action){
    this.name=name
    this.age=age
}
let cat =new animal("猫咪",2,"喵喵喵")   
let dog =new animal("狗狗",2,"汪汪汪")
animal.prototype.hobby=function (){
      console.log("吃吃吃,好吃爱吃")}
console.log(cat.hobby===dog.hobby )

 

原型链 

  • 原型链:每个构造函数的原型对象都有一个指向另一个构造函数的原型对象的原型链。
  • 当我们试图访问一个对象的属性时,如果该对象本身没有这个属性,会去查找创造这个对象的构造函数的原型对象。
  • 若该原型对象本身没有这个属性,JS引擎会沿着原型链向上查找,直到找到该属性或者到达原型链的末端。
  • 继承:通过原型链,JS实现了对象之间的继承。子级原型对象可以通过原型链访问父级原型对象的属性和方法,实现了属性和方法的共享。
  • Object对象是js的内置对象,所有的 JS对象都继承自 Object的原型对象 Object.prototype,因为Object的原型对象是原型链的顶端。
  • 原型链的终点是 null,在原型链的最顶端找不到属性或方法时会返回 null。

这是一个有原型的构造函数,所有对象有个共享方法happy。 

function animal(name,age,action){
    this.name=name
    this.age=age
}
let cat =new animal("猫咪",2,"喵喵喵")   
let dog =new animal("狗狗",2,"汪汪汪")
animal.prototype.hobby=function (){
      console.log("吃吃吃,好吃爱吃")}  
  • console.log(cat.constructor)
  • console.log(cat.__proto__.constructor)
  • console.log(animal.prototype.constructor)  

这三段语句都是下图结果,是构造函数本身

 

  • console.log(cat.__proto__)
  • console.log(animal.prototype)  

 这两句话指向同样的地方:构造函数原型对象

 

 

function animal(name,age) {
  this.name=name
  this.age=age;
}
const cat = new animal('猫咪', 10);

console.log(cat instanceof animal);
console.log(cat instanceof Object);

 


 

this

1、在全局作用域中
this -> window

<script>
   console.log(this); //this->window
</script>


2、箭头函数中的this
箭头函数没有自己的this,引用的是距离自己最近的作用域中的this

3、事件绑定中的this
this -> 事件源

<button>点击</button>
document.querySelector("button").addEventListener("click",function(){
            console.log(this)
        })


4、定时器中的this
this->window

   setTimeout(()=>{
            console.log(this)
        })


5、构造函数中的this
this->实例化对象

function animal(name,age){
    this.name=name
    this.age=age
    this.hobby=function (){
      console.log(this)
      console.log(this.name)
      console.log(this.age)
    } 
}
let cat =new animal("猫咪",2,"喵喵喵")   
cat.hobby()


 

更改this指向

this的指向是可以改变的

call() 、 apply() 这2个函数的第一个参数都是 this 的指向对象

bind()

call()

  <script>
let a={
    name:"zhangsan"
}
let b={
    name:"lisi",
    ha:function(c,d){console.log(this.name+c+d)}
}
b.ha.call(a,"1","2")
    </script>

 

apply() 

<script>
let a={
    name:"zhangsan"
}
let b={
    name:"lisi",
    ha:function(c,d){console.log(this.name+c+d)}
}
b.ha.apply(a,[1,2])
    </script>

 

bind()

<!-- 不会调用函数,返回的是新函数 -->
    <script>
        function t(){
            console.log(this)
        }
        const o={
            "nan":"dfgh"
        }
       newa=t.bind(o)
       newa()
    </script>

 

 综合

 let name="lisi",age=5
       let a={
           name:"kawu",
           aage:this.age,
           p:function(n,aa){
                console.log(this.name+","+this.aage+"岁"+"来自"+n+"去往"+aa)
           }
       }
       let b={
           aage:22,
           name:"zhangsan"
       }
       function bb(ag){
           console.log(this.nname+ag)
       }
       let nname="xiaoming"
       let B=bb.bind({nname:"xiaohua"},2)
a.p.call(b,'成都','上海') 
a.p.apply(b,['成都','上海']);  
B()  


异常处理:

final:不管有没有异常都会执行

下面这个例子故意没有写盒子标签

<body>
    <script>
        try{
            const b=document.querySelector("div")
            box.style.backgroundColor="red"
        }catch(error){
            console.log(error.message)
            console.log("kakakakakak")
        }
        finally{
            console.log("sdfghjkwertyuio")
        }
    </script>
</body>

 

function t(n1,n2){
            if(n1!=n2){
                throw new Error("nonononon");
            }
        }
t(3,4)


 Jquery

  •     $是顶级对象,同时是jquary的别称
  •     jquary无法使用原生对象的方法
  •     $(dom对象)===转换为jQuary对象
  • 要下载引入Jquery官网的js文件,其中压缩了大量属性与方法                                 <script src="./jquery-3.7.1.min.js"> </script>
  • 引入js文件的标签里面就不要再写东西了,重新再写script标签去编写属性方法
<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="./jquery-3.7.1.min.js">
        
    </script>
    <style>
        div{
            height: 100px;
            width: 200px;
            border: 3px solid blue;
        }
     
    </style>
</head>
<body>
    <div>好的佳人们</div>
    <script>
        $("div").css({"color": "aqua","backgroundColor" :"blue"})
    </script>
</body>
</html>

入口函数 

 隐式迭代

选择器

练习 

引入CSS样式:

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./jquery-3.7.1.min.js">
        
    </script>
    <style>
        div{
            height: 100px;
            width: 200px;
            border: 3px solid blue;
        }
        .new{
            height: 150px;
            width: 150px;
            border-radius: 50%;
            background-color: chartreuse;
        }
    </style>
</head>
<body>
    <div>好的佳人们</div>
    <script>
        $("div").addClass("new")
        // $("div").removeClass("new")
        // $("div").toggleClass("new")
    </script>
</body>
</html>

 

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

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

相关文章

锂电池寿命预测 | Matlab基于GRU门控循环单元的锂电池寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 锂电池寿命预测 | Matlab基于GRU门控循环单元的锂电池寿命预测 Matlab基于GRU的锂电池剩余寿命预测 基于GRU的锂电池剩余寿命预测&#xff08;单变量&#xff09; 运行环境Matlab2020及以上 锂电池的剩余寿命预测是…

探索早期投资的奥秘:符文(Runes)生态系统的崛起

随着加密市场的迅速发展&#xff0c;投资者们对早期项目的关注越来越高。在这个充满变数和机遇的领域里&#xff0c;抢占先机意味着可能获得巨大的回报。符文&#xff08;Runes&#xff09;生态系统作为近期备受瞩目的项目之一&#xff0c;引发了众多投资者的兴趣。本文将深入探…

Java数据结构-二叉树

目录 1. 树与二叉树1.1 树1.2 二叉树1.3 树的相关概念1.4 特殊的二叉树1.5 二叉树性质1.6 二叉树的存储与表示方法 2. 二叉树遍历2.1 前序遍历2.2 中序遍历2.3 后序遍历2.4 层序遍历 3. 二叉树基本操作3.1 求树的所有结点个数3.2 求叶子结点个数3.3 求第k层结点个数3.4 求二叉树…

笔记-----BFS宽度优先搜索

对于BFS&#xff1a;宽搜第一次搜到就是最小值&#xff0c;并且基于迭代&#xff0c;不会爆栈。 Flood Fill 模型 如果直译的话就是&#xff1a;洪水覆盖&#xff0c;意思就是像是从一个点一圈圈的往外扩散&#xff0c;如果遇见能够连通的就扩散&#xff0c;如果遇见无法联通的…

医院的工作手机、平板等智能终端的安全管理

移动互联网的时代&#xff0c;在医疗行业&#xff0c;特别是各级省市的医院&#xff0c;在各个科室的日常办公及业务开展都依赖计算机及智能终端设备如平板、手机等&#xff0c;这样能提高医务人员的办公效率&#xff0c;从而更好的为患者服务。 在医院信息化发展过程中&#…

vue中使用水印

1. 在utils下创建watermark.js const watermark {}/**** param {要设置的水印的内容} str* param {需要设置水印的容器} container* param {需要设置水印的每一块的宽度} canWidth* param {需要设置水印的每一块的高度} canHeight* param {需要设置水印的字体} canFont* para…

line 1:20 no viable alternative at input ‘point,‘

背景 遇到一个蛋疼的问题&#xff0c;搞得老夫难受的一&#xff0c;解决了索性记录下 Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession61b0005f] was not registered for synchronization because synchronization is not activ…

C# 报输入字符串格式不正确的原因

先放错误代码 23 class Voicewater 24 { 25 public void voicealarm(int tem) 26 { 27 Console.WriteLine("现在的温度是{}度了",tem); 28 } 29 } 解决方法…

盲人盲杖:科技革新,助力视障人士独立出行

在我们的社会中&#xff0c;盲人朋友们以其坚韧的精神风貌&#xff0c;生动诠释着生活的多样与可能。然而&#xff0c;当我们聚焦于他们的日常出行&#xff0c;那些普通人视为寻常的街道、路口&#xff0c;却成为他们必须面对的严峻挑战。如何切实提升盲人盲杖的功能&#xff0…

PostgreSql-Install

PostgreSql源码安装 一、源代码下载二、操作系统配置三、编译安装四、启动数据库五、相关命令 PostgreSQL是一个强大的 开源对象关系数据库系统&#xff0c;它使用并扩展了SQL语言&#xff0c;并结合了许多功能&#xff0c;可以安全地存储和扩展最复杂的数据工作负载。 一、源…

【C语言】指针详解(五)

目录 1.字符指针 1.1常量字符串 2.指针数组 3.数组指针 1.字符指针 字符指针就是指向字符的指针&#xff0c;字符指针可以存储字符变量的地址。 举例如下&#xff1a; 定义指针变量pa存a的地址&#xff0c;改变*pa的值&#xff0c;a也会随之改变 。 1.1常量字符串 &#x1f…

开发工具——postman使用教程详解

一、概念 1、Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件&#xff0c;Postman分为Postman native app和Postman Chrome app两个版本。目前Chrome app已停止维护&#xff0c;官方不推荐使用该版本。 2、官网下载地址&#xff1a;http://www.getpostman.com…

MATLAB实现禁忌搜索算法优化柔性车间调度fjsp

禁忌搜索算法的流程可以归纳为以下几个步骤&#xff1a; 初始化&#xff1a; 利用贪婪算法或其他局部搜索算法生成一个初始解。清空禁忌表。设置禁忌长度&#xff08;即禁忌表中禁止操作的期限&#xff09;。邻域搜索产生候选解&#xff1a; 通过特定的搜索算子&#xff08;如…

微信小程序地图polyline坐标太多异常显示BUG

描述 微信小程序map地图上显示polyline线&#xff0c;点位超过1250个出现bug&#xff0c;&#xff08;仅真机上出现&#xff0c;模拟器上正常&#xff09; 这里以加载四川省边界为例, 以下是示例代码 // 读取geojson数据 uni.request({url: https://geo.datav.aliyun.com/a…

用 element ui 实现季度选择器

由于在数据项目中经常以各种时间条件查询数据&#xff0c;所以时间选择器&#xff08;DatePicker&#xff09;组件是很常用的组件。但是在我使用的 Element UI 中&#xff0c;缺少了季度选择器的功能。 简易实现 一开始我根据时间范围使用 select 去遍历,如 2024-Q1、2023-Q4…

Node.js 基础学习

文章目录 1. Node.js1.1 是什么&#xff1f;1.2 作用 2. 命令行工具2.1 命令的结构2.2 常用命令 3. Node.js 注意点3.1 Node.js 中不能使用DOM 和BOM 的API3.2 Node.js 中顶级对象叫做global 4. Buffer4.1 Buffer 特点4.2 Buffer 创建方式4.3 Buffer 操作与注意点 5. 计算机基础…

Rust入门-引用借用

一、引用借用&#xff0c;是什么、为什么、怎么用 所有权上篇我们已经讨论过了&#xff0c;所以这篇我们讨论Rust的引用借用 1、引用借用 是什么&#xff1f; Rust 通过借用(Borrowing) 这个概念来达成上述的目的&#xff0c;获取变量的引用&#xff0c;称之为借用(borrowin…

CERLAB无人机自主框架: 1-环境搭建

前言&#xff1a;更多更新文章详见我的个人博客主页【MGodmonkeyの世界】 描述&#xff1a;欢迎来到CERLAB无人机自主框架&#xff0c;这是一个用于自主无人飞行器 (UAV) 的多功能模块化框架。该框架包括不同的组件 (模拟器&#xff0c;感知&#xff0c;映射&#xff0c;规划和…

【数据结构-串-数组-广义表】

目录 1 串-理解1.1 串的抽象定义&#xff1a;-理解1.2 串的存储结构-不断掌握1.2.1 顺序存储结构&#xff1a;1.2.2 链式存储结构&#xff1a; 1.3 串的模式匹配算法&#xff1a;-掌握1.3.1 BF暴力求解算法-代码 -掌握1.3.2 KMP求解算法-代码--掌握 2 数组-不断掌握2.1 顺序存储…

vue-cli2 与vue-cli3,vue2与vue3 初始化项目,本地vue项目,详细解析区别(2024-04-19)

目录 1、区别&#xff08;vue-cli2 与 vue-cli3 &#xff09; 2、例子1&#xff08;vue2项目&#xff09; 2.1 版本与命令行 2.2 项目本地截图 2.3 项目文件解析 &#xff08;1&#xff09;package.json 文件 &#xff08;2&#xff09;webpack.dev.conf.js文件 &#…