【前端】之JavaScript基础知识
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
属性可以是relative
、absolute
、fixed
,但不可以是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基础知识的更多相关文章
- 谷哥的小弟学前端(11)——JavaScript基础知识(2)
探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 具体解释Android主流框架不可或缺的基石 站在源代码的肩膀上全解Scroller工作机制 Android多分辨率适 ...
- 谷哥的小弟学前端(10)——JavaScript基础知识(1)
探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 具体解释Android主流框架不可或缺的基石 站在源代码的肩膀上全解Scroller工作机制 Android多分辨率适 ...
- 前端之JavaScript基础
前端之JavaScript基础 本节内容 JS概述 JS基础语法 JS循环控制 ECMA对象 BOM对象 DOM对象 1. JS概述 1.1. javascript历史 1992年Nombas开发出C ...
- Javascript基础知识总结一
Javascript基础知识总结一 <!DOCTYPE html> <html> <head lang="en"> <meta chars ...
- 第三篇:web之前端之JavaScript基础
前端之JavaScript基础 前端之JavaScript基础 本节内容 JS概述 JS基础语法 JS循环控制 ECMA对象 BOM对象 DOM对象 1. JS概述 1.1. javascript ...
- 学习javascript基础知识系列第二节 - this用法
通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascr ...
- 学习javascript基础知识系列第三节 - ()()用法
总目录:通过一段代码学习javascript基础知识系列 注意: 为了便于执行和演示,建议使用chrome浏览器,按F12,然后按Esc(或手动选择)打开console,在console进行执行和演示 ...
- JavaScript 基础知识 - BOM篇
前言 本篇文章是JavaScript基础知识的BOM篇,如果前面的<JavaScript基础知识-DOM篇>看完了,现在就可以学习BOM了. 注意: 所有的案例都在这里链接: 提取密码密码 ...
- JavaScript基础知识整理
只整理基础知识中关键技术,旨在系统性的学习和备忘. 1.在 JScript 中 null 和 undefined 的主要区别是 null 的操作象数字 0,而 undefined 的操作象特殊值NaN ...
随机推荐
- ORM之单表操作
ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的 ...
- js原生图片懒加载 或 js原生图片预加载,html标签自定义属性
使用原声js来实现图片预加载,或图片懒加载,小伙伴们可以根据项目需要来结合vue或者是react来进行修改. 一.什么是图片懒加载或什么是图片预加载 当访问一个页面的时候,先把img元素或是其他元素的 ...
- Spring AOP 知识整理
通过一个多月的 Spring AOP 的学习,掌握了 Spring AOP 的基本概念.AOP 是面向切面的编程(Aspect-Oriented Programming),是基于 OOP(面向对象的编 ...
- 基于verdaccio的npm私有仓库搭建
详见个人博客:https://shengchangwei.github.io/verdaccio/ 一.使用npm安装 npm install --global verdaccio 二.cmd 启动 ...
- android 9.0 Launcher3 去掉抽屉式,显示所有 app
效果图 修改思路 1.增加全局控制变量 sys.launcher3.is_full_app,用来动态切换 2.增加两套布局,对应有抽屉和无抽屉 3.去除 allAppsButton 4.将 AllAp ...
- Dijkstra算法 笔记与思路整理
该文章可能存在硬伤与不妥,不能作为教程阅读.(因为我真的鶸 Dij作为单源最短路算法,需要先确定一个起点.Dij的函数主体为维护每个节点的dis和vis两个变量.dis表示该点距离起点的最短路权值和, ...
- MVC5异步提交表单疑难杂症
//此处必须添加,不然不能执行异步回调OnAddPortSuccess方法 <script src="~/scripts/jquery.unobtrusive-ajax.min.js& ...
- TensorFlow如何提高GPU训练效率和利用率
前言 首先,如果你现在已经很熟悉tf.data+estimator了,可以把文章x掉了╮( ̄▽ ̄””)╭ 但是!如果现在还是在进行session.run(..)的话!尤其是苦恼于GPU显存都塞满了利用 ...
- python私有变量的分类
- Docker变量的相关总结
一.AVG与ENV 1.在Dockerfile中,使用ARG与ENV的区别 ARG:ARG定义的变量用于构建Docker镜像,在通过build把Dockerfile构建成镜像后,ARG定义的变量便不在 ...