【前端】之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 ...
随机推荐
- C语言存储类别和链接
目录 C语言存储类别和链接 存储类别 存储期 五种存储类别 C语言存储类别和链接 最近详细的复习C语言,看到存储类别的时候总感觉一些概念模糊不清,现在认真的梳理一下.C语言的优势之一能够让程序员恰 ...
- 使用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 ...
- vue学习之插槽
插槽 插槽(Slot)是Vue提出来的一个概念,正如名字一样,插槽用于决定将所携带的内容,插入到指定的某个位置,从而使模板分块,具有模块化的特质和更大的重用性. 个人理解:我感觉插槽就是父组件控制插槽 ...
- CSPS模拟 50
收获很多,良心出题人 T1 施工 研究半天,最后30分暴力走人 考后看了题解,稍神仙这题弃对了...... 要拿30+,必须发现要填的话一定是填一个坑使它底部变平,最终底部高度小于等于两边 为什么是坑 ...
- 使用Typescript重构axios(二十三)——添加withCredentials属性
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- P3052 [USACO12MAR]摩天大楼里的奶牛(迭代加深搜索)
(已经一句话了) 第一反应:暴力 第二反应:朴素算法过不去 第三反应:没法折半暴搜(没法统计答案) 所以,歪歪了一个类似贪心刷表的方法,过了这道题. 首先,如果爆搜的话会有几个状态: 当前牛 当前几个 ...
- [UWP]为番茄钟应用设计一个平平无奇的状态按钮
1. 为什么需要设计一个状态按钮 OnePomodoro应用里有个按钮用来控制计时器的启动/停止,本来这应该是一个包含"已启动"和"已停止"两种状态的按钮,但我 ...
- vue实现tab选项卡切换效果
tab选项卡切换效果: 通过点击事件传入参数,然后通过v-show来进行切换显示 <template> <div class="box"> <div ...
- Python-webbrowser实现自动打开关、定时打开关闭网页/刷新网页
webbrowser- 方便的Web浏览器控制器,是Python一个模块,可实现自动打开关.定时打开关闭网页/刷新网页,在Unix下,图形浏览器在X11下更受欢迎,但如果图形浏览器不可用或X11显示器 ...
- 【Go 入门学习】第一篇关于 Go 的博客--Go 爬虫初体验
一.写在前面 其实早就该写这一篇博客了,为什么一直没有写呢?还不是因为忙不过来(实际上只是因为太懒了).不过好了,现在终于要开始写这一篇博客了.在看这篇博客之前,可能需要你对 Go 这门语言有些基本的 ...