首页 文章 精选 留言 我的

精选列表

搜索[javascript库],共10000篇文章
优秀的个人博客,低调大师

javascript 几种常用继承方法和优缺点分析

1.原型链继承(最简单) 核心 (实现思路):用父类的实例充当子类原型对象 function Person(name) { this.name = name; this.fav = ['basketball', 'football']; this.detail = {country : '中国', city : '江苏'} } function Man(name) { this.say = function(){console.log('I am man')}; } Man.prototype = new Person(); //核心 var sam = new Man('sam'); console.log(sam.fav); //'basketball', 'football' 优点 1.简单,容易理解,容易实现 缺点: 1.创建子类实例时无法向父类传参(创建Man时无法传递name信息) 2.引用类型的属性(数组和对象),被所有实例共享,接着上面的代码举个例子 var tyler = new Man('tyler'); tyler.fav.push('badminton'); tyler.rela.area = '建业区' //修改tyler实例的信息,间接地修改了sam实例的属性 console.log(sam.fav) // "basketball", "football", "badminton" console.log(sam.rela) // {country:'中国',city:'江苏',area:'建邺区'} 2.借用构造函数(经典继承) 为了解决原型链继承的两个问题,所以就有了借用构造函数的继承方法。 核心 (实现思路):借父类的构造函数,补充子类的构造函数,相当于把父类的实例属性拷贝一份给子类的实例 function Person(name) { this.name = name; this.fav = ['basketball', 'football']; this.say = function(){console.log('I love china')} } function Man(name) { Person.call(this, name); //核心 } var sam = new Man('sam'); var tyler = new Man('tyler'); tyler.fav.push('badminton'); console.log(sam.name); //sam console.log(tyler.name); //tyler console.log(sam.fav); //'basketball', 'football' console.log(tyler.fav); //'basketball', 'football', 'badminton' console.log(sam.say == tyler.say) //false 优点: 1.解决了原型链继承中 实例共享引用类型属性的问题 2.修改了原型链继承中 子类构建无法向父类传递参数的问题 缺点: 1.代码的最后一行显示两个子类实例中的方法并非同一个,即无法实现函数复用,如果实例多的情况下影响性能 3.组合继承(常用) 原型链继承和借用构造函数继承的组合 核心 (实现思路):把实例函数都放在父类的原型对象上面,实现函数复用,同时保留借用构造函数的实现思路。 function Person(name) { this.name = name; this.fav = ['basketball', 'football']; } Person.prototype.say = function(){console.log('I love china')} function Man(name) { Person.call(this, name); //核心 } Man.prototype = new Person(); var sam = new Man('sam'); var tyler = new Man('tyler'); tyler.fav.push('badminton'); console.log(sam.name); //sam console.log(sam.fav); //'basketball', 'football' console.log(sam.say == tyler.say) //true 优点: 1.没有实例共享引用类型的属性的问题 2.子类构造实例时可以通过父类传递参数 3.实现了函数复用 缺点: 1.唯一缺点就是创建一个子类实例时,会调用两次父构造函数,从上面的代码中sam 和Man.prototype 中都包含 fav属性 4.寄生组合式继承(最佳) 为了解决组合继承中的不足,计生组合式继承应运而出了 核心 (实现思路):使用壳函数切掉了原型对象上多余的父类属性 //代码1 function Person(name) { this.name = name; this.fav = ['basketball', 'football']; } Person.prototype.say = function(){console.log('I love china')} function Man(name) { Person.call(this, name); } //关键三步代码 var F = function () {}; F.prototype = Person.prototype; Man.prototype = new F(); var sam = new Man('sam'); console.log(sam.name); //代码2 :对继承的关键三部进行封装 function Person(name) { this.name = name; this.fav = ['basketball', 'football']; } Person.prototype.say = function(){console.log('I love china')} function Man(name) { Person.call(this, name); } function create(o) { function F(){}; F.prototype = o; return new F(); } function inheritFunc(child, parent) { var newPrototype = create(parent.prototype); //如果没有下面一行代码,sam.constructor会变称Person 而不是Man newPrototype.constructor = child; child.prototype = newPrototype; } var sam = new Man('sam'); console.log(sam.name); 优点: 没有任何缺点就是优点(如果使用麻烦不算缺点的话) 缺点: 理解起来比较绕,使用比较麻烦

