
javascript
我就是陈星烨
前端开发
展开
-
控制promise并行执行的个数
控制promise并行执行的数量原创 2022-10-04 12:24:01 · 390 阅读 · 1 评论 -
promise polyfill解析
https://github.com/taylorhakes/promise-polyfillPromise构造器function Promise(fn) { if (!(this instanceof Promise)) throw new TypeError('Promises must be constructed via new'); if (typeof fn !==...原创 2019-12-02 17:38:44 · 2023 阅读 · 0 评论 -
commonjs和ES6及requirejs模块循环引用
Commonjs模块循环引用commonjs是同步模块加载方式,因此其加载完成后才能执行下面的动作,require第一次加载完该脚本,就会在内存中生成一个对象,类似以:{ id: '...', exports: { ... }, loaded: true, ...}接着运行脚本,从别处引用此模块时,可以引用其exports出来的内容。当模块第二次引用时不会去重复加载,而是执行上次缓原创 2017-08-24 20:20:30 · 1688 阅读 · 0 评论 -
JavaScript选择文本方法
鼠标手动选择文本后显示1. 选择表单文本selectionStart,selectionEnd<textarea name="textarea" id="text" cols="30" rows="10"></textarea>text.onselect = function(){ var s = this.value.substring(this.selectionStart,this.s原创 2017-09-03 16:36:19 · 5562 阅读 · 0 评论 -
javascript声明提升案列
var定义的变量会提升 if(!(a in window)){ var a = 1; console.log('haha') } console.log(a);以上代码只会输出undefined,不会输出haha,因为JavaScript在解析时会首先将当前作用域中的 变量进行扫描,建立作用域链,变量的初始值都为undefined,因此以上代码相原创 2017-08-29 20:29:28 · 280 阅读 · 0 评论 -
css vs js动画及requestAnimationFrame优化动画
transitiontransition存在的问题:只能设置动画的起始状态,不能设置中间状态必须明确开始状态和结束状态的具体值,不能识别0到auto,none到block,background中URL的变化必须触发才执行,且只执行1此IE10以上已经不需要ms前缀对某些参数不起作用,如index.trans { transition: all 0.3s ease;}.tran原创 2017-06-20 17:24:07 · 1193 阅读 · 0 评论 -
外部资源编码设置
css文件 若css文件的编码格式为GBK(因为有汉字),则未显式声明css文件编码时将其引入UTF-8编码的HTML文件时会造成无法解析的问题,因为GBK中1个汉字占2个字节,而UTF-8中1个汉字占3个字节。解决方法:1.在http响应头中设置文件编码格式Content-Type:text/css;charset="GB2312"2.在css文件开头设置其编码格式@charset:"GB2原创 2017-06-28 10:49:44 · 447 阅读 · 0 评论 -
JavaScript substr,substring,slice,splice
str.substr(startIndex,length)从startIndex开始取length个字符若startIndex为负值,相当于str.length+startIndex若startIndex为负值且Math.abs(startIndex)>str.length,则默认将startIndex设为0省略length则返回从startIndex到字符串末尾length为0或者负值则原创 2017-09-06 20:48:17 · 243 阅读 · 0 评论 -
异步API Fetch
window.fetchfetch被定义在window对象上,用于请求远程资源,返回Promise对象检测请求结果,以下示例是请求图片: var URL = 'http://*******'; fetch(URL).then(function(response) { return response.json(); }).then(function(json) {原创 2017-09-07 16:03:02 · 339 阅读 · 0 评论 -
前端路由实现原理
场景 分别点击顶部的”推荐”、”书城”、”书架”进而在顶部下面展示不同的页面。点击其中1个隐藏其他页面。实现原理 点击a标签对应的”推荐”、”书城”、”书架”,改变hash值后,监听onpopstate事件,进而进行不同的操作。代码实现1. 利用H5router实现整个路由系统。function H5router() { this.routers = {}; this.i原创 2017-09-14 16:10:12 · 529 阅读 · 0 评论 -
前端跨域策略
假设页面http://www.example.com/a.html和http://www.example.com/b.html属于不同域,a页面请求b页面的内容.document.domain利用document.domain实现跨域的前提是这两个域名必须属于同一个基础域名,协议端口都要一致。如aaa.com下的网页a.html通过iframe引用bbb.com下的网页b.html,这时a.htm原创 2017-06-19 11:17:22 · 439 阅读 · 0 评论 -
前端模块化方案requireJs和seaJs
AMD-requirejsAMD是异步模块定义,典型实现requirejs,只要在define或者全局require中引用了某个模块,则此模块就已经被下载且用script标签包裹并添加到页面head中,且利用关键词async和页面并行加载,当页面DOM树构建完成后,且模块加载完成后,按序执行模块内容,当所有模块都加载完成后,执行回调函数,回调函数不会阻塞页面其他部分的执行。关键:依赖前置DOM树原创 2017-08-24 19:43:22 · 306 阅读 · 0 评论 -
JavaScript数组去重
1. Set及解构…var arr = [1,1,2,2,3,4,4];var set = new Set(arr); //Set(4) {1, 2, 3, "a"}var newArr = [...set];//(4) [1, 2, 3, 4]({}).toString.call(set); //"[object Set]"2. filterarr.filter(function(value,原创 2017-08-12 20:13:21 · 219 阅读 · 0 评论 -
reduce实现串行promise
async function runPromiseByQueue(myPromises) { return await myPromises.reduce((previousPromise, nextPromise) => { return previousPromise.then(id => { console.log(id); return ne...原创 2019-06-05 11:37:58 · 2038 阅读 · 1 评论 -
通过JavaScript实现刮刮乐学习canvas的globalCompositionOperation
HTML部分通过canvas实现刮刮乐上面的图层。<div class="container"> <div class="charactor cover">12345</div> <div class="cover"> <canvas id="canvas"&a原创 2018-03-09 11:35:18 · 1146 阅读 · 0 评论 -
JavaScript原型和继承
原型prototype 每个函数中都有一个叫prototype的属性,prototype指向函数的原型对象,每个原型对象都有一个constructor属性,包含原型对象所在函数的指针。原型链 每个构造函数都包含一个原型对象,(每个原型对象都包含一个指向构造函数的指针),每个实例都包含指向原型对象的指针,若让原型对象等于另一个类型的实例,则原型对象将包含一个指向另一个原型的原创 2017-06-25 10:37:23 · 534 阅读 · 0 评论 -
JavaScript创建对象过程及__proto__和prototype区别
js只有函数对象具备类的概念,要创建对象,必须使用函数对象,函数对象内部的[[constructor]]用于构造对象,[[call]]用于调用对象。 1. var obj = new Object()使用内置的Object函数实例化对象。 2. var obj = {}或者var obj = []使用js引擎触发Object和Array的构造过程。 3. function fn() {};v原创 2017-08-29 10:10:59 · 427 阅读 · 0 评论 -
webWorker
通过webworker可在浏览器后台运行JavaScript,而不占用浏览器自身线程,一般JavaScript和页面UI共用一个线程,webworker相当于在后台启动一个线程 webworker无法访问DOM节点 无法访问全局变量或者函数 不能调用alert之类的函数, 不支持跨域(可用ajax的跨域,setRequestHeader(‘access-control-a原创 2017-07-07 15:55:37 · 355 阅读 · 0 评论 -
createElement和createDocumentFragment区别
用法举例createElementvar createElementEg = document.createELement('div');// 添加元素方法1:innerHTMLcreateElementEg .innerHTML = '<span>this is createELement eg</span>';var ele = document.getElementById('test'原创 2017-07-27 16:14:22 · 8574 阅读 · 4 评论 -
重写bind方法
var that = null;Function.prototype.bind = function(obj,arg){ if (that == null){ that = this } return function(){ return that.call(obj,arg); }};function foo() { ret原创 2017-09-19 21:09:09 · 885 阅读 · 0 评论 -
JS判断类型及强制类型转换
1.判断整数es6的Number.isInteger:Number.isInteger(4); //trueNumber.isInteger(4.00); //trueNumber.isInteger(4.1); //fasle或者时polyfill:function isInteger(num){ return typeof num === 'number原创 2017-07-29 10:54:52 · 1745 阅读 · 0 评论 -
JS重写函数valueOf方法实现连续调用求和
对象转原始值先toString再valueOfvar obj = { toString: function() { console.log('调用了 obj.toString'); return {}; }, valueOf: function() { console.log('调用了 obj.valueOf')原创 2017-08-15 09:31:59 · 2206 阅读 · 0 评论 -
JavaScript表单总结
提交表单3种实现方式:<input type="button" value="submit" name="submit"><button type="submit">submit form</button><input type="image" src="a.jpg">只要表单存在以上任何一种按钮且获得焦点时都可以通过回车提交表单,(textarea会换行),即触发submit事件,可在其中验原创 2017-07-31 16:17:50 · 374 阅读 · 0 评论 -
Math.prototype.concat详解及二维数组扁平化方法
当concat的参数不为数组时var arr1 = ['a', 'b', 'c'];var arr2 = arr1.concat([1,2],4,5);//这里[1,2],4,5不是数组console.log(arr2);//(7) ["a", "b", "c", 1, 2, 4, 5]当concat参数不为数组时,如上面的[1,2],4,5,则会将[1,2],4,5里面的参数全部拆开添加到新数原创 2017-08-31 10:20:38 · 1625 阅读 · 0 评论 -
Promise+ajax && async+await+promise+ajax
Peomise+Ajax//创建XHR对象function creatXHR() { var xhr; if(window.XMLHttpRequest){ xhr = new window.XMLHttpRequest(); }else if(window.ActiveXObject('MicrosoftXMLHTTP')){原创 2017-07-08 17:09:44 · 734 阅读 · 0 评论 -
判断元素之间的包含关系contains和compareDocumentPosition详解
containsdocument.documentElement.contains(document.body); //truecompareDocumentPositiona.compareDocumentPosition(b)返回数字,含义如下:0 : a===b1 : 不包含,不属于同一个文档2 : a位于b之后4 : a位于b之前8 : b包含a16:a原创 2017-07-17 17:12:42 · 1662 阅读 · 0 评论 -
数据类型及其存储位置
基本数据类型 存储在栈中: string, number,Boolean,null,undefined。 原始数据类型是存储在栈中的简单数据段,占据空间小大小固定,属于频繁被使用数据,引用数据类型 存储在堆中:存储 对象,数组,函数。 引用数据类型是存储在堆中的对象,占据空间大,大小不固定,如果存储在栈中将影响程序运行的性能。 引用数据类型在栈中存储了指针,该原创 2017-07-07 16:04:50 · 1116 阅读 · 0 评论 -
递归优化
1.使用尾递归function Fibonacci(n,a,b) { if(n == 0){ return a; }else { return Fibonacci(n-1,b,a+b); }}console.log(Fibonacci(5,0,1));2.使用函数缓存 将调用的结果添加到函数内部的obj对象上,下次计算时直接取。3.方原创 2017-07-07 15:59:10 · 228 阅读 · 0 评论 -
Canvas 与 SVG 的比较
SVGSVG 是一种使用 XML 描述 2D 图形的语言可以为某个元素附加 JavaScript 事件处理器每个被绘制的图形均被视为对象如果 SVG 对象的属性发生变化,那么浏览器能够自动重现图形CanvasCanvas 通过 JavaScript 来绘制 2D 图形。Canvas 是逐像素进行渲染的。在 canvas 中,一旦图形被绘制完成,它就不会继续得到浏览器的关注。如果其位置转载 2017-06-26 15:51:08 · 1080 阅读 · 0 评论 -
判断元素是否在屏幕中
ele.getBoundingClientRect()此方法返回一个getClientRect集合,包含元素距离DOM可见视口top,left,bottom,right属性及width和height属性。 注意这里的bottom指的是元素最下面距离视口顶部的距离。判断页面是否出现滚动条function isScrollY() { return document.documentElemen原创 2017-07-14 11:42:48 · 2350 阅读 · 0 评论 -
对象深拷贝
实现:function copy(obj) {//如果包含数组,返回数组。 if (obj.constructor === Array) { return obj.slice(0); } //如果是obj对象,需要复制对象的描述器。 var names = Object.getOwnPropertyNames(obj); var descript原创 2017-07-04 15:14:24 · 325 阅读 · 0 评论 -
创建对象的模式
1. 工厂模式function creatP(name,age){ var o = new Object(); o.name = name; o.age = age; o.sayName = function{ alert(this.name); }; return o;}var p1 = creatP('hulala',12);2原创 2017-06-25 10:37:43 · 324 阅读 · 0 评论 -
不借助临时变量实现变量交换
原文地址ES6结构var [a,b] = [1,2];[b,a] = [a,b];异或var a = 1, // 二进制:0001 b = 2; // 二进制:0010 a = a ^ b; // 计算结果:a = 0011, b = 0010 b = a ^ b; // 计算结果:a = 0011, b = 0001 a = a ^ b; // 计算结果:a = 0010, b = 00转载 2017-06-24 11:04:59 · 263 阅读 · 0 评论 -
webpack对比requirejs
webpack的优势支持resolve设置搜索路径,比如设置找不到文件时应该向上面哪个路径找可使用import/export语法require可拼接,var r=require;r('./file')支持require中的表达式,require('file'+template)原创 2017-07-11 19:01:41 · 2058 阅读 · 0 评论 -
正则方法exec和test,String方法match,replace
testreg.test(str)execreg.exec(str);举例:var reg = /(\w+)@(\w+)\.(\w+)/g;var string = "Please send mail to george@contoso.com and someone@example.com. Thanks!";var result = reg.exec(string);则result返回Arr原创 2017-06-22 19:12:03 · 531 阅读 · 0 评论 -
DOM方法
根据选择符选择querySelector();//返回匹配到的第一个元素querySelectorAll();//返回nodeListdocument.querySelectorAll('p strong');document.body.matchesSelector('body.page1');//返回元素是否匹配选择符元素遍历由于下列方法都会返回包含文本节点或者换行符的值: var b原创 2017-07-17 21:08:23 · 267 阅读 · 0 评论 -
js实现textarea自适应高度
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <style type="text/css"> #t{ outline:none; border:thin solid rgba(82, 168,原创 2017-07-31 16:18:36 · 1516 阅读 · 0 评论 -
JavaScript对象和方法算术运算或输出之valueOf和toString优先级
对象转原始值先toString再valueOfvar obj = { toString: function() { console.log('调用了 obj.toString'); return {}; }, valueOf: function() { console.log('调用了 obj.valueOf')原创 2017-08-25 15:34:41 · 1361 阅读 · 0 评论 -
ajax创建及参数、优缺点分析
1. 新建XMLHttpRequest对象function createXHR(){ if(typeof window.XMLhttpRequest != undefined){ return new window.XMLHttpRequest(); }else if(window.ActiveXOject != undefined){原创 2017-06-26 11:24:49 · 328 阅读 · 0 评论 -
JavaScript 数组方法之 copyWithin
copyWithin数组实例的copyWithin方法,在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组。也就是说,使用这个方法,会修改当前数组。[javascript] view plain copyArray.prototype.copyWithin(target, start = 0, en转载 2017-08-21 20:01:00 · 1396 阅读 · 0 评论