欲练此功必先自宫---从C#到Javascript(1)

由于时代需要,我也只能被自愿的去加入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#中,我们可以有:

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字符串解析成代码进行执行,看起来用处挺大.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值