优秀的个人博客,低调大师

30 行 Javascript 代码搞定智能家居系统

本文首发于『阿里云 IoT 开发者社区』,更多精彩物联网内容欢迎前往浏览。 智能家居可谓是今年物联网的热门领域,通过智能单品和智能音箱,人们已然把『智能』两个字变成了生活的理所应当。搭建云上之家除了买买买,还能 DIY。依托阿里云物联网平台,我们用 30 行代码来搞定一套智能家居解决方案。 常见的智能家居解决方案包括了设备端、上云、应用端三大部分,更广的还涉及大数据及人工智能。传统的物联网开发非常强调流程性,即设备端、云、应用端三个步骤需要依次进行。而今天,依托于阿里云物联网平台的『物模型』基础,物联网开发的两端可以齐头并进,节省大量的人力物力成本。 齐头并进显然很诱人,但是能否再更进一步,一人 Handle 全部开发呢?答案是 YES! 目前,有大量互联网开发者由于缺乏嵌入式开发能力,如C/C++语言基础,止步于物联网蓝海的大门。通过阿

优秀的个人博客,低调大师

JavaScript执行环境及作用域链实例分析

1、执行环境: 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。 执行环境包括全局执行环境和函数执行环境。 全局执行环境是最外围的一个执行环境,在浏览器中,全局执行环境被认为是是window对象,所有全局变量和属性都是作为window对象的属性和方法创建的。 函数执行环境是指函数的执行环境,当执行流进入一个函数时,函数的环境会被推入一个环境栈中,在函数执行之后,栈将其环境弹出,将控制权返回到之前的执行环境。 2、作用域链: 当代码在一个环境中执行时,会创建变量对象的一个作用域链。 作用域链的用途:保证对执行环境有权访问的所有变量和函数的有序访问。 作用域链的前端,始终是当前执行的代码所在环境的变量对象,若此环境是函数,则将其活动对象作为变量对象。活动对象最开始时只包含一个变量,即arguments对象(该对象在全局环境中是不存在的),作用域链的下一个对象来自包含环境,再下一个变量则来自下一个包含环境,这样一直延续到全局执行环境。全局执行环境的变量对象始终是作用域链的最后一个对象。 每个环境都可以向上搜索作用域链,以查询变量和函数名,终点就是搜索到全局执行环境,但是任何环境不能通过向下搜索作用域链而进入另一个执行环境。内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境的任何变量和函数。 3、延长作用域链: 虽然执行环境只有两种:全局执行环境和函数执行环境,但是可以有方法延长作用域链,因为有些语句可以在作用域链的前端临时增加一个变量对象,该变量对象会在代码执行后被移除。 当执行流进入下列语句时,作用域链会延长: (1)try-catch语句的catch块:catch语句会创建一个新的变量对象,其中包含的是被抛出的错误对象的声明,该变量对象只在catch块内部有效,在catch块外部无法访问到。 (2)with语句:with语句会将指定的对象添加到作用域链中。 eg1: function setUrl(){ var parameter="?name=Alice"; var url = href + parameter; return url; } var result = setUrl(); alert(result);//报错:href is no defined eg2: function setUrl(){ var parameter="?name=Alice"; with(location) { var url = href + parameter; } return url; } var result = setUrl(); alert(result);//http://localhost/text.html?name=Alice 前端全栈学习交流圈:866109386 面向1-3经验年前端开发人员 帮助突破技术瓶颈,提升思维能力 with语句接收的是location对象,因此其变量对象中包含了location对象的所有属性和方法,location对象被添加到了作用域链的前端。 eg3: var obj = {href : "http://www.baidu.com"}; var href = "http://www.sina.cn"; function setUrl(){ var parameter="?name=Alice"; with(obj) { href = "http://www.google.cn"; var url = href + parameter; } return url; } var result = setUrl(); alert(result);//http://www.google.cn?name=Alice alert(href);//http://www.sina.cn with语句中并没有更改变量href的值,而是更改了obj对象的 href 属性。 也就是说,with中首先查找的是相关对象的属性,如果没有,才改变变量的值。 eg4: var obj = {}; var href = "http://www.sina.cn"; function setUrl(){ var parameter="?name=Alice"; with(obj) { href = "http://www.google.cn"; var url = href + parameter; } return url; } var result = setUrl(); alert(result);//http://www.google.cn?name=Alice alert(href);//http://www.google.cn 去掉obj对象的 href 属性后,才更改变量href的值。

