JS 基础知识

  • JS中,简单类型的数据存储在栈中,复杂类型的数据存储在堆中,其引用存储在栈中
  • JS中的深拷贝和浅拷贝:
    • 浅拷贝:将对象中的所有简单类型的属性拷贝出来,引用类型属性直接赋值null
    • 深拷贝:将对象中的所有属性都拷贝出来,引用类型属性对象中的属性一一拷贝
  • JS类型检测方法:
    • typeof 100:number/string/boolean/undefined/object/function
    • 100 instanceof Number:true/false
    • Object.prototype.toString.apply(100):[Object Number/String/Function/Null]
  • JS中数组定义方式:
    • var arr = new Array();
    • var arr = new Array(20); // 长度20
    • var arr = new Array(1,2,3,4);
    • var arr = [1,2,34,4]; var arr = [[1,2,3],[2,3,4]];
  • JS中的try/catch/finally:
    • JS中的try/catch/finally用法和JAVA中相同
    • 抛出异常:throw new Error("这是一个异常");
    • 打印异常信息:console.error("打印的异常");
  • JS中的函数传参:
    • 简单类型的参数,传递的是一个局部变量,其变化后不影响原始值
    • 引用类型的参数,传递的是一个指针,其变化后悔影响原始值
    • 函数内部可以使用arguments[i]来获取函数的第i个参数
  • JS代码执行流程:JS代码由浏览器解析器执行,解析器要先进行预解析,即在同一级作用域中,找出var声明的变量、function函数和函数的参数,将它们提到这个作用域的最前端,然后再逐行解析
  • JS中的DOM操作:
    • 添加:ele.appendChild(node);
    • 插入:ele.insertBefore(newNode, node); //将newNode插入到node前面
    • 删除:ele.removeChild(node);
    • 修改:ele.replaceChild(newNode, oldNode);
    • 创建:document.createElement('div');
    • 克隆:var newNode = ele.cloneNode(true); //true会克隆所有子节点
  • JS - Date API:
    • 获取当前系统时间:var date = new Date();
    • 获取某个日期时间:var date = new Date(2016, 12, 25);
    • 获取年:getFullYear();获取月:getMonth()+1;获取日:getDate()
    • 获取时:getMonth();获取分:getMinutes();获取秒:getSeconds()
    • 获取时间戳(毫秒):getTime()
  • JS - String API:
    • 大小写转换:str.toUpperCase(); str.toLowerCase();
    • 字符串分割:str.split('/');
    • 查找子串:str.indexOf("abc");
  • JS - Math API:
    • 绝对值:Math.abs(-10)
    • 向上/向下取整:Math.ceil(4.5); Math.floor(4.5);
    • X的Y次幂:Math.pow(x, y);
    • 开平方:Math.sqrt(16);
    • 返回一个0-1的随机数:Math.random();
  • JS - Array API:
    • 将arr2中的数据链接到arr1后面:arr1.concat(arr2);
    • 数组变成字符串:var str = [1,2,3].join('-'); //1-2-3
    • 删除并返回数组中的最后一个元素:arr1.pop();
    • 删除并返回数组中的第一个元素:arr1.shift();
    • 向数组最后添加多个元素,返回新的长度:arr1.push(8);
    • 向数组开头添加多个元素,返回新的长度:arr1.unshift(8);
    • 逆序数组:arr1.reverse();
    • 将数组按升序排序:arr1.sort();
    • 将数组按自定义规则排序:arr1.sort(function(a, b) { return a < b; });
    • 返回数组中从startpos开始到endpos-1的所有元素(如果endpos是负数,则是到数组中的倒数第几个元素):arr1.slice(startpos, endpos);

