JavaScript 由浅至深(总结版)

JavaScript 基础

js 简介

  • JavaScript 是编译脚本语言,与 Java 没有任何关系。

js 作用

  • 用户交互
  • 表单验证
  • 网页特效

体验js

  • window.alert() 弹框
  • console.log() 控制台输出
  • document.write() 页面输出
  • prompt(“请输入信息”) 输入框

JavaScript 组成

  • ECMA Script 基本语法
  • DOM 文档对象模型
  • Bom 浏览器对象模型

JavaScript 书写位置

  • 写在行内
  • 写在标 script 签内
  • 写在外部,利用 script 的 src 属性引入

js 语法

  1. 变量 用 关键字:var 声明
  2. 变量命名规则:有字母、下划线、数字、$、组成,不能以数字开头,不能是关键字或保留字,区分大小写。
  3. 变量命名规范:变量名必须有意义,遵循驼峰命名法
  4. 数据类型
    • 简单数据类型:Number、String、Boolean、Undefined、Null
    • 数值判断:isNaN() is not a number
  5. 类型转换
    • 转数字:Number()
    • 转String:toString()、String()、隐式转换:字符串拼接的时候
    • 转Boolean: Boolean()

操作符

  1. 算数运算符:+、 -、 *、 /、 %
  2. 一元运算符:++、–
  3. 关系运算符:>、<、>=、<=、=== 、 !==
  4. 逻辑运算符:&&、||、!
  5. 赋值运算符:=、+=、-=、*=、/=

语句

  1. 表达式:有操作符和操作数组成,一个表达式可以产生一个值,有可能是运算、函数调用、也可能是字面量。表达式可以放在任意需要值的地方。
  2. 语句:可以理解为一个行为,循环语句和判断语句就是典型的语句。一个程序可以有很多个语句组成。

流程控制

  1. 顺序结构:从上到下执行的代码就是顺序结构,程序默认就是从上到下执行。

  2. 分支结构:根据不同的情况,执行对应的代码

    • if … else … 语句

    • if … else if … else … 语句

    • 三元表达式:表达式1 ? 表达式2 :表达式3

    • switch 语句

      switch(expression){
          case 常量1 : 语句; break;
          case 常量2 : 语句; break;
          default: 语句; break;
      }
      
  3. 循环语句

    • while 语句

      while (循环条件) {
          // 循环体
      }
      
    • do … while 语句

      do {
          // 循环体
      } while(循环条件)
          
      // do..while 循环和 while 循环非常像,二者经常可以相互替代,但是 do..while 的特点是不管条件成不成立,都会执行一次。
      
    • for 语句

      for(var i=0; i<10; i++){  // 初始化;判断条件;自增表达式
          // 循环体
      }
      

结束循环

  1. break:结束整个循环
  2. continue:结束本次循环

数组

  1. 数字的概念:将多个元素按照一定循序排列放到一个集合中,那么这个集合我们称之为数组。

  2. 数字的定义:数组是一个有序的列表,可以放任意类型数据,并且数组的长度可以动态调整。

    • 字面量定义数组

      var arr = [1, 2, 3]
      // 字面量定义的数组可以是空数组
      
    • 构造函数定义数组

      var arr = new Array(1, 2, 3)
      // 如果构造函数中只有一个数字,表示数组的长度
      
  3. 获取数组的元素

    // 通过索引获取
    arr[0]
    // 获取数组的长度
    arr.length
    
  4. 遍历数组

    for(var i=0; i<arr.length; i++) {  }
    

函数

  1. 函数的定义:把一段相对独立的具有特定功能的代码块封装起来,形成一个独立实体,就是函数。函数的作用就是封装一段代码,使其可以重复使用。

  2. 函数的声明

    function fn() { }
    
    
  3. 函数的调用

    // 语法:函数名()  特点:函数体只有在函数调用的时候才会执行
    fn()
    
    
  4. 函数的参数

    • 形参:无实际意义,占位置用的
    • 实参:参与数据的运算
  5. 函数的返回值

    函数通过 return 返回一个返回值

    特点:如果函数没有 return ,那么返回 undefined;如果有 return 但后面没有任何内容,返回的也是 undefined,return 后面的所有代码都执行。

  6. arguments 的使用

    • 所有函数都内置了一个 arguments 对象,arguments 对象中存储了传递的所有的实参。arguments 是一个伪数组。
  7. 作用域

    • 函数外部定义的 或者 函数内部不用 var 定义的变量都是全局变量
    • 函数内部用 var 定义的变量是局部变量
  8. 预解析

    • 解析过程
      • 把变量的声明提升大当前作用域的最前面,只会提升声明,不会提升赋值。
      • 把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用。