优秀的个人博客,低调大师

JavaScript—数组reduce()方法详解及高级技巧(18)

基本概念reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值。reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(或者上一次回调函数的返回值),当前元素值,当前索引,调用 reduce 的数组。 语法: arr.reduce(callback,[initialValue]) callback (执行数组中每个值的函数,包含四个参数) previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))currentValue (数组中当前被处理的元素)index (当前元素在数组中的索引)array (调用 reduce 的数组)initialValue (作为第一次调用 callback 的第一个参数。) 简单应用 例1: var items = [10, 120, 1000]; // our reducer function var reducer = function add(sumSoFar, item) { return sumSoFar + item; }; // do the job var total = items.reduce(reducer, 0); console.log(total); // 1130 可以看出,reduce函数根据初始值0,不断的进行叠加,完成最简单的总和的实现。 reduce函数的返回结果类型和传入的初始值相同,上个实例中初始值为number类型,同理,初始值也可为object类型。 例2: var items = [10, 120, 1000]; // our reducer function var reducer = function add(sumSoFar, item) { sumSoFar.sum = sumSoFar.sum + item; return sumSoFar; }; // do the job var total = items.reduce(reducer, {sum: 0}); console.log(total); // {sum:1130} 进阶应用使用reduce方法可以完成多维度的数据叠加。如上例中的初始值{sum: 0},这仅仅是一个维度的操作,如果涉及到了多个属性的叠加,如{sum: 0,totalInEuros: 0,totalInYen: 0},则需要相应的逻辑进行处理。 在下面的方法中,采用分而治之的方法,即将reduce函数第一个参数callback封装为一个数组,由数组中的每一个函数单独进行叠加并完成reduce操作。所有的一切通过一个manager函数来管理流程和传递初始参数。 var manageReducers = function(reducers) { return function(state, item) { return Object.keys(reducers).reduce( function(nextState, key) { reducers[key](state, item); return state; }, {} ); } }; 上面就是manager函数的实现,它需要reducers对象作为参数,并返回一个callback类型的函数,作为reduce的第一个参数。在该函数内部,则执行多维的叠加工作(Object.keys())。 通过这种分治的思想,可以完成目标对象多个属性的同时叠加,完整代码如下: var reducers = { totalInEuros : function(state, item) { return state.euros += item.price * 0.897424392; }, totalInYen : function(state, item) { return state.yens += item.price * 113.852; } }; var manageReducers = function(reducers) { return function(state, item) { return Object.keys(reducers).reduce( function(nextState, key) { reducers[key](state, item); return state; }, {} ); } }; var bigTotalPriceReducer = manageReducers(reducers); var initialState = {euros:0, yens: 0}; var items = [{price: 10}, {price: 120}, {price: 1000}]; var totals = items.reduce(bigTotalPriceReducer, initialState); console.log(totals); 在来一个例子:某同学的期末成绩如下表示 var result = [ { subject: 'math', score: 88 }, { subject: 'chinese', score: 95 }, { subject: 'english', score: 80 } ]; 如何求该同学的总成绩? var sum = result.reduce(function(prev, cur) { return cur.score + prev; }, 0); 假设该同学因为违纪被处罚在总成绩总扣10分,只需要将初始值设置为-10即可。 var sum = result.reduce(function(prev, cur) { return cur.score + prev; }, -10); 我们来给这个例子增加一点难度。假如该同学的总成绩中,各科所占的比重不同,分别为50%,30%,20%,我们应该如何求出最终的权重结果呢? 解决方案如下: var dis = { math: 0.5, chinese: 0.3, english: 0.2 } var sum = result.reduce(function(prev, cur) { return cur.score + prev; }, -10); var qsum = result.reduce(function(prev, cur) { return cur.score * dis[cur.subject] + pre; }, 0) console.log(sum, qsum); 再看一个例子,如何知道一串字符串中每个字母出现的次数? var arrString = 'abcdaabc'; arrString.split('').reduce(function(res, cur) { res[cur] ? res[cur] ++ : res[cur] = 1 return res; }, {}) 由于可以通过第二参数设置叠加结果的类型初始值,因此这个时候reduce就不再仅仅只是做一个加法了,我们可以灵活的运用它来进行各种各样的类型转换,比如将数组按照一定规则转换为对象,也可以将一种形式的数组转换为另一种形式的数组,大家可以动手去尝试一样。 [1, 2].reduce(function(res, cur) { res.push(cur + 1); return res; }, []) koa的源码中,有一个only模块,整个模块就一个简单的返回reduce方法操作的对象: var only = function(obj, keys){ obj = obj || {}; if ('string' == typeof keys) keys = keys.split(/ +/); return keys.reduce(function(ret, key){ if (null == obj[key]) return ret; ret[key] = obj[key]; return ret; }, {}); }; 通过对reduce概念的理解,这个模块主要是想新建并返回一个obj对象中存在的keys的object对象。 var a = { env : 'development', proxy : false, subdomainOffset : 2 } only(a,['env','proxy']) // {env:'development',proxy : false} 这里推荐一下我的前端学习交流群:731771211,里面都是学习前端的,群里会不定期更新最新的教程和学习方法,有想学习web前端的,或是转行,或是大学生,还有工作中想提升自己能力的web前端党欢迎加入。 加入