JS offset

  • JS中的offset用于方便的获取元素尺寸
  • offsetWidth和offsetHeight:
    • DOM对象的这两个属性,可以检测元素所占位置的宽高
    • 这里的宽高包括宽高本身和padding、边框,但不包括margin
    • offsetWidth和offsetHeight的返回值是number类型,没有px单位
  • offsetLeft和offsetTop:
    • DOM对象的这两个属性,可以检测元素距离父容器边界的距离
    • 这里的父容器必须是具有position属性的容器,如果直系父容器没有position属性,则找爷爷容器
    • 如果所有父容器都没有position属性,则返回与body边界的距离
    • offsetLeft和offsetTop只包括父容器的padding,不包括父容器的边框和margin
    • offsetLeft和offsetTop的返回值是number类型,没有px单位
  • offsetParent:
    • 返回距离该元素最近的,有position属性的父容器对象
    • 这里的position属性可以是relativeabsolutefixed,但不可以是static
    • 如果该元素上层的所有父容器都没有设置position属性,则返回body对象

JS 动画

  • 闪现动画:直接设置元素的位置即可
  • 匀速动画:设置定时器,每隔一定时间移动一定的位置
    btn.onclick = function() {
    setInterval(function() {
    div.style.left = div.offsetLeft + 5 + "px";
    }, 100);
    }
  • 变速动画:
    • 变速动画,就是一个开始时运动快,运动过程中越来越慢的动画效果
    • 变速动画的优点:有非常逼真的动画效果,实现的动画效果更加细腻
    • 变速动画的缺点:如果不清除定时器,则会一直运行下去
    • 变速动画原理:盒子位置 = 盒子本身位置 + (目标位置 - 盒子本身位置) / 10
    • 变速动画实现代码:
      var timer = null;
      btn.onclick = function() {
      timer = setInterval(function() {
      div.style.left = div.offsetLeft + Math.ceil((400 - div.offsetLeft) / 10) + 'px';
      console.log(1);
      if(Math.abs(div.offsetLeft) === 400) {
      clearInterval(timer);
      }
      }, 30);
      };

JS HTML基本结构获取方法

  • 文档标题title:document.title
  • 所有HTML:document.documentElement
  • 文档头标签head:document.head
  • 文档内容body:document.body

JS JSON

  • JSON定义:var json = {'param1':'aaa', 'param2':123, ...};
  • JSON数据的遍历,代码如下:
    for(var k in json) {
    console.log(k); // 属性
    console.log(json[k]); // 属性值
    }

JS scroll

  • scrollWidth和scrollHeight:

    • DOM对象的这两个属性,可以检测元素内容的宽高
    • 这里的宽高包括对象本身的宽高和padding值,不包括margin和border
    • 如果内容超出对象,则以内容为准;否则以对象本身为准
  • scrollLeft和scrollTop:
    • DOM对象的这两个属性,可以获取网页被卷去的头部的像素大小
    • 由于这两个方法有浏览器兼容问题,获取的时候需要考虑兼容,代码如下:
      console.log(document.body.scrollTop || document.documentElement.scrollTop);
      // 也可以按下面的方法写
      console.log(document.body.scrollTop + document.documentElement.scrollTop);
      // 也可以按下面的方法写
      console.log(window.pageYOffset);
    • 当前的主流写法:
      console.log(window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop);
  • 通过代码设置页面滚动到某个坐标值:window.scrollTo(x, y);
  • 监听页面的滚动事件:window.onscroll = function() {};

