![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
javascript
半点寒12W
分享编程知识
展开
-
javascript异步机制 — call stack
代码在运行过程中,会有一个叫做调用栈(call stack)的概念。调用栈是一种栈结构,它用来存储计算机程序执行时其活跃子程序的信息。(比如什么函数正在执行,什么函数正在被这个函数调用等等信息)。调用栈是JS引擎执行程序的一种机制。程序每调用一层函数(方法),引擎就会生成它的栈帧,栈帧里面保存了函数的执行上下文,然后将它压入调用栈。栈是一个后进先出的结构,直到最里层的函数执行完,引擎才开始将最后加入的栈帧从栈中弹出。函数调用会在内存形成一个“调用记录”,又称“调用帧”(call frame),保存调用位置原创 2021-12-14 15:48:15 · 968 阅读 · 1 评论 -
javascript调试
程序调试是我们在开发经常要做的事情,没有调试工具是很难去编写 JavaScript 程序的,你的代码可能包含语法错误,逻辑错误,如果没有调试工具,这些错误比较难于发现。在javascript中主要有以下这几种调试方法。console.log()这是一种静态的调试方法,可以在控制台上输出相应的数值,可以给我们看到相应的数值变化。断点调试断点调试是一种动态的调试方法,在复杂的bug面前,这是一种很高效的方法。下面我们假设存在一个累加的bug,然后通过这两种方法来调试bug: 从1累加到10,发现输出原创 2021-12-14 15:16:16 · 655 阅读 · 0 评论 -
javascript的错误处理
try/catch/finally 语句try/catch/finally语句作为javascript的一种处理异常的方式,基本语法如下代码所示:try{ //可能出错的地方 console.log(a);}catch(error){ //打印错误信息 console.log(error);}finally{ //无论是否出错都会执行的代码 console.log("finally");}错误类型● Error● InternalError原创 2021-12-14 14:19:10 · 481 阅读 · 0 评论 -
本地存储localStorage和sessionStorage
localStorage和sessionStorage一样都是用来存储客户端临时信息的对象他们均只能存储字符串类型的对象(虽然规范中可以存储其他原生类型的对象,但是目前为止没有浏览器对其进行实现)。localStorage生命周期是永久,这意味着除非用户显示在浏览器提供的UI上清除localStorage信息,否则这些信息将永远存在。sessionStorage生命周期为当前窗口或标签页,一旦窗口或标签页被永久关闭了,那么所有通过sessionStorage存储的数据也就被清空了。不同浏览器无法共享原创 2021-12-12 16:56:42 · 214 阅读 · 0 评论 -
affset、client、scroll
offsetoffsetWidth offsetHeightoffsetWidth 元素控件自身的宽度。不包括overflow未显示的部分。offsetHeight 元素控件自身的高度。offsetLeft offsetTopoffsetTop: 指元素距离最近的(带有定位的)父元素的顶部的距离,如果没有定位则为距离根元素(在标准兼容模式下为html元素;在怪异呈现模式下为body元素)顶部的距离。offsetLeft :指元素距离最近的(带有定位的)父元素的左侧的距离,如果没有定位则为距离根元原创 2021-12-12 16:44:45 · 180 阅读 · 0 评论 -
javascript中的事件
在文档、浏览器、标签元素等元素在特定状态下触发的行为即为事件,比如用户的单击行为、表单内容的改变行为即为事件,我们可以为不同的事件定义处理程序。JS使用异步事件驱动的形式管理事件。绑定事件的方法html绑定<button onclick="alert(`houdunren.com`)">点击</button>DOM绑定<div id="app">hello js</div><script> const app = document原创 2021-12-12 16:28:56 · 191 阅读 · 0 评论 -
BOM(浏览器对象模型)
BOM对象包含的内容window javascript层级的顶层对象,表示浏览器窗口Navigator 包含客服端浏览器的信息History 包含了浏览器窗口访问过的URLLocation 包含当前的URL信息Screen 包含客服端显示屏的信息window对象属性属性说明closed返回窗口是否已被关闭。defaultStatus设置或返回窗口状态栏中的默认文本。 (仅 Opera 支持)document对 Document 对象的只读引用。 请参阅 D原创 2021-12-11 22:29:37 · 83 阅读 · 0 评论 -
节点对象管理
javascrip操作的内容称为节点对象 Node ,包含12中类型的节点对象,常用的节点为document,标签元素节点,注释节点。节点均继承Node类型,所以有相同的属性和方法。document为DOM操作的起始节点。在浏览器渲染的过程中回将文档内容生成为不同的对象,不同的节点由专有的构造函数创建对象,下面时节点的原型链:原型说明Object根对象,提供hasOwnProperty等基本对象操作支持EventTarget提供addEventListener、remove原创 2021-12-11 16:51:08 · 249 阅读 · 0 评论 -
异步任务管理终极方案(async await)
回调函数管理异步任务,会造成难以看懂和维护的回调地狱。使用promise可以解决回调地狱问题,但是还是不过简洁和优雅。所以出现了async,await结合的方案,使异步编程看起来几乎跟同步编程一样,跟利于代码的维护。废话少说,直接上代码。function s1(){ return new Promise((resolve,reject) => { setTimeout(() => { var a = 1; console.原创 2021-12-09 22:32:52 · 525 阅读 · 0 评论 -
promise实现异步任务管理
Promise是一个构造函数,我们可以通过new 创建一个promise对象。var p = new Promise((resolve,resject) =>{});console.log(p);输出:Promise {<pending>}[[Prototype]]: Promisecatch: ƒ catch()constructor: ƒ Promise()finally: ƒ finally()then: ƒ then()Symbol(Symbol.toStringTag):原创 2021-12-09 18:11:31 · 494 阅读 · 0 评论 -
javascript异步编程
javascript语言有一个很大的特点就是单线程,也就是在同一个时间只能处理一个任务。为了协调时间,用户交互,网络处理等行为。防止线程不被阻塞,Event Loop 的方案应用而生。javascript引擎处理任务是在执行任务,等待任务,休眠等新任务中不断循环,这种机制被称为时间循环。javascript中的任务分类同步任务程序一运行就会执行的任务,无需等待异步任务异步任务:不会立即执行的任务(异步任务又分为宏任务与微任务),网络请求,DOM时间,定时器等都是异步任务。微任务的优先级比宏任务的原创 2021-12-09 14:45:33 · 53 阅读 · 0 评论 -
javascript中的类(class)
ES6引入了类(class)这概念,通过class可以定义类。相比之前利用构造函数定义类,class会更为简洁,清晰,更像是一门面向对象语言。class的实现本质上还是利用构造函数和原型链。或者可以说是一种语法糖。实现一个类class Obj{ constructor(name){ this.name = name; this.fun = function () { console.log(this.name); }原创 2021-12-09 13:39:07 · 551 阅读 · 0 评论 -
javascript继承实现的方法
1.原型链继承function SuperType() {this.property = true;}SuperType.prototype.getSuperValue = function() {return this.property;}function subType() {this.property = false;}//继承了SuperTypeSubType.prototype = new SuperType();SubType.prototype.getSubValue原创 2021-12-09 10:10:16 · 70 阅读 · 0 评论 -
原型与原型链
原型每一个对象都有一个原型对象,原型可以理解为对象的父亲,对象从原型继承它的方法和属性。对象有一个__proto__属性指向它的原型。var obj = {};var arr = [];console.dir(obj.__proto__);console.dir(arr.__proto__);输出:Object Array(0)可以看到obj的原型时Object,arr的原型是Array。Object.create使用Object.create()创建对象可以使用现用的对象做为新对原创 2021-12-08 18:04:15 · 66 阅读 · 0 评论 -
代理与反射
代理拦截是对象的访问控制,使用代理拦截的好处。读写属性时代码更简洁对象的多个属性控制统一交给代理完成原创 2021-12-08 16:17:03 · 86 阅读 · 0 评论 -
对象的浅拷贝与深拷贝
javascript中的数据类型分为值类型和引用类型,值类型存储在堆内存,而引用类型主要存储在栈内存。浅拷贝和深拷贝都是对于javascript中的引用类型而言。浅拷贝只复制了对象的引用(地址),而深拷贝是创建一个新的对象来完全复制另一个对象的内容。只有深拷贝才能做到真正的对象拷贝。浅拷贝var obj = {name: "js",age: 18};var copyObj = obj;obj.name = "hello";console.log(obj.name,copyObj.name);输出原创 2021-12-08 14:21:02 · 225 阅读 · 0 评论 -
属性访问器
使用属性访问器的好处用于避免错误的赋值需要动态监测值的改变属性只能在访问器和普通属性任选其一,不能共同存在getter/settergetter方法用于获得属性值,setter方法用于设置属性。我们来看一下具体的应用。var user = { data: { name: 'js', age: null }, set age(value) { if (typeof value != "number" || value > 100 || value < 10) {原创 2021-12-08 12:07:43 · 189 阅读 · 0 评论 -
javascript中的对象
对象是包含属性与方法的数据类型,它是一种引用数据类型。面向对象编程据有以下特征:1.对象是属性和方法的集合即封装2.将复杂的功能隐藏在内部,只对外开发少量方法,更改对象内部复杂的逻辑不会对外部调用造成影响即抽像。3.继承通过代码复用减少冗余代码4.根据不同形态的对象产生不同的结果即多态基本声明与使用var obj = { name: "js", age: 30, fun: function (){ console.log(this.name,this.a原创 2021-12-08 11:25:32 · 57 阅读 · 0 评论 -
var let const声明变量的区别
var和let的区别1.全局环境声明的区别在全局环境中声明变量,var和let的主要区别在于,var声明的变量会成为window的属性或方法,而let则不会。var num1 = 1;let num2 = 2;console.log(window.num1,window.num2);输出:1 undefined2.变量提升使用var 声明变量时变量会提升,let不会。console.log(num);var num = 1;输出:undefined等价于:var num;con原创 2021-12-07 17:09:45 · 2089 阅读 · 0 评论 -
闭包的概念及其应用
闭包概念闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。闭包的用途闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。...原创 2021-12-06 22:57:59 · 307 阅读 · 0 评论 -
改变this指向的三种方法(call、apply、bind)
callcall():第一参数 为改变this指向的对象,后面正常接受其他的参数。var user1 = { name: "hello", age: 18, fun: function(){ console.log(this.name,this.age); }};var user2 = { name: "js", age: 20, fun: function(){ console.log(this.name,th原创 2021-12-05 21:00:28 · 194 阅读 · 0 评论 -
this指向问题
在使用javascript进行编程的时候,我们不可避免地要与this这个关键字打交道。由于this主要起到指代作用,有时候我们会混淆this的具体指向。在大多数的时候this都指向它所在函数的调用者。在全局作用域中this 指向window对象console.log(this);输出:Window {window: Window, self: Window, document: document, name: '', location: Location, …}在全局函数,this指向window原创 2021-12-05 19:52:44 · 241 阅读 · 0 评论 -
javascript中的函数
函数是每一门编程语言必不可少的成分,函数将代码进行了初次的封装,在javascript中函数还有其他语言所不具备的特性,现在让我们来探究一下。函数的声明与定义通过Function构造函数创建函数javascript中函数也是对象,所以可以通过构造函数进行函数的创建。但是这种方法较为繁琐一般不会通过这种方式创建函数。var fun = new Function("title","console.log(title)");fun("hello js");输出:hello js使用标准语法来创建函原创 2021-12-04 20:27:30 · 174 阅读 · 0 评论 -
javascript中的Map数据结构
MapMap是一组键值对的结构,用于解决以往不能用对象做为键的问题。** 声明定义**var map = new Map([["id1",1],["id2",2]]);console.log(map);输出:{'id1' => 1,'id2' => 2}使用set 方法添加元素,支持链式操作var map = new Map();map.set("id1",1).set("id2",2);console.log(map);输出:输出:{'id1' => 1,'id原创 2021-12-02 19:37:14 · 3339 阅读 · 0 评论 -
javascript中的Set数据结构
ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。它具有一下的特点:只能保存值没有键名严格类型检测如字符串数字不等于数值型数字值是唯一的遍历顺序是添加的顺序,方便保存回调函数Set使用 add 添加元素,不允许重复值var set = new Set();set.add(1);set.add(2);console.log(set);set.add(1);console.log(set);输出:{1,2};{1,2}获取元素数量var se原创 2021-12-02 17:45:58 · 665 阅读 · 0 评论 -
javascript中的Symbol数据类型
symbol是es6新出的原始数据类型,symbol主要用于防止属性名冲突而产生的,保证属性名的唯一性。创建一个symbol数据类型var sy = Symbol(); console.log(typeof sy);//输出: Symbol描述参数var sy1 = Symbol("this is a Symbol");var sy2 = Symbol("this is a Symbol");console.log(sy1 == sy2);输出:false从上面可以看出虽然两个sym原创 2021-12-02 15:55:58 · 290 阅读 · 0 评论 -
javascript中的数据类型
javascript跟很多语言相比,它有一个很突出的特点,它是一门弱类型语言。对于变量的声明,它不需要像C,或者java语言那样,要给定类型声明。比如我们定义一个整型变量a,在绝多数的语言都是这样声明的:int a,而在javascript 只需要使用关键字,var 或者let 声明即可:var a,let a。今天,我只要想探讨的是Javascript的数据类型。1.类型检测在Javascript中可以使用typeof 和 instanceof 来检测数据是那种类型。typeofvar test原创 2021-12-02 12:30:16 · 353 阅读 · 0 评论 -
javascript常用的数组API
数组是我们在编程中,使用最为广泛的数据结构,在很多编程语言里面都内置许多对数组进行操作的API,极高的提高编程效率。在这里主要介绍一下JavaScript数组里面常用的API。1.push()压入元素,直接改变原数组,返回值为改变后的数组。var arr = [1,2];arr.push(3);arr.push(4);console.log(arr);//输出:[1,2,3,4]2.pop()从末尾弹出元素,直接改变原数组,返回的值是弹出的元素。var arr = [1,2,3];v原创 2021-12-01 22:02:35 · 348 阅读 · 0 评论