事件的三要素

  1. 事件源:引发事件的元素

  2. 事件类型:onclick(鼠标点击事件)、onbdlclick(鼠标双击)、onkeydown(键盘按下)、onkeyup(键盘抬起)、

    ​ onfocus(获取焦点)、onblur(失去焦点)、onmouseover(鼠标悬停)、onmouseout(鼠标移出)、

    ​ onmouseenter(鼠标进入)、onmouseleave(鼠标离开)、oncontextmenu(鼠标右击)、

    ​ oninput(文本框内容改变事件)、onresize(浏览器窗口大小改变事件)

  3. 事件驱动程序:要执行的逻辑代码

操作元素内容

  • innerHTML 认识 HTML 标签
  • innerText 不认识 HTML 标签

数组常用 API

  • 兼容性好的
    • arr.pop() 删除数组的最后一个元素,返回值是被删除的元素
    • arr.shift() 删除数组的第一个元素,返回值是被删除的元素
    • arr.push() 在数组的最后插入一个元素,返回新数组的长度
    • arr.unshift() 在数组的最前面插入一个元素,返回新数组的长度
    • arr.splice(start, n, m1, m2) 从指定位置开始,删除 n 个元素,然后在该位置插入 m 元素
    • arr.slice(start, end) 截取数组,从 start开始,到 end 结束,不包括 end
    • arr.jion(“分隔符”) 转成字符串,默认用 逗号 分隔
    • arr.reverse() 反转数组
    • arr.sort(function(a, b) {return a-b}) 数组排序,升序 a-b ;降序 b-a ;不写按照字符编码顺序排序
  • 兼容性差的
    • arr.forEach(function(item, index) {}) 数组遍历
    • for(var item in arr) {} 数组遍历
    • arr.filter(function(item, index){}) 过滤数组
    • arr.every(function(item, index) {}) 所有条件满足时返回 true,否则返回 false
    • arr.some(function(item, index) {}) 有一个元素满足条件就返回 true,否则返回 false
    • arr.reduce(function(上一次函数的返回值,当前元素) {}, 初始值) 最后一个参数是一个函数的实参,最后一次循环的返回值就是整个 reduce 函数的返回值
    • arr.map(function(item, index) {}) 每一次循环函数的返回值集合构成 map 的返回值
    • arr.indexOf(“要查找的元素”) 找到返回元素对应的索引,否则返回 -1
    • arr.find(function(item, index) {}) 返回符合条件的那一项,没找到就返回空
    • arr.findIndex(function(item, index) {}) 查找符合条件的那一项索引值

对象

  1. 对象的介绍

    • 对象是无序键值对的集合,键名不允许重复

    • 对象的定义

      // 字面量定义
      var obj = {name: "张三", age: 18}
      
      // 构造函数定义
      var obj = new Object()
      
      
    • 操作对象的属性和方法

      // 获取对象的属性
      obj.属性名 = 属性值  ||   obj[属性名]     // [ ] 里面的可以按正常 js 语法解析
      
      
    • 对象的遍历

      // key 是变量名、是键,obj[key]是值
      for(var key in obj) { }
      
      
  2. json 格式数据:一种类似对象的数据存储格式,键名必须使用 “” 包裹,值为字符串时也必须使用 “” 包裹

字符串常用方法

  1. 字符串的长度: str.length
  2. 根据索引查找字符:str.charAt(index) 没有找到返回空字符
  3. 根据索引查字符编码:str.charCodeAt(index) 没有找到返回 NaN
  4. 根据字符查索引:str.indexOf(“要查找的字符”) 没有找到返回 -1
  5. 字符串的截取
    • str.slice(start, end) 从 start 开始,到 end 结束,不包括 end
    • str.substring(start, end) 从 start 开始,到 end 结束,不包括 end ,不能为 负数
    • str.substr(start, length) 从 start 开始,截取 length 个字符
  6. 根据编码转字符:String.formCharCode(“字符编码”) 得到的如果是 字母,都是大写的
  7. 字符串转数组:str.split(“分隔符”) 默认分割成一个元素
  8. 转大写:str.toUpperCode()
  9. 转小写:str.toLowerCode()

Math 对象

  • 平方根:Math.sprt()
  • 求 m 的 n 次方:Math.pow(m, n)
  • 向上取整:Math.ceil()
  • 向下取整:Math.floor()
  • 0-1 之间的随机数:Math.random()
  • 四舍五入:Math.round()
  • 绝对值:Math.abs()
  • 最大值:Math.max()
  • 最小值:Math.min()
  • 圆周率:Math.PI