JS 事件对象Event

  • 如果事件函数中没有参数,系统默认会提供一个event参数,代码如下:
    div.onclick = function() {
    console.log(event); // event有值
    }
  • 如果带了参数且参数不为event,则event仍可用,但有些浏览器不支持这个函数参数
  • 如果带了参数且参数为event,则有些浏览器不会再识别event,如IE浏览器
  • 针对上面的问题,需要有一个兼容的写法,代码如下:
    div.onclick = function(event) {
    event = event || window.event;
    console.log(event);
    }
  • event属性:
    • event.target:触发事件的对象
    • event.type:事件的类型(click)
    • event.button:获取事件是鼠标的哪个按钮被点击(左键0,滑轮1)
    • event.pageX:光标相对于该网页顶部的水平位置(IE不支持该属性)
    • event.pageY:光标相对于该网页左边的垂直位置(IE不支持该属性)
    • event.screenX:光标相对于屏幕顶端的水平位置
    • event.screenY:光标相对于屏幕左端的垂直位置
    • event.clientX:光标相对于该网页可见区域的水平位置
    • event.clientY:光标相对于该网页可见区域的垂直位置
  • event事件冒泡机制:
    • 当一个盒子触发一个事件之后,会将这个事件依次传递给它的父盒子、父父盒子......
    • 注意:一个事件只能触发同类事件,如onclick只能触发onclick
    • 也就是说,当点击一个盒子之后,会依次触发其父盒子的onclick、其父父盒子的onclick......(如果这些盒子都有onclick事件的话)
    • 事件冒泡的顺序:div -> body -> html -> document -> window
    • 以下事件不冒泡:onmouseenter、onmouseleave、onload、onunload、onfocus、onblur
    • 阻止冒泡的代码:
      if (event || event.stopPropagation) {
      event.stopPropagation();
      } else {
      event.cancelBubble = true;
      }
  • event事件传播的三个阶段:
    • 捕获阶段:事件从DOM树顶层向下查找,直到捕获到事件源
    • 冒泡阶段:事件依次向上冒泡
    • 目标阶段:事件依次执行

JS client

  • clientWidth和clientHeight:

    • DOM对象的这两个属性,用于获取网页可视区域的宽高
    • 不同对象的这两个属性,拥有不同的意义
    • 如果调用这两个属性的是一个盒子,则表示这个盒子的宽高
    • 如果调用这两个属性的是body/html,则表示网页可视区域的宽高
  • clientX和clientY:这两个属性仅用于事件中获取鼠标位置
  • clientTop和clientLeft:
    • clientWidth = width + padding
    • clientHeight = height + padding

JS 三大家族总结

  • 三大家族包括:offset、scroll、client
  • offsetWidth/height = width/height + padding * 2 + border * 2
  • scrollWidth/height = width/height
    if(window.pageYOffset !== undefined){
    return {
    "top": window.pageYOffset,
    "left": window.pageXOffset
    };
    }else if(document.compatMode === "CSS1Compat"){
    return {
    "top": document.documentElement.scrollTop,
    "left": document.documentElement.scrollLeft
    };
    }else{
    return {
    "top": document.body.scrollTop,
    "left": document.body.scrollLeft
    };
    }
  • clientWidth/height = width/height + padding * 2
    if(window.innerHeight !== undefined){
    return {
    "width": window.innerWidth,
    "height": window.innerHeight
    }
    }else if(document.compatMode === "CSS1Compat"){
    return {
    "width": document.documentElement.clientWidth,
    "height": document.documentElement.clientHeight
    }
    }else{
    return {
    "width": document.body.clientWidth,
    "height": document.body.clientHeight
    }
    }
  • offsetTop/offsetLeft:
    • 调用者:任意元素
    • 作用:距离父系盒子中有定位的(有position属性的)父盒子的距离
  • scrollTop/scrollLeft:
    • 调用者:document.body
    • 作用:被浏览器卷去的网页上边和左边的内容宽高
  • clientX/clientY:
    • 调用者:事件event
    • 作用:鼠标距离浏览器可视区域边界的距离

