欲练此功必先自宫---从C#到Javascript(1)
2015-03-23 20:02
155 查看
由于时代需要,我也只能被自愿的去加入javascript的行列,但是作为C#拥护者,当初识js的时候,真的很不适应,我始终坚信这是门非常适合初学者,不,是完全没有编程经验的开发者,这门语言简直再好不过了,没有很多规约,可以说有些随意的定义,非常适合没有什么概念的小朋友。
这边开始,我透过c#的对比,来开始伟大的jsp研究了。
1. objec == null?
我们在C#中通常有if(sth ==null)的判断,虽然也有通过写扩展方法的nullable object模式来摆脱这个难看的东西:
http://www.cnblogs.com/anytao/archive/2008/07/31/must_net_21.html
详情参照这位大侠写的这篇,我们回到jsp,在jsp中,根本不存在这样的判断:
if(sth){ }....
就这样结束了,虽然很干净,但是,这tm也太干净了,确实,这是个好方法。
2. 木有重载
C#中重写和重载的区别是什么,相信各类面试官都喜欢问这个,我们不加赘述了,但是重载在C#中,我们可以有:
对,jsp中所有方法的定义都长这样,而且不限定返回值,也就是木有void这个关键字,爱return不return,随便你。
3. 全局变量&局部变量
这两个概念在c#很强,但是在JSP中未必很强,很简单的概括,var sum = 11这句话会被添加到最近的语言环境中,神马是语言环境,就是一个方法,或者,一个方法...
所以:
这样的color是有意义的,
很神奇,在方法执行后,color就变成全局变量记录在内存中了,不加var的结果就是这样,虽然一般我们不这么定义全局变量。说实话,在JSP中讨论变量是很无聊的事情,因为我猜想创建者根本没想那么多,只觉得,这个变量我要在这里用,这个变量我要一直用,巴拉巴拉。
4.Array操作
这里看到jsp对array的操作,我们就能想到微软伟大的linq了,确实linq可以秒杀任何集合操作语句,但是我们还是来看下jsp中的筛选:
every -> All
some -> Any
filter -> Where
map -> Select
当然还有些别的,最后个reduce比较有意思,从第一项开始2项2项进行归并操作,当然还有个reduceRight是与之相反,从最后项开始的。
至于forEach,其是linq也有,但是很少见而已。
5. 神奇的function传递与this
this关键字在C#简直不要太简单,但是在jsp中却有各种含义,其实主要就是this所在的环境决定他自己是个什么东西,并且可以通过函数内的call/apply方法对目标函数的this进行赋值,这里有很强的指针概念,面向对象概念被弱化了,这两个方法扩大了方法的作用区域,传说中降低了耦合。
我们可以看到,我们把this和person分别作为Callharly中的this进行赋值,所以出来的结果也是不一样的。
今天我们最后来一个很神奇的方法:
这个类似于编译器的方法可以直接把里面的string字符串解析成代码进行执行,看起来用处挺大.
这边开始,我透过c#的对比,来开始伟大的jsp研究了。
1. objec == null?
我们在C#中通常有if(sth ==null)的判断,虽然也有通过写扩展方法的nullable object模式来摆脱这个难看的东西:
http://www.cnblogs.com/anytao/archive/2008/07/31/must_net_21.html
详情参照这位大侠写的这篇,我们回到jsp,在jsp中,根本不存在这样的判断:
if(sth){ }....
就这样结束了,虽然很干净,但是,这tm也太干净了,确实,这是个好方法。
2. 木有重载
C#中重写和重载的区别是什么,相信各类面试官都喜欢问这个,我们不加赘述了,但是重载在C#中,我们可以有:
public void Dosth() {} public void Dosth(string s) {} public void Dosth(string s, string s2) {}但是在JSP中,根本没有重载的概念,而所有的方法都被藏在了一个隐藏对象argument中,
function firstMethod(){ if(arguments.length == 0){ } else if(arguments.length == 1){ } }因此我们有了这么个难看的重载方式,解释应该不需要解释,大家都能看得懂了,好处就是调用的时候根本不用管方法原本长成什么样,神马?你还是没看懂,那我们还是回到c#吧:
private void Do(params object[] obj) { if (obj.Count() == 0) { } else if (obj.Count() == 1) { } }
对,jsp中所有方法的定义都长这样,而且不限定返回值,也就是木有void这个关键字,爱return不return,随便你。
3. 全局变量&局部变量
这两个概念在c#很强,但是在JSP中未必很强,很简单的概括,var sum = 11这句话会被添加到最近的语言环境中,神马是语言环境,就是一个方法,或者,一个方法...
所以:
if(1==1){ var color = "white"; } alert(color);
这样的color是有意义的,
function secondFunction(){ var color = "white"; } alert(color);而这样,下面的color是错误的,但是下面这样又有意义了:
function secondFunction(){ color = "white"; } secondFunction(); alert(color);
很神奇,在方法执行后,color就变成全局变量记录在内存中了,不加var的结果就是这样,虽然一般我们不这么定义全局变量。说实话,在JSP中讨论变量是很无聊的事情,因为我猜想创建者根本没想那么多,只觉得,这个变量我要在这里用,这个变量我要一直用,巴拉巴拉。
4.Array操作
这里看到jsp对array的操作,我们就能想到微软伟大的linq了,确实linq可以秒杀任何集合操作语句,但是我们还是来看下jsp中的筛选:
//Arrary Definition var values = [0,1,2,4,3,9,8]; values.sort(function(value1,value2){ return value1-value2; }); alert((values.valueOf().toString())); //Take from 1 to 4 var val1 = values.slice(1,4); //Push 2, 3, 3 into the array var val2 = values.concat(2,[2,3]); //Delete 2 numbers from index 1 , then insert 9,10 from index 1 //val4 is the items delete from values. var val4 = values.splice(1,2,9,10); //If all items in values are >2, val5 = true var val5 = values.every(function(item,index,arr){ return (item>2); }); //If any item in values is >2, val5 = true var val6 = values.some(function(item,index,arr){ return (item>2); }); //val7 = the items which is >2 var val7 = values.filter(function(item,index,arr){ return (item>2) }); //val8 = the item in values which has been * 2 var val8 = values.map(function(item,index,arr){ return (item*2); }); //-> for (var i=0;i<=values.length;i++) {} var val9 = values.forEach(function(item,index,arr){ }); var val10 = values.reduce(function(prev,cur,index,arr){ return prev +cur; });我们用linq关键字来说明下,下面的左边是jsp,右边是linq:
every -> All
some -> Any
filter -> Where
map -> Select
当然还有些别的,最后个reduce比较有意思,从第一项开始2项2项进行归并操作,当然还有个reduceRight是与之相反,从最后项开始的。
至于forEach,其是linq也有,但是很少见而已。
5. 神奇的function传递与this
this关键字在C#简直不要太简单,但是在jsp中却有各种含义,其实主要就是this所在的环境决定他自己是个什么东西,并且可以通过函数内的call/apply方法对目标函数的this进行赋值,这里有很强的指针概念,面向对象概念被弱化了,这两个方法扩大了方法的作用区域,传说中降低了耦合。
function CallHarly(){ alert(this.o); } var o = "harly2"; var person = {o:"harly"}; CallHarly.call(this); CallHarly.call(person);
我们可以看到,我们把this和person分别作为Callharly中的this进行赋值,所以出来的结果也是不一样的。
今天我们最后来一个很神奇的方法:
eval("alert('harly')");
这个类似于编译器的方法可以直接把里面的string字符串解析成代码进行执行,看起来用处挺大.
相关文章推荐
- 在C#中调用VBScript、JavaScript等脚本的实现
- javascript AES加密 C#AES解密实现
- c#实现Javascript的encodeURIComponent()函数
- 伯伯2008年终总结[ 旅游 | 电影 | 文章 | C# | Javascript | CSS ]
- .net中前台javascript与后台c#函数相互调用(引用)
- 在C# winform程序中直接执行javascript,调用javascript方法
- JavaScript 调用C#变量实例
- thrift js javascript C# Csharp webservice
- javascript 调用c#变量实例
- Unity3D中JavaScript与C#对比
- C#: 提取网页中的javascript代码
- 用javaScript实现跟C#中类似的StringBuilder的功能
- .net中前台javascript与后台c#函数相互调用
- JavaScript与C# Windows应用程序交互
- 在用c#开发的ActiveX中调用JavaScript方法
- Javascript 直接调用服务器C#代码 ASP.NET Ajax实例
- asp.net中前台javascript与c#函数相互调方法
- javascript 与 PHP 通信加密,使用AES 128 CBC no padding,以及ios,java,c#文章例子
- 用C#和javascript输出99乘法表