为您找到搜索结果:8593个
聊聊javascript的null和undefined
只要是说到js的变量和数据类型,就脱不开null和undefined,这兄弟俩就是js的重要基础,不可不察,无数的同学们都用过放大镜多角度多批次地研究过这兄弟俩,真是深受欢迎。^-^js也真是怪异,有个null不够,还要折腾出个undefined。虽然被诟病,但这就是设计。 在c#和java中,null就是表示空,没有分配内存。在js中的null采用Number(null)的结果是0,代表什么,代表这不是空,仅仅是空值,是没有值,它的数据类型是"object"。 那么为了表示空,所以设计者搞了一个undefined,它有单独的数据类型就是"undefined"。使用Number(undefined)的结果是NaN,转换结果也能达到设计目的。造成这样的设计结果,表达式中的数据类型转换起了关键作用。 未定义的变量或已定义的但未赋值的变量就表示空,就是undefined。undefined更多的是javascript本身使用。比如,码农要想删除一个对象的属性不是把这个属性赋上undefined,因为这样属性还是在,用hasOwnProperty检测一下这个属性还...
在javascript中获取一个对象内属性的个数
varfoo={a1:'1',a2:'2',a3:'3'};//获得对象所有属性的数组Object.getOwnPropertyNames(foo);>['a1','a2','a3']//获取对象属性的个数Object.getOwnPropertyNames(foo).length;>3getOwnPropertyNames的浏览器支持Feature ChromeFirefox InternetExplorer Opera Safari Basicsupport 5 4.09 12 5 ...
javascript设计模式实践之职责链--具有百叶窗切换图片效果的JQuery插件(三)
在上一篇《javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)》里,通过采用模板方法模式完成了切换效果对象的构建编写。接下来就是完成各效果对象的调用和联动。切换要求:当前图片显示指定时间后执行切换效果并切换下一张图片,最后一个切换后从头开始。按照要求一个效果对象完成后要执行下一个,最后一个完成后要从头开始,看上去就是一个带状态通知的环形列表,类似于这样的特征,可以采用职责链模式来构建。职责链就是由不同的功能处理构成的链表,每一个功能处理作为一个职责,每一个职责完成后传递给下一个,特点就是每一个职责处理范围很明确符合单一职责,扩展方便,而且符合开闭原则。 基于上一篇,肯定先赋予这些效果对象具备构成链表的能力。现在是体现抽象和继承的时候了。对baseEffect对象增加指向下一个效果对象的属性,并增加获取下一个效果对象的属性。varbaseEffect={__nextEffect:null,prepare:function(context){thrownewError('请重写prepare方法');},transform:function...
javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)
在上一篇《javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)》里,通过采用迭代器模式完成了各初始化函数的定义和调用。接下来就要完成各个切换效果的编写。先思考一下一个切换效果需要完成的操作1.准备阶段,将各个strip归位到动画效果开始的位置。2.动画效果处理。3.执行。3.完成。所有的切换效果都具备上述3步操作。既然这样就好抽象了。可以对上述的操作进行单独定义,然后通过模板方法模式对各个操作进行调用。所谓的模板方法模式,其实就是有这么一个方法完成一个业务流程的处理,在这个业务流程中的某些个细节则交个子对象去处理。就好比组装汽车的流水线就是一个模板,它规定了组装的流程,但是工人是跳着装,还是走着装,还是拿个设备辅助着装那就是安装者的事儿了。 按照模板方法模式编写一个基本效果对象。varbaseEffect={prepare:function(context){thrownewError('请重写prepare方法');},transform:function(context){thrownewError('请重写transform方法')...
javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)
类似于幻灯片的切换效果,有时需要在网页中完成一些图片的自动切换效果,比如广告,宣传,产品介绍之类的,那么单纯的切就没意思了,需要在切换的时候通过一些效果使得切换生动些。比较常用之一的就是窗帘切换了。先贴上完成的效果。 实现原理不复杂,在动的一条一条的称之为“窗帘条”或者是“strip”,每一个strip都是一个div,类似于雪碧图的方式将其背景图的位置设置为strip的可视位置,然后用jquery的animate让他们按照一定规律动起来就完成窗帘切换效果了。为了使用方便,将这个功能作为jquery的插件方式进行编写。插件名:bobenut.curtain.jquery.js(function(jquery){jquery.fn.curtain=function(options){//TODO}})(jQuery);调用页面<!DOCTYPEhtml><html><head><metacharset="utf-8"><style>#curtain{width:800px;height:600px...
javascript设计模式实践之策略模式--输入验证
策略模式中的策略就是一种算法或者业务规则,将这些策略作为函数进行封装,并向外提供统一的调用执行。先定义一个简单的输入表单:<!DOCTYPEhtml><html><head><metacharset="utf-8"><style>.form{width:400px;height:200px;#margin:0pxauto;}.form-item-label{width:100px;text-align:right;float:left;}.form-item-input{float:left;}.form-item{width:100%;height:50px;line-height:50px;}</style></head><body><divclass='form'><divclass="form-item"><divclass='form-item-label'><span>用户名:</span></div><...
画一画javascript原型链
在javascript中,几种数据类型String,Number,Boolean,Object,Function都是函数,可称之为函数对象。可以说拥有prototype属性的都是函数。所有对象都拥有__proto__属性,因为原型链就是靠__proto__的指向进行构建。使用函数,并在该函数前添加new操作符的调用,可构建一个对象,如:functionFoo(){console.log("constructorfunctionFoo");}varf1=newFoo(); 构建了f1对象后,该对象及其背后的原型链结构如下图: ...
交换排序---快速排序算法(Javascript版)
快速排序是对冒泡排序的一种改进。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,最终达到整个数据变成有序序列。假设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为基准数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。一趟快速排序的算法是:1)设置两个变量low、high,排序开始的时候:low=0,high=N-1;2)以第一个数组元素作为基准数据,赋值给base,即base=A[0];3)从high开始向前搜索,即由后开始向前搜索(high--),找到第一个小于base的值A[high],将A[high]和A[low]互换;4)从low开始向后搜索,即由前开始向后搜索(low++),找到第一个大于base的A[low],将A[low]和A[high]互换;5)重复第3、4步,...
交换排序---冒泡排序算法(Javascript版)
比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 functionsort(elements){for(vari=0;i<elements.length-1;i++){for(varj=0;j<elements.length-i-1;j++){if(elements[j]>elements[j+1]){varswap=elements[j];elements[j]=elements[j+1];elements[j+1]=swap;}}}}varelements=[3,1,5,7,2,4,9,6,10,8];console.log('before:'+elements);sort(elements);console.log('after:'+elements); 效率:时间复杂度:最好:O(n),最坏:O(n^2),平均:O(n^2)。...
选择排序---堆排序算法(Javascript版)
堆排序分为两个过程:1.建堆。堆实质上是完全二叉树,必须满足:树中任一非叶子结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。堆分为:大根堆和小根堆,升序排序采用大根堆,降序排序采用小根堆。如果是大根堆,则通过调整函数将值最大的节点调整至堆根。2.将堆根保存于尾部,并对剩余序列调用调整函数,调整完成后,再将最大跟保存于尾部-1(-1,-2,...,-i),再对剩余序列进行调整,反复进行该过程,直至排序完成。 以下代码在nodejs中执行通过//调整函数functionheadAdjust(elements,pos,len){//将当前节点值进行保存varswap=elements[pos];//定位到当前节点的左边的子节点varchild=pos*2+1;//递归,直至没有子节点为止while(child<len){//如果当前节点有右边的子节点,并且右子节点较大的场合,采用右子节点//和当前节点进行比较if(child+1<len&&elements[child]<elements[child+1]){child+=1;}/...
选择排序---直接选择排序算法(Javascript版)
在要排序的一组数列中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。functionsort(elements){for(i=0;i<elements.length;i++){//将当前位置作为关键位置(最小位置)varkey=i;//找出剩余的数列中最小值的位置作为关键位置for(varj=i+1;j<elements.length;j++){if(elements[j]<elements[key]){key=j;}}//最小值的位置不是当前位置时,用最小值替换当前位置的值if(key!=i){varswap=elements[i];elements[i]=elements[key];elements[key]=swap;}}}varelements=[10,9,8,7,6,5,4,3,2,1,0];console.log('before:'+elements);sort(elements);console.log('af...
插入排序---希尔插入排序算法(Javascript版)
取一个小于n的整数作为第一个增量,把序列分组。所有距离为增量的倍数的元素放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量(第二个<第一个)重复上述的分组和排序,直至所取的增量=1,即所有元素放在同一组中进行直接插入排序为止。 一般的初次取序列的一半为增量,以后每次减半,直到增量为1。 以下代码在nodejs中执行通过。functionshellInsertSort(elements,di){//从增量的所在位置开始for(vari=di;i<elements.length;i++){//升序if(elements[i]<elements[i-di]){//取出增量位置的元素作为被插入元素(哨兵)varguard=elements[i];varj=i-di;elements[i]=elements[j];//向前,将增量的倍数的位置作为同一组比较及进行直接插入法while(j>=0&&guard<elements[j]){elements[j+di]=elements[j];j-=di;}//插入elemen...
插入排序---直接插入排序算法(Javascript版)
将n个元素的数列分为已有序和无序两个部分。数列:{a1,a2,a3,a4,…,an}将该数列的第一元素视为有序数列,后面都视为无序数列:{{a1},{a2,a3,a4,…,an}}将无序数列中的元素插入到有序数列的对应位置,插入前通过比大小的方式找到其在有序数列中的对应位置。 代码:以下代码在nodejs环境中执行通过。functionsort(elements){//假设第0个元素是一个有序的数列,第1个以后的是无序的序列,//所以从第1个元素开始将无序数列的元素插入到有序数列中for(vari=1;i<elements.length;i++){//升序if(elements[i]<elements[i-1]){//取出无序数列中的第i个作为被插入元素varguard=elements[i];//记住有序数列的最后一个位置,并且将有序数列位置扩大一个varj=i-1;elements[i]=elements[j];//比大小,找到被插入元素所在的位置while(j>=0&&guard<elements[j]){elements[j+1...
“云”端的语雀:用 JavaScript 全栈打造商业级应用
语雀是一个专业的云端知识库,面向个人和团队,提供与众不同的知识管理,打造轻松流畅的工作协同,它提供各种格式的在线文档(富文本、表格、设计稿等)编辑能力,支持实时在线多人协同编辑,数据云端保存不丢失。而语雀与其他文档工具最大的不同是,它通过知识库来对文档进行组织,让知识创作者更好的管理知识。原型阶段语雀诞生于2016年,当时蚂蚁金融云需要一个工具来承载它的文档。当时负责的技术同学利用业余时间,开始搭建这个文档工具。项目的初期,没有任何人员和资源支持,同时也为了快速验证原型,技术选型上选择了最低成本的方案。底层服务完全基于体验技术部内部提供的BaaS服务和容器托管平台:Object服务:一个类MongoDB的数据存储服务;File服务:阿里云OSS的基础上封装的一个文件存储服务;DockerLab:一个容器托管平台;这些服务和平台都是基于Node.js实现,专门给内部创新型应用使用,也正是由于有这些降低创新成本的内部服务,才给工程师们提供了更好的创新环境。应用层服务端自然而然的选用了体验技术部开源的Node.jsWeb框架Egg(蚂蚁内部的封装Chair),通过一个单体Web应用实现服务端...
跑的好好的 Java 进程,怎么突然就瘫痪了
用Java无法做出类似Redis这样的产品。Java的内存回收机制使我们在编写代码时不需要关注对象的回收,同时加大了内存回收的消耗,标记复制需要做内存拷贝,标记清除算法则需要stoptheworld。所以我们在使用缓存的时候,量稍微大一些就需要借助类似Redis这样的中间件帮我们处理了。作为Javaer,我们享受了自动内存回收的安逸,同时也需要多了解下内存优化的方法。什么情况下会GC为了了解我们的系统为什么会不停FGC,我们需要先了解一下系统什么情况下会GC。在Jvm层面,当我们new一个对象的时候,Jvm会先在堆区分配对象需要的内存,这个时候如果内存不够的话,就需要GC了,GC的返回结果就是对象的空间地址。Jvm会先进行ygc,也就是我们通常说的标记复制,如果ygc之后依然申请不到空间,就会进行FGC了。同理,如果FGC之后依然没有足够的空间,就会循环的进行FGC,直到申请到足够的空间。导致不停的FGC的原因如上文所讲,FGC有可能发生在你的每一行代码。如果FGC之后依然没有足够的空间,就会不停的FGC,直到申请到足够的空间。同时JVM会限制在抛出OutOfMemory错误之前在GC...