优秀的个人博客,低调大师

聊聊JavaScript和Scala的表达式 Expression

先看下这段神奇的Java代码: public static void main(String[] args) throws Exception { doSomethingMagic(); System.out.printf("2 + 2 = %d", 2 + 2); } 执行结果:2 + 2 = 5 那么doSomethingMagic到底做了什么神奇的事情呢?先看代码: private static void doSomethingMagic() throws Exception { Class cache = Integer.class.getDeclaredClasses()[0]; Field c = cache.getDeclaredField("cache"); c.setAccessible(true); Integer[] array = (Integer[]) c.get(cache); array[132] = array[133]; } 所以这个例子其实包含了Java中整型类型Integer的一个知识点。 可能有的朋友对于doSomethingMagic里面的代码有点摸不着头脑,让我们先查看上图第17行 2 + 2反编译出来的代码: 编辑器将2+ 2的值先计算出来,等于4。最后System.out.println打印出来的值,实际上是Integer.valueOf(4)的返回值。 那么我们就查看JDK里Integer.valueOf的实现: 上面的实现代码,从830行到832行,逻辑非常清楚:如果valueOf的参数i在IntegerCache.low和IntegerCache.high之间,即[-128, 127]的闭区间,则直接从IntegerCache这个缓存区域里返回。只有当输入参数i不在[-128,127]区间内,才执行代码832,基于输入参数i创建一个新的Integer实例。 带着这个理念,我们再看doSomethingMagic就清楚多了。这个方法通过Java反射将上图IntegerCache的成员cache设置成可访问:setAccessible(true), 然后将IntegerCache的第132个元素的值用第133个元素的值覆盖。 我们从Eclipse调试器里发现,Integer cache里第132个元素的值为4,第133个元素的值为5。本来Integer.valueOf方法,对于输入4,从Integer cache里返回第132个元素的值,即4。现在这个元素的值被第133个元素即5覆盖了,所以最后得到了 2 + 2 = 5。 用一句话概括这个场景: 2 + 2 = 4 = Integer.valueOf(4) = 5 ( 因为4在Integer cache里对应的记录已经被我们的代码显式替换成了5)。 要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

优秀的个人博客,低调大师

JavaScript 获取 2 天之后的日期代码实例

/** *对Date的扩展,将 Date 转化为指定格式的String *月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符, *年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字) *例子: *(new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423 *(new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18 */ Date.prototype.format = function (fmt) { var o = { "M+": this.getMonth() + 1, //月份 "d+": this.getDate(), //日 "h+": this.getHours(), //小时 "m+": this.getMinutes(), //分 "s+": this.getSeconds(), //秒 "q+": Math.floor((this.getMonth() + 3) / 3), //季度 "S": this.getMilliseconds() //毫秒 }; if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); for (var k in o) if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); return fmt; } var now = new Date(); now.setDate(now.getDate() + 2); var d2 = now.format("yyyy-MM-dd"); d2;

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册