Date 对象

  1. 定义日期对象

    var date = new Date()
    // 不加参数表示当前时间,参数可以是具体时间,也可以是距离 1970.1.1 的毫秒值
    // 参数加引号和不加引号的区别:不加引号月份是 0-11 之间
    
    
  2. Date 的常用方法

    // 获取距离 1970.1.1 的毫秒值
    Date.now()   ||  date.getTime()  ||  Date.parse("具体时间")
    
    // 将毫秒值转成具体时间
    date.setTime(毫秒值)
    
    // 获取年份
    date.getFullYear()
    
    // 获取月份
    date.getMounth()
    
    // 获取日
    date.getDate()
    
    // 获取小时
    date.getHours()
    
    // 获取分钟
    date.getMinutes()
    
    // 获取秒
    date.getSecends()
    
    // 获取星期
    date.getDay()
    
    

定时器

  1. 倒计时 (一次性)

    setTimeout(function() {}, 时间, 实参)
    /*  第一个参数:时间到了要执行的函数,函数只执行一次
    	第二个参数:倒计时的时间
    	第三个参数:第一个参数函数的实参
    */
    
    
  2. 循环定时器

    setInterval(function() {}, 间隔时间, 实参)
    /*  第一个参数:每个一定时间要执行的函数,函数执行多次
    	第二个参数:时间间隔
    	第三个参数:第一个参数函数的实参
    */
    
    
  3. 清除定时器

    • 通过 setInterval 定义的定时器,必须使用 clearInterval(定时器名称) 清除

    • 通过 setTimeout 定义的定时器,必须使用 clearTimeout(定时器名称) 清除

    • 注意:使用定时器之前最好先清除定时器

特殊标签的获取

  • body 标签: document.body
  • head 标签:document.head
  • title 标签:document.title 获取的是 title 标签里的内容
  • html 标签:document.documentElement

BOM 浏览器对象模型

  • location 对象

    // 页面跳转  window 可以省略不写
    window.location.href = "地址"
    
    // 刷新页面
    window。location.reload()
    
    
  • history 对象

    // 后退
    window.history.back()
    
    // 前进
    window.history.forward()
    
    // num 为正数表示前进,负数表示后退
    window.history.go(num)
    
    
  • 关闭窗口

    window.close()
    
    
  • 打开新窗口

    window.open("新窗口地址")
    
    
  • 弹框

    // 弹框
    alert("abc")
    
    // 输入框
    prompt("请输入内容")
    
    // 确认框
    confirm("确定要删除吗?")
    
    
  • 控制台 console

节点操作

  1. 查找节点

    • document.getElementById(“id名”) 得到的单个元素
    • document.getElementsByTagName(“标签名”) 得到的是一个伪数组
    • document.getElementsByClassName(“类名”) 得到的是一个伪数组
    • 父元素找子元素
      • 父元素.childNodes 获取子节点 伪数组
      • 父元素.children 获取子元素节点 伪数组
    • 子元素找父元素
      • 子元素.parentNode 获取父节
    • 查找兄弟节点(有兼容)
      • 查找前一个兄弟节点:dom.perviousElementSibling
      • 查找后一个兄弟节点:dom.nextElementSibling
    • 查找第一个子元素(有兼容)
      • 父元素.firstElementChild
    • 查找最后一个子元素(有兼容)
      • 父元素.lastElementChild
  2. 创建节点

    • 创建元素节点
      • document.createElement(“标签名”)
    • 创建文本节点
      • document.createTextNode(“文本内容”)
    • 创建文档碎片节点
      • document.createDocumentFragment()
  3. 添加节点

    • 往元素最后位置添加子元素

      • 父元素.appendChild(子元素)
    • 往父元素的任意位置添加子元素

      • 父元素.insertBefore(要添加的子元素,参照节点) 如果参照节点有 null,默认在最后面添加
  4. 删除节点

    • 父元素删除子元素
      • 父元素.removeChild(子元素)
    • 删除自己
      • 要删除的元素.remove()
    • 清空节点内容
      • 元素.innerHTML = “”
  5. 克隆节点

    • 要克隆的节点.cloneNode(是否深克隆)

      注意:不写参数,默认只克隆本身元素,不克隆里面的内容

  6. 节点类型(nodeType)

    • 元素节点 1
    • 属性节点 2
    • 文本节点 3
    • 注释节点 8
    • 文档节点 9
    • 文档类型节点 10
    • 文档碎片节点 11
  7. 浏览器的宽高

    • 宽度:window.innerWidth
    • 高度:window.innerHeight
  8. 操作元素样式

    • dom.style.属性名 = 属性值 这个方法只能设置样式
    • dom.currentStyle.属性名 (ie 678 支持) 获取属性值
    • window.getComputedStyle(dom, null).属性名 (低版本不支持) 获取属性值
    • dom.getAttribute(“属性名”) 获取属性值
    • dom.getAttribute(“属性名”, “属性值”) 设置属性样式

