
正文
javascript专利,web专利
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
为什么开发出了这么多的编程语言?
C#与JAVA的相同之处:由于C#与JAVA都是基于C++发展起来的,因此二者之间具有很多相似之处,具体如下:
1、C#和JAVA语言的编译结果是独立于计算机和编程语言的,可执行文件可以在受管理的执行
环境中执行;
2、C#和JAVA语言都是采用了自动的垃圾回收机制;
3、C#和JAVA语言都取消了指针操作;
4、C#和JAVA语言都没有头文件;
5、C#和JAVA语言都只支持单重继承,要实现与多重继承类似的功能,必须通过接口来实现;
6、类都是从Object类派生而来,类的对象通过关键字new生成;
7、C#和JAVA语言都支持线程;
8、C#和JAVA语言都没有全局变量和全局函数,所有的变量和函数都属于某个类所有;
9、C#和JAVA语言都支持对数组和字符串边界的严格检查,不会出现边界溢出的情况;
10、C#和JAVA语言都使用“.”操作符,不再使用“->”和“::”操作符;
11、C#和JAVA语言都将null和bool作为关键字;
12、C#和JAVA语言中所有的值都必须先初始化后才能使用;
13、C#和JAVA语言中的if语句都不允许采用整数作为判断条件;
14、C#和JAVA语言中的try语句块都可以后接finally语句块。
C#与JAVA的不同之处:
尽管C#和JAVA有很多相同之处,但是由于二者是两家不同公司开发的高级程序设计语言,它们又相互独立,
自成体系,各自具有一些自己特有的特点,下面将C#与JAVA之间的不同之处如下:
1、属性
对于那些经常使用快速开发工具,如Delphi或者Visual Basic的开发人员来说,属性是一个非常熟悉的概念。
一般来说,通过getXXX可以读取属性的值,而通过setXXX可以设置属性的值。
JAVA中比较常见的属性操作语句: foo.setSize(foo.getSize()+1); label.getFont().setBold(true);
c#中比较常见的属性操作语句: foo.size++; label.font.bold=true;
很明显,上述的属性设置方式较JAVA来说更为简洁,可主读性也更强。这充分体现了C#简单的特点。
JAVA对于属性的定义:public int getSize(){ return size; } public void setSize(int value){ size=value; }
c#对于属性的定义进行了简化:public int Size{ get{ return size; } set{size=value; }}
2、index
C#提供index来给对象加上索引的功能,从而用与处理数组类似的方式来处理对象,JAVA语言则不支持index
C#中定义index的典型方式如下:
public Story this[int index]
{
get{return stories[index]; }
set{
if(value!=null){
stories[index]=value
}
}
3、delegate :可以认为是一种类型安全、面向对象的函数指针。
C#使有delegate可以通过一个名字访问不同的函数,它实现和JAVA中的interface类似的功能,但是它比interface更为好用。
4、event
C#提供对event的直接支持,它通过delegate和event关键字实现对事件的处理。event关键字隐藏所有delegate方法,运算符“+=”和“-+”允许程序员自由加入或者删除时间处理程序。
5、enum:枚举用于指定一系列的对象。
C#通过如下语句来定义和使用枚举:
定义:public enum Direction{North,East,West,South};
使用:Direction wall=Direction.North;
JAVA不直接支持枚举,如果要实现和C#相类似的功能,必须先定义一个类
public class Direction{
public final static int NORTH=1;
public final static int EAST=2;
public final static int WEST=3;
public final static int SOUTH=4; }
在定义了Direction类后,JAVA可以通过引用类中的值来使用枚举:
int wall= Direction.NOTRH;
6、foreach语句
C#提供了标准的for循环,同时还提供了foreach语句(从VB中引入)来循环处理集合中的元素。
JAVA遍历集合中的所有元素的典型处理方式如下:
while(!collection.isEmpty())
{
Object o=collection.get();
connection.next();
…
}
C#遍历集合中的所有元素:foreach(object o in collection){…}
7、统一数据类型:
大多数的高级程序设计语言都有基本数据类型,如整型、浮点类型等。同时,为了更好地满足实际的需要,对不同的数据类型有不同的处理方式,显然,如果能够对简单数据类型的处理和对复杂数据类型的处理结合在一起,并用一致的方式加以处理的话,无疑会大大提升应用程序设计的效率,增强程序设计的灵活性。
JAVA语言在处理基本数据类型的时候也采取分别处理的策略,但是在基本数据类型的基础上提供了一系列封装这些基本数据类型的类,例如:整型(int)被类Integer所封装,双精度浮点(double)被类Double封装。
C#提供了一种和JAVA不同的方式来实现数据类型的统一。事实上,在c#中,即使是int这样的简单数据类型在C#内部也是通过一个结构体Int32来实现的,在C#中,可以这样认为,int只是结构体Int32的一个别名。由于C#中的结构体也继承自类Object,这样,Object类中定义的方法,各个结构体也拥有,于是,在C#中可以通过如下的方式来操作整数:int I=5; System.Console.WriteLine(i.ToString());
8、操作符重载
通过操作符重载可以用一种比较自然的方式来操纵各种数据类型,从而大大提升程序的可读性和灵活性。C#中的“==”操作符在Object类中进行了定义,在Object中定义的==操作符通过比较两个值的引用来获得最后的结果。如果使有和集合相关的类,则必须在这样的类中实现ICompar接口,这个接口中定义了一个方法CompareTo,该方法返回两个对象的比较结果,在此基础上,可以进一步定义各个实现比较的操作符,如
“>”、“<”、“>=”、“<=”等。事实上,数字类型(int、long等)可以直接使用这些比较操作符,它们的内部都实现了ICompare接口。
9、多态性
虚似方法提供了多态性的技持。多态意味着派生类可以定义一个和基类中同名的方法。尽管JAVA和C#都支持多态性,但是它们的具体实现方式还是有一定的差别。
在JAVA语言中,默认情况下,基类的对象可以直接调用派生类中的虚似方法,在C#语言中,基类要调用派生类中的虚似方法必须通过virtual关键字来实现。同时,在C#语言中,一个方法要重载基类中的同名方法,还必须通过关键字override来实现。在C#中实现多态的典型程序如下:
Class B{ public virtual void foo{}}
Class D:B{ public overried void foo(){}}
以上只是简单地比较了C#和JAVA之间的异同,事实上,这二者之间的比较远不止上面所介绍的内容,要学好这两种语言,需要经过大量的实践工作,在实践中区分开两种语言
相关问答
Q1: 有几个关于javascript的功能实现的问题?
head
script
var edit; //当前选择的文本编辑区域对象
var RangeType; //对象类别
function start() {
Editor.document.designMode="ON";
Editor.document.open();
Editor.document.write(ikj.value);
Editor.document.close();
fnInit()}
function setFocus() {
Editor.focus();
}
function selectRange(){
edit = Editor.document.selection.createRange();
RangeType = Editor.document.selection.type;
}
function execCommand(command,para) {
setFocus();
selectRange();
if (para=="")
edit.execCommand(command)
else
edit.execCommand(command, false, arguments[1]);
Editor.focus();
if (RangeType != "Control") edit.select();
}
function doSelectC(str,el) {
var Index = el.selectedIndex;
if (Index != 0)
{ el.selectedIndex = 0;
execCommand(str,el.options[Index].text);
}
}
function doSelectCl(str,el) {
var Index = el.selectedIndex;
if (Index != 0)
{ el.selectedIndex = 0;
execCommand(str,""+el.options[Index].value+"");
}
}
function fnInit(){
for (i=0; idocument.all.length; i++)
document.all(i).unselectable = "off";
getSystemFonts();
}
function getSystemFonts()
{
var a=dlgHelper.fonts.count;
var fArray = new Array();
var oOption = document.createElement("OPTION");
oOption.text = "字体";
oOption.value = "0";
selectFontName.add(oOption);
for (i = 1;i dlgHelper.fonts.count;i++)
{
fArray[i] = dlgHelper.fonts(i);
var oOption = document.createElement("OPTION");
oOption.text = fArray[i];
oOption.Value = i;
selectFontName.add(oOption);
}
}
function formatfor(va) {
var t=va.replace(/\r/g,'');
t = t.replace(/((script|textarea|xmp|pre|style).*?)([^\r]*?)(\/\2)/img,
function (){return arguments[1]+arguments[3].replace(/\n/g, "\r")+arguments[4]})
t = t.replace(/\n/g, "");
return t
}
function fontsize(el)
{var Index=el.selectedIndex
var addpre="font size="+el.options[Index].value+""
if(Index7)addpre="font style='font-size:"+el.options[Index].value+"pt'"
var oSel = Editor.document.selection.createRange()
var sBookmark = oSel.getBookmark()
var oSelhtml=oSel.htmlText
if(oSelhtml!="")
{
//定位选中内容
var conts=oSelhtml
var textLength = Editor.document.body.innerText.length
oSel.moveStart("character", -1*textLength)
var contp=formatfor(oSel.htmlText)
var conta=formatfor(Editor.document.body.innerHTML)
var contpa=''
var partC=""
var partB=""
var partA=""
var m=0
m=conta.indexOf(contp.substr(0,3))
var f=contp.length
for(;f0;f--)
{if(conta.substr(m,f)==contp.substr(0, f)){contpa=contp.substr(0,f);partC=conta.substr(m+f);break}}
var ko=contp.substr(f)
var kol=ko.length
var ty=conta.substr(m+f,kol)
var hu=""
for(var b=1;bkol;b++)if(ko.substr(b)==ty.substr(0,kol-b)){hu=ko.substr(b);contpa+=hu;partC=partC.substr(kol-b);break}
var k=contpa.length
cont=conts.replace(/\n/g, "")
var u=cont.length
if(cont==contpa.substr(k-u)){partB=cont;partA=contpa.substr(0,k-u)}else{
for(u=cont.length;u0;u--)
{if(cont.lastIndexOf(contpa.substr(k-u))!=-1){partB0=contpa.substr(k-u);partA0=contpa.substr(0,k-u);break}}
contt=formatfor(conts)
if(hu!="")if(contt.substr(contt.length-kol)==ko)contt=contt.substr(0,contt.length-kol)+hu
u=contt.length
var youm=contpa.lastIndexOf(contt)
if(youm!=-1){partB=contt;partA=contpa.substr(0,youm);partC=contpa.substr(youm+u)+partC}else{
for(;u0;u--){if(contt.lastIndexOf(contpa.substr(k-u))!=-1){partB1=contpa.substr(k-u);partA1=contpa.substr(0,k-u);break}}
if(partB1.lengthpartB0.length){partB=partB1;partA=partA1}else{partB=partB0;partA=partA0}
}
}
if(partB.substr(partB.length-1)==""){partB=partB.substr(0,partB.length-1);partC=""+partC}
if(partB.substr(partB.length-2)=="/"){partB=partB.substr(0,partB.length-2);partC="/"+partC}
//保护textarea、xmp、script和style的内容不被改变
var cook=[]
partA=partA.replace(/((script|textarea|xmp|style).*?)[\s\S]*?\/\2/ig,
function (){co=cook.length
cook[co]=arguments[0];return "cook"+co+""})
var ook=""
partA=partA.replace(/((script|textarea|xmp|style).*?)[\s\S]*?$/i,
function (){co=cook.length
ook=arguments[2]
cook[co]=arguments[0];return "cook"+co+""})
if(ook!=""){fd="(^[\\s\\S]*?\/"+ook+")"
jk=new RegExp(fd,["i"])
if(jk.test(partB)){jk.exec(partB)
co=cook.length
cook[co]=RegExp.$1
partB=partB.replace(jk,"cook"+co+"")}}
partB=partB.replace(/((script|textarea|xmp|style).*?)[\s\S]*?\/\2/ig,
function (){co=cook.length
cook[co]=arguments[0];return "cook"+co+""})
ook=""
partB=partB.replace(/((script|textarea|xmp|style).*?)[\s\S]*?$/i,
function (){co=cook.length
ook=arguments[2]
cook[co]=arguments[0];return "cook"+co+""})
if(ook!=""){fd="(^[\\s\\S]*?\/"+ook+")"
jk=new RegExp(fd,["i"])
if(jk.test(partC)){jk.exec(partC)
co=cook.length
cook[co]=RegExp.$1
partC=partC.replace(jk,"cook"+co+"")}}
partC=partC.replace(/((script|textarea|xmp|style).*?)[\s\S]*?\/\2/ig,
function (){co=cook.length
cook[co]=arguments[0];return "cook"+co+""})
//处理font
var dol=[]
var dos=[]
var lon=[]
fd="FONT([^]*?)"
jk=new RegExp(fd,["im"])
while(jk.test(partB)){ce=dol.length
jk.exec(partB)
dol[ce]=RegExp.$1
partB=partB.replace(jk,"site"+ce+"")
}
ce=dol.length-1
for(;ce-1;ce--)
{kjc="site"+ce+""
fd=kjc+'(.*?)\/font'
jk=new RegExp(fd,["im"])
if(jk.test(partB)){dos[dos.length]=ce
jk.exec(partB)
ko3=kjc+RegExp.$1+"/site"+ce+""
partB=partB.replace(jk,ko3)
}else{lon[lon.length]=ce}
}
partB=partB.replace(/\/font/img,"lonf")
for(var c=dos.length-1;c-1;c--)
{
uts=dol[dos[c]]
if(""==(uts.replace(/size=[0-7+]+/i,"").replace(/style=("|')FONT-SIZE: [0-9.]+.*;*("|')/im,"").replace(/[\s\n\r]+/mg,""))){partB=partB.replace("site"+dos[c]+"","")
partB=partB.replace("/site"+dos[c]+"","")}else{partB=partB.replace("site"+dos[c]+"","font"+uts.replace(/ size=[0-7+]+/im,"").replace(/FONT-SIZE: [0-9.]+pt/im,"").replace(/ style=("|');*("|')/im,"")+"")
partB=partB.replace("/site"+dos[c]+"","/font")}
}
//处理其他标签
var addend=""
var mio=[]
partB=partB.replace(/([^ ]*?) [^]*?style=[^]*?FONT-SIZE: [0-9.]+[^]*?/img,
function (){notv="|select|input|option|object|"
if(notv.indexOf("|"+arguments[1].toLowerCase()+"|")==-1){
op=mio.length
mio[op]=arguments[0]
return "opis"+op+""}else{return arguments[0]}})
kba=["h1","h2","h3","h4","h5","h6","pre","button","listing","big","small","tt","code","kbd","samp","td","\/td","caption","\/caption","th","\/th","tr","\/tr","table","\/table","thead","\/thead","tbody","\/tbody","tfoot","\/tfoot"]
for(b in kba){
fd="("+kba[b]+")[^]*?"
jk=new RegExp(fd,["img"])
partB=partB.replace(jk,
function (){op=mio.length
mio[op]=arguments[0]
return "opis"+op+""})
}
//收尾工作
liming=[]
partB=partB.replace(/(opis|site|lonf)([0-9]*)/g,
function(){var op=liming.length
if(arguments[1]=="opis"){liming[op]=mio[parseInt(arguments[2])]}
if(arguments[1]=="site"){liming[op]="font"+dol[parseInt(arguments[2])]+""}
if(arguments[1]=="lonf"){liming[op]="/font"}
return "duan"+op+""
})
if(liming.length0){
partB=partB.replace(/^(.+?)(duan0)/m,function(){if(""!=arguments[1]){return addpre+arguments[1]+"/font"+arguments[2]}
else{return arguments[0]}})
var op=liming.length-1
for(var kc=0;kcop;kc++){
fd="(duan"+kc+")(.+?)(duan"+(kc+1)+")"
jk=new RegExp(fd,["m"])
partB=partB.replace(jk,
function(){if(""!=arguments[2]){return arguments[1]+addpre+arguments[2]+"/font"+arguments[3]}
else{return arguments[0]}})}
fd="(duan"+op+")(.+?)$"
jk=new RegExp(fd,["m"])
partB=partB.replace(jk,function(){if(""!=arguments[2]){return arguments[1]+addpre+arguments[2]+"/font"}
else{return arguments[0]}})
}
else{partB=addpre+partB+"/font"
}
partB=partB.replace(/duan([0-9]+)/g,function(){return liming[parseInt(arguments[1])]})
var endtemp=partA+partB+partC
for(vof in cook)endtemp=endtemp.replace("cook"+vof+"",cook[vof])
Editor.document.body.innerHTML=endtemp
var vrvd=Editor.document.selection.createRange()
vrvd.moveToBookmark(sBookmark)
vrvd.select()
}
else{
Editor.document.selection.createRange().pasteHTML(addpre+"/font")
}Editor.focus()
el.blur()
el.selectedIndex=0}
/script
/head
body SCROLL="no" bgcolor=d0d0c8 onload="start()" leftmargin=5 topmargin=5
OBJECT id=dlgHelper CLASSID="clsid:3050f819-98b5-11cf-bb82-00aa00bdce0b" width="0px" height="0px"/OBJECT
select id="select1" style="height: 18" onchange="doSelectCl('FormatBlock',this);this.returnValue=false;" name="select1" size="1"
option selected value=""段落样式/option
option value="P"普通
option value="H1"标题一
option value="H2"标题二
option value="H3"标题三
option value="H4"标题四
option value="H5"标题五
option value="H6"标题六
option value="p"段落
option value="dd"定义
option value="dt"术语定义
option value="dir"目录列表
option value="menu"菜单列表
option value="PRE"已编排格式
/select
select style="height: 18"
onchange="doSelectC('FontName',this,'font face=quot'+this.value+'quot')"
name="selectFontName"/select/td
select style="width: 60; height: 18" onchange="fontsize(this)" name="selectFontSize" size="1"
option selected字号/option
option value="7"一号
option value="6"二号
option value="5"三号
option value="4"四号
option value="3"五号
option value="2"六号
option value="1"七号
option value=11 pt
option value=22 pt
option value=33 pt
option value=44 pt
option value=55 pt
option value=66 pt
option value=77 pt
OPTION value=88 pt
OPTION value=99 pt
OPTION value=1010 pt
OPTION value=1111 pt
OPTION value=1212 pt
OPTION value=1313 pt
OPTION value=1414 pt
OPTION value=1515 pt
OPTION value=1616 pt
OPTION value=1717 pt
OPTION value=1818 pt
OPTION value=1919 pt
OPTION value=2020 pt
OPTION value=2121 pt
OPTION value=2222 pt
OPTION value=2323 pt
OPTION value=2525 pt
OPTION value=2828 pt
OPTION value=3030 pt
OPTION value=3535 pt
OPTION value=4040 pt
OPTION value=4545 pt
OPTION value=5050 pt
OPTION value=6060 pt
OPTION value=7070 pt
OPTION value=8585 pt
OPTION value=100100 pt
OPTION value=120120 pt
OPTION value=150150 pt
option value=200200 pt
option value=250250 pt
option value=300300 pt
option value=500500 pt
option value=900900 pt
option value=20002000 pt/select
P
textarea name=ikj style="display:none"PFONT style="FONT-SIZE: 15pt"STRONGBound0 子确工作室/FONT 生物信息相关业务简介/STRONG/PTABLE cellSpacing=0 cellPadding=0 width="100%" border=0TBODYTRTDH2FONT color=#ff0000[多步生物信息查询的一步化]/FONT/H2P将繁琐的多步生物信息查询font style='font-size:13pt'合并为一步/font,减少在各个网页间的手工跳转。P只要能够理清多步生物信息查询的流程就可能做到一步化。BRBRH2FONT color=#ff0000[批量数据转录、整合]/FONT/H2P将大量零散的文档收录到数据库中或整理、转化为符合要求的格式。P例如:将数百个结构复杂的word文档内容收录到数据库中。/P/TDTDCENTER
SCRIPT type=text/javascript
!--
google_ad_client = "pub-2435639364513187";
google_ad_width = 200;
google_ad_height = 90;
google_ad_format = "200x90_0ads_al_s";
google_ad_channel ="";
google_color_border = "2BA94F";
google_color_bg = "80FF00";
google_color_link = "002E3F";
google_color_text = "000000";
google_color_url = "008000";
//--
/SCRIPT
SCRIPT src="" type=text/javascript/SCRIPT
SCRIPT type=text/javascript
!--
google_ad_client = "pub-2435639364513187";
google_ad_width = 180;
google_ad_height = 60;
google_ad_format = "180x60_as_rimg";
google_cpa_choice = "CAAQyLDUlAIaCPMwSam7wGerKMD29IMB";
google_ad_channel = "";
//--
/SCRIPT
SCRIPT src="" type=text/javascript/SCRIPT
/CENTER/TD/TR/TBODY/TABLEH2FONT color=#ff0000[定制Bound0 Eureka预选器数据库]/FONT/H2P利用Bound0 Eureka预选器数据库可以初步判断样品的成分,缩小进一步实验的处理范围,对接下来的实验环节做出调整,或预选出最佳的实验方案,从而缩短研究、开发的周期,节省人力物力。还可以初步验证某些假设推断,并有助于提出新的假设推断,构建新的假说。同时让交流和教学过程变得更简单、方便。P有关Bound0 Eureka预选器数据库核心技术的专利申请已被受理,专利申请号:200610077985.3。P定制Bound0 Eureka预选器数据库(Bound0 Eureka Preselector)的业务实质:P1、定制公共数据库内容的本地化整合。BR2、定制数据库查询方式和查询项目。BR3、定制分析、统计功能。BR4、定制数据共享功能。BR5、定制教学展示功能。BR6、定制其他辅助功能。P例如:Bound0酵母蛋白Eureka预选器数据库的数据内容整合了SGD数据库(Saccharomyces Genome Database,酵母基因组库A href="";/A)中的部分数据。共包含6713个蛋白的信息。BRBound0酵母蛋白Eureka预选器数据库具有以下基本功能:BR(1)Eureka Preselector(主功能): 根据条件给出符合条件的蛋白质列表。根据蛋白质的特征与目标特征的接近程度对列表内的蛋白质进行排名。以网页形式输出、保存 Eureka 结果。对保存的结果进行对比分析。BR(2)以树状结构显示(treeview)蛋白质的各种生物学信息。BR(3)以搜索引擎形式,对描述蛋白质充当的细胞组分、参与的生物过程、分子功能等描述性特征的标准化术语(GO Term)提供注释和指导。BR(4)以搜索引擎形式,对蛋白质的各种ID、名称进行通译。BR(5)在安装了Bound0酵母蛋白Eureka预选器数据库的计算机上,实现自定义的eureka:// 协议。可以在用户自己的网页中以超级链接(文字链接、图片热点链接等)的方式动态地调用数据库中的内容进行演示。BR(6)自动生成上述演示所需要的链接代码。BR(7)独立发行(便于数据共享)的数据分析配件,可对以网页形式保存的 Eureka 结果进行处理。 /PPTABLE cellSpacing=0 cellPadding=0 width="100%" border=0TBODYTRTDH2FONT color=#ff0000[定制实验人员绩效考核系统]/FONT/H2P将团队从落后的纸面管理中解放出来。/P/TDTD /TD/TR/TBODY/TABLE/PPFONT style="BACKGROUND-COLOR: #ff0000" color=#ffffffSTRONG以上业务更多详情请质询/STRONG/FONTA href="mailto:bound0@tom.com"FONT style="BACKGROUND-COLOR: #ff0000" color=#ffffffSTRONGbound0@tom.com/STRONG/FONT/A/P/textarea
iframe id="Editor" name="Editor" style="WIDTH: 100%; HEIGHT: 95%"/iframe
/body
Q2: 为什么浏览器端编程语言只有一个JavaScript
楼上说了一堆,还物竞天择,众望所归,不懂别造谣啊。。。。其实就是纯粹的历史原因。
1995年,网景公司决定第一次让浏览器支持一种内置的语言,当时有两个选择,一个是采用现有的语言,比如Perl、Python、Tcl、Scheme等等,允许它们直接嵌入网页,另一个是发明一种全新的语言。机缘巧合下,网景和当时java的所有者sun合作,决定推出新语言,同年,布兰登加入网景,正式开发出js。
1996年,凭借跟IBM的合作关系,开始成为巨头的微软宣布IE正式支持编程脚本语言,开发出了新的JScript,同年11月网景就专利问题跟微软打官司,然而微软不按常理出牌,反而收购了网景。这也导致网景公司的布兰登开始开发出另一款巨头浏览器Firefox。从而,市场上主流的浏览器变成ie和Firefox。
但是要注意,即便如此,所有浏览器还是只支持JavaScript,只不过当时的js分成两个版本,有差异。这之后就是大家熟悉的浏览器混战了,谷歌推出chrome,同时招揽了微软和Firefox的一些研发人员。慢慢的就变成现在的局面,但是历史已经决定了支持的语言是js了。
这也是为什么Python迷不服,认为Python各方面都不输,而且比JavaScript还要早诞生,而浏览器只支持JavaScript。无奈,人家JavaScript是亲生的,不服也不行啊。
Q3: 有没有不错的javaScript课程推荐?
万门大学的这门课很不错 。这门课程的老师是王立。他曾经在微软、阿里工作十年以上,参与友盟、芒果移动的收购过程,在离职前最后职位是芒果移动的总负责人;现在为百变空间CTO\联合创始人\董事、连续创业者;18项发明专利;多家上市公司、基金顾问。