【前端】之JavaScript基础知识的更多相关文章

  1. 谷哥的小弟学前端(11)——JavaScript基础知识(2)

    探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 具体解释Android主流框架不可或缺的基石 站在源代码的肩膀上全解Scroller工作机制 Android多分辨率适 ...

  2. 谷哥的小弟学前端(10)——JavaScript基础知识(1)

    探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 具体解释Android主流框架不可或缺的基石 站在源代码的肩膀上全解Scroller工作机制 Android多分辨率适 ...

  3. 前端之JavaScript基础

    前端之JavaScript基础 本节内容 JS概述 JS基础语法 JS循环控制 ECMA对象 BOM对象 DOM对象 1. JS概述 1.1. javascript历史 1992年Nombas开发出C ...

  4. Javascript基础知识总结一

    Javascript基础知识总结一 <!DOCTYPE html> <html> <head lang="en"> <meta chars ...

  5. 第三篇:web之前端之JavaScript基础

    前端之JavaScript基础   前端之JavaScript基础 本节内容 JS概述 JS基础语法 JS循环控制 ECMA对象 BOM对象 DOM对象 1. JS概述 1.1. javascript ...

  6. 学习javascript基础知识系列第二节 - this用法

    通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascr ...

  7. 学习javascript基础知识系列第三节 - ()()用法

    总目录:通过一段代码学习javascript基础知识系列 注意: 为了便于执行和演示,建议使用chrome浏览器,按F12,然后按Esc(或手动选择)打开console,在console进行执行和演示 ...

  8. JavaScript 基础知识 - BOM篇

    前言 本篇文章是JavaScript基础知识的BOM篇,如果前面的<JavaScript基础知识-DOM篇>看完了,现在就可以学习BOM了. 注意: 所有的案例都在这里链接: 提取密码密码 ...

  9. JavaScript基础知识整理

    只整理基础知识中关键技术,旨在系统性的学习和备忘. 1.在 JScript 中 null 和 undefined 的主要区别是 null 的操作象数字 0,而 undefined 的操作象特殊值NaN ...

随机推荐

  1. C语言存储类别和链接

    目录 C语言存储类别和链接 存储类别 存储期 五种存储类别 C语言存储类别和链接 ​ 最近详细的复习C语言,看到存储类别的时候总感觉一些概念模糊不清,现在认真的梳理一下.C语言的优势之一能够让程序员恰 ...

  2. 使用ASP.NET Core 3.x 构建 RESTful API - 1.准备工作

    以前写过ASP.NET Core 2.x的REST API文章,今年再更新一下到3.0版本. 先决条件 我在B站有一个非常入门的ASP.NET Core 3.0的视频教程,如果您对ASP.NET Co ...

  3. vue学习之插槽

    插槽 插槽(Slot)是Vue提出来的一个概念,正如名字一样,插槽用于决定将所携带的内容,插入到指定的某个位置,从而使模板分块,具有模块化的特质和更大的重用性. 个人理解:我感觉插槽就是父组件控制插槽 ...

  4. CSPS模拟 50

    收获很多,良心出题人 T1 施工 研究半天,最后30分暴力走人 考后看了题解,稍神仙这题弃对了...... 要拿30+,必须发现要填的话一定是填一个坑使它底部变平,最终底部高度小于等于两边 为什么是坑 ...

  5. 使用Typescript重构axios(二十三)——添加withCredentials属性

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  6. P3052 [USACO12MAR]摩天大楼里的奶牛(迭代加深搜索)

    (已经一句话了) 第一反应:暴力 第二反应:朴素算法过不去 第三反应:没法折半暴搜(没法统计答案) 所以,歪歪了一个类似贪心刷表的方法,过了这道题. 首先,如果爆搜的话会有几个状态: 当前牛 当前几个 ...

  7. [UWP]为番茄钟应用设计一个平平无奇的状态按钮

    1. 为什么需要设计一个状态按钮 OnePomodoro应用里有个按钮用来控制计时器的启动/停止,本来这应该是一个包含"已启动"和"已停止"两种状态的按钮,但我 ...

  8. vue实现tab选项卡切换效果

    tab选项卡切换效果: 通过点击事件传入参数,然后通过v-show来进行切换显示 <template> <div class="box"> <div ...

  9. Python-webbrowser实现自动打开关、定时打开关闭网页/刷新网页

    webbrowser- 方便的Web浏览器控制器,是Python一个模块,可实现自动打开关.定时打开关闭网页/刷新网页,在Unix下,图形浏览器在X11下更受欢迎,但如果图形浏览器不可用或X11显示器 ...

  10. 【Go 入门学习】第一篇关于 Go 的博客--Go 爬虫初体验

    一.写在前面 其实早就该写这一篇博客了,为什么一直没有写呢?还不是因为忙不过来(实际上只是因为太懒了).不过好了,现在终于要开始写这一篇博客了.在看这篇博客之前,可能需要你对 Go 这门语言有些基本的 ...