事件对象 (event)

  1. 兼容写法

    var event = e || window.event
    
    
  2. 鼠标位置相关属性

    // 鼠标距离屏幕的距离
    event.creenX  /  event.creenY     // 水平距离和垂直距离
    
    // 鼠标距离页面的距离 (有兼容问题,可以使用:可见的 + 卷曲出去 代替) 
    event.pageX  /  event.pageY
    
    // 鼠标距离页面可视窗口的距离
    event.clientX  /  event.clientY
    
    // 鼠标距离最近有定位元素的距离
    event.offsetX || event.layerX
    event.offsetY || event.layerY
    
    
  3. 键盘按键

    // 获取单个键盘码 
    event.keyCode || event.which  
    // 通过 String.fromCharCode("编码") 转换,得到的如果是字母,都是大写
    
    // 组合键盘
    event.shiftKey / event.ctrlKey / event.altKey
    
    
  4. 真正触发事件的最小元素

    event.target || event.srcElement
    
    

严格模式

  • 语法:“use strict” (es 5) 在代码中加上这句代码就是严格模式
  • 特点
    • 普通函数中的 this 在严格模式下是 undefined
    • 变量先声明后使用
    • 参数不允许同名

事件机制

  1. 事件的三个阶段

    • 捕获
    • 目标
    • 冒泡
  2. 绑定事件的方式

    dom.onclick = function () {}   // 这种写法同一类型的事件只能绑定一个事件处理函数
    
    // 事件监听方式    事件类型 不带 on
    dom.addEventListener(click, function(e) {}, 是否捕获)     // 低版本浏览器不支持
    
    dom.attachEvent(onclick, function() {})  // ie 678 支持
    
    
  3. 阻止事件冒泡

    event.stopPropagation()    // 低版本浏览器不支持
    
    event.cancelBubble = true  // ie 678 支持
    
    
  4. 阻止事件默认行为

    // 方法一
    return false   // 简单好用
    
    // 方法二
    event.preventDefault()     // 低版本浏览器不支持
    event.returnValue = false   // ie 678 支持
    
    

三大系列

  1. offset 系列

    // 获取元素自身的宽高(包括边框)
    dom.offsetWidth / dom.offsetHeight
    
    // 获取 距离元素最近有定位的父级元素的距离
    dom.offsetLeft / dom.offsetTop
    
    // 距离元素最近有定位的父级元素
    dom.offsetParent
    
    
  2. scroll 系列

    不同浏览器,页面根元素不同,所以存在兼容问题

    // 页面顶部卷曲出去的距离
    document.documentElement.scrollTop || document.body.scrollTop
    
    // 页面左侧卷曲出去的距离
    document.documentElement.scrollLeft || document.body.scrollLeft
    
    
  3. client 系列

    // 浏览器的宽高 (不同浏览器,页面根元素不同)
    document.documentElement.clientWidth || document.body.clientWidth    // 宽度
    document.documentElement.clientHeigth || document.body.clientHeight   // 高度
    
    // 元素内容的宽高, 不包括边框
    dom.clientWidth / dom.clientHeight   // ie 67 中,内容的宽高可以小于元素的宽高
    
    // 元素自身边框的宽度
    dom.clientLeft / dom.clientTop
    
    

正则表达式

  1. 意义:定义字符规则

  2. 定义方式

    // 字面量
    var reg = /表达式/修饰符         //  var reg = /^abc$/g
    
    // 构造函数
    var reg = new regExp("表达式", 修饰符)
    
    
  3. 元字符

    • \d:表示数字, \D:表示非数字

    • \s:表示空格, \S:表示非空格

    • \w:表示单词字符,\W:表示非单词字符 单词字符:数字字母下划线

    • . :表示除 \n\r 以外的任意字符

    • \ :表示转义

  4. 量词

    • 出现 n 次: {n}
    • 出现 n 次以上:{n, }
    • 出现 m 到 n 次:{m, n}
    • 出现 0 次或一次:?
    • 出现一次或多次:+
    • 出现 0 次或多次:*
    • 以 n 开始:^n
    • 以 n 结束:n$
    • 精确匹配:^n$
  5. 方括号

    • [abc] : abc 中的任意一个
    • [^abc] : 取反,除 abc 以外的任意字符
  6. 修饰符

    • i:不区分大小写
    • g:全局匹配
  7. 正则对象方法

    • reg.test(str) 判断 str 是否符合正则规则,符合返回 true
  8. 与正则相关的字符串方法

    • str.match(reg) 查找 str 中符合正则的一个或多个子串,返回查找到的数组集合
    • str.repalce(reg, newStr) 查找 str 中符合正则的字符并替换成 newStr,默认不全局匹配
    • str.search(reg) 查找第一个符合正则的字符串的索引,没找到返回一个 -1,不进行全局不匹配

es 6 常见语法

  1. es 6 关键字

    • let :定义变量,没有预解析,不可重复声明,有块级作用域
    • const :定义变量(常量),没有预解析,定义的同时必须初始化,有块级作用域
  2. json 方法

    • json 转成字符串

      JSON.stringity(json对象)
      
      
    • 像 json 格式字符串转 json 对象

      JSON.parse(str)
      
      
  3. 获取元素节点

    // 选择单个元素
    document.querySelector("选择器")
    
    // 选择多个元素
    document.querySelectorAll("选择器")
    
    
  4. es 6 中的函数

    • 可以设置默认值

      function(a=默认值) {}
      
      
    • 箭头函数

      () => {}
      /* 特点
      	如果函数体只有一句代码,可以省略 {} ,如果这一句是 return,则 return 也要省略
      	如果形参只有一个, () 也可以省略
      	箭头函数不会改变 this 指向
      	没有 arguments 对象
      */
      
      
    • 参数打包

      • 解决了没有 arguments 的问题

      • 语法:function (arr…) { }

      • 把实参打包成一个数组

  5. 扩展运算符(…)

    • 例子

      let arr1 = [1, 2, 3]
      let arr2 = [4, 5, 6]
      let arr = [...arr1, ...arr2]     // arr = [1, 2, 3, 4, 5, 6]
      
      
  6. 解构赋值

    • 对象中如果键名与值名相同,可以省略键名
  7. 模板字符串

    • 语法:用反引号包裹,变量用 ${} 包裹
  8. Array.form 把类数组转换成真正的数组

    Array.form({length}, function() {return})
    // 返回每一次参数二 返回的值,放在一个数组里,长度为 length
    
    
  9. set 类型

    • 类数组,但每一个元素都是唯一的(会自动去除重复元素)

      let set = new Set([1, 2, 2, 3])  // 会自动去重
      
      set.add(4)  // 添加数据
      set.delete(1)  // 删除数据
      set.has(2)    // 判断是否有这个数据
      set.clear()   // 清空数据
      set.size   // 数据长度
      set.forEach(() => {})  // 遍历
      
      
  10. symbol 类型:用于保护对象的属性

  11. map 类型

    • 类对象,map 数据结构里面的 key 可以是复杂数据类型,但不能重复

      //  语法
      let m = new Map([{key1, value1}, {key2, value2}])
      
      // API
      m.size   // 数据结构的长度
      m.set(key, value)  // 添加成员
      m.get(key)   // 获取成员
      m.delete(key)  // 删除成员
      m.has(key)   // 判断是否有这个成员
      m.forEach(() => {})  // 遍历
      
      
      
      

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
拷贝和拷贝是针对JavaScript中的对象属性为对象的情况而言的。拷贝只是复制了对象的引用,也就是复制了内存地址,所以拷贝后的对象和原对象会共用同一个内存地址,属性值的改变会相互影响。而拷贝则是创建了一个完全独立的对象,拷贝了所有的属性和属性值,所以拷贝后的对象和原对象是完全独立的,互不影响。 在JavaScript中,可以通过不同的方法实现拷贝和拷贝。拷贝可以使用手动实现、Object.assign()和拓展运算符等方法。手动实现的拷贝方法是遍历原始对象的属性,将属性值赋给新对象。Object.assign()方法可以将一个或多个源对象的属性复制到目标对象中,也可以用于实现拷贝。拓展运算符(...)也可以用于实现拷贝。 拷贝则需要递归地复制对象的属性和属性值。可以通过手动实现一个拷贝函数,在遍历原始对象的属性时,如果属性值是对象类型,则递归调用拷贝函数进行复制。这样可以创建一个完全独立的对象,拷贝了所有的属性和属性值。 总结起来,拷贝只是复制了对象的引用,而拷贝是创建了一个完全独立的对象。使用不同的方法可以实现拷贝和拷贝,根据具体的需求选择合适的方法进行使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [JavaScript拷贝和拷贝概念与用法实例分析](https://download.csdn.net/download/weixin_38735570/14820137)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [javascript拷贝与拷贝](https://blog.csdn.net/weixin_47417033/article/details/124899204)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值