由于这段时间在学习ajax,所以想把javascript和C#系统的比较下,写这篇文章主要的目的是想要系统了解javascript和C#当中的一些语法区别,还有两种语言特有的属性,只以javascript为主,以后会不段更新,只供参考,本人水平有限,若有错误,还忘各位指出。
javascript是浏览器按顺序分析的,分析后,在html当中就可以使用其方法,对象,变量等,C#需要被编译成中间代码,也就是dll文件,然后由CLR当中的JIT及时编译成机器语言并保存在缓存中,注意前者只需要解析,后者需要两次编译
本篇文章目录:
一.声明变量
二.函数或方法的声明及调用
三.javascript对象及如何添加属性和函数
一.声明变量。
javascript:
- var a;
- a;
javascript当中的变量可以在声明的时候加上var,也可以不加,但是否加var会在过程函数中区别出来,也就是没加var声明的变量会被系统自动认为是全局变量,如在一个函数当中:
function testvar(){
var a=1;//加了var 就说明这个变量属于局部变量,只在这个函数内有效
b="mystr";//未加var 就说明系统已经把它当成全局变量来处理了
}
testvar();
c=a;//会出现错误 错误内容是a是undefine的,也就是未定义的
c=b;//运行成功
alert(c);
总结:
1.在一个过程级中(即位于function的定义范围内,无论是函数,还是类)的任何地方,包括在一个区块里(for,while,if……),定义变量时,使用var定义,则此变量只在这个过程级内起作用,反之为全局变量。
2.在过程级外定义变量时,无论是否忽略var,都将定义一个全局变量。
3.变量声明后,如果不对变量赋初值,浏览器在解析的时候,会自动是undefine的,所以这个时候,只允许赋值,而不允许被使用,不然,浏览器会出现未定义的错误
C#:
这里不过多的描述,估计熟悉面向对象语言这个应该很清晰了 变量定义:函数类型 函数名 如 int a; string b;MyClass cls;等,注意,当没赋初值的时候,都不可以使用,这个和js当中的第3种情况类似
二.函数或方法的声明及调用
注意:function的声明有两种函数:普通函数和构造函数
function displayMessage()
... {
alert("aaa");
}
// 二.构造函数
function MyObject(id,name,des)
... {
this.id=id;
this.name=name;
this.des=name;
}
// 我们就可以利用这个构造函数来定义一个对象了,这里不做过多描述
// 下面定义一个对象myobj 那么这个obj就有三个属性id,name,des
MyObject myobj = new MyObject();
总结:1.javascript函数是自由浮动的实体,自身就可以作为正常对象来使用,而C#当中的函数必须声明在一个类当中,不能与类脱离,函数又分为静态函数和实例函数,C#函数当中不管是哪个,前提都是依赖于所属的类的
javascript例子:
语法 1
function functionName([argname1 [, ...[, argnameN]]])
{
body
}
语法 2
functionName = new Function( [argname1, [... argnameN,]] body );
function getvalue()
... {
var a=1;
return a;
}
// 你会发现这个其实也可以写成这样的,这两种写法其实是一回事,注意上面的函数名其实就是下面的对象名,这就说明所有的函数其实就是一个Function对象,Function对象是如何来使用的它就完全具有那种用法,Function是object对象的子孙,所以也具有object的一些属性或方法,这就说明javascript也有继承性,只不过这是隐式的,似乎是一个约定吧
getvalue = new Function( " var a=1;return a; " );
C#:
类型 类型名
... {
访问级别 修饰符 类型 函数名(形参数)
...{
函数体;
}
}
// 如:
class test
... {
//定义一个静态函数
public static int GetNum()
...{
return 0;
}
//定义一个实例函数
public string GetStr(string name)
...{
return name;
}
}
// 使用函数需要在另一个类中的方法中的使用,函数的调用只能在类中的方法 属性中调用
class callcla
... {
public void Call()
...{
//静态函数调用
int a=test.GetNum();
//实例函数的调用
test tt=new test();
}
}
2.javascript当中有个直接变量的概念,其实这是基于函数就是Function对象来的,如 var news=Getnews;因为Getnews就是Function对象,所以可以将它当成普通对象赋值,javascript是一种解析的语言,当对代码解析的时候,news自动也就了Function对象,而且这个对象就是Getnews,所以调用news()就相当于调用Getnews();
这个让我想起和C#当中的委托有很大相似之处,当然事件就是一个特殊的委托,这里以一个委托作为一个例子,研究下
delegate void NewCallAll( string name);
// 声明一个call方法
class Test
... {
public void CallAll(string name)
...{
Console.WriteLine("我叫"+name);
}
}
class Programe
... {
static void Main()
...{
Test ttt=new Test();
NewCallAll callone=new NewCallAll(ttt.CallAll);//注意这里你这样写也是对的:NewCallAll callone=ttt.CallAll;
callone();//和ttt.CallAll();是一样的
}
3.javascript当中可以不命名来声明一个函数,但在C#当中就不可以
// 函数定义方式一
function GetStr(name)
... {
return name;
}
// 函数定义方式二
GetStr = function (name)
... {
return name;
}
// 函数定义方式三
GetStr = new Function( " name " , " return name; " )
// 总结:我怀疑javascript当中的 function (arg) {body}似乎=new Function("arg","body")而函数名称就是对象名
话外音:Function对象特有方法Call
调用一个对象的一个方法,以另一个对象替换当前对象。
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
参数
thisObj
可选项。将被用作当前对象的对象。
arg1, arg2, , argN
可选项。将被传递方法参数序列。
说明
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
//声明一个cat构造函数,也可以说成声明一个cat类,我感觉两者都可以
function cat(name,weight)
{
this.name=name;
this.weight=weight;
this.bark=function (){
alert('喵,我是'+this.name);
};//有两个属性,一个方法
}
//声明一个wood类
function wood(name,weight)
{
this.name=name;
this.weight=weight;//它现在还不能叫
}
//声明一个cat对象和wood对象
mycat=new cat("小花",10);
mywood=new wood("大树一号",100);
3.javascript对象及如何添加属性和函数
(1)前面说了javascript不管是类还是函数,方法,都是用function 来声明的,这里和C#有了区别 C#类用class声明,函数依赖于类,构造函数也必须在类中。
(2)声明对象中的属性,在javascript当中有两种建法,一种是普通javascript建立参数的方法,一种是利用JSON来完成建立对象的方法,后者会复杂的多,所以经常用前者
普通javascript声明对象并对其属性赋值特征如下:
- 在C#当中,我们需要定义一个类来声明属性,否则就会编译出错,对于javascript这个是不必要的。
- javascript对象属性是可读/可写的可以用"="来赋值如 myobject.id=123;而在C#当中属性和字段是两回事,属性的目的是用来封装字段的,让字段达到只读,只写,可读可写的功能。
- javascript当中对象类似于数组,可以说完全具备数组的大多数特征如 对属性的赋值就可以用两种方式:用普通对象的方式==》myobject.id=123;用类似于数组的方式==>myobject["id"]=123;这两个是相同的。
- 给对象赋于动态函数
// myobject是一个实例
// 第一种给对象动态加入函数或方法
myobject.displayMsg = function (name)
... {
alert("我是"+name)
}
// 第二种,先声明一个方法
function display(name)
... {
alert("我是"+name);
}
myobject.displayMsg = display; // 注意这里的display是个Function对象,这样比较容易理解 - 我们可以将对象附加到其他对象上,从而创建复杂的数据模型
var mylibrary = new object();
mylibrary.books = new Array(); // 属性是一个数组对象
mylibrary.books[ 0 ] = new Object(); // books数组对象的第一个对象是Object简单对象
mylibrary.books[ 0 ].titile = " ajax实战 " ; // 上面的Object对象添加一个属性title
mylibrary.books[ 0 ].authors = new Array(); // boos[0]对象添加属性authors属性值是个数组对象,就这样不段赋值,就象一个树一样,由根不段伸展出现N多个叶子,所以相当复杂
JSON建立对象,现在先了解下什么是JSON,它的用法是什么:
========================================================================================
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
JSON建构于两种结构:
- “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
- 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。
JSON具有以下这些形式:
对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
值(value)可以是双引号括起来的字符串(string)、数值(number)、true
、false
、 null
、对象(object)或者数组(array)。这些结构可以嵌套。
字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。
字符串(string)与C或者Java的字符串非常相似。
数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。
-
string
number
object
array
true
false
null -
any-Unicode-character-
except-"-or-/-or-
control-character
/"
//
//
/b
/f
/n
/r
/t
/u four-hex-digits -
digit
digit1-9 digits
- digit
- digit1-9 digits
object | {} { members } |
members | pair pair , members |
pair | string : value |
array | [] [ elements ] |
elements | value value , elements |
value |
|
string | "" " chars " |
chars | char char chars |
char |
|
number | int int frac int exp int frac exp |
int |
|
frac | . digits |
exp | e digits |
digits | digit digit digits |
e | e e+ e- E E+ E- |
-
===================================================================================
4.关于javascript何时可以忽略分号(;)的问题
在C#当中每个句子都需要有一个分号来表示一个句子的结束,除了if,for,foreach,函数声明等流程控制语句外。
而在javascript当中每个句子的最后分号是可以省略的,这是由于特殊的javascript解析器,解析器是一句,一行按照一句进行解析的,而{} 这个符号则表示这是一个过程段,也就是这整个过程做为一句来处理,但内部仍然分成许多句。
一般情况下,如果你换行就不需要。
a = 1
b = 1
-------------
如果不换行则需要。
a = 1 ; b = 1
-------------
另外还有一些情况下必须使用,不过建议您养成良好的编程习惯,应该在每一段代码后面加上分号。
如果多个语句用回车进行了分行,那么语句之间的分号“;”不是必需的;
如果多个语句写在一行上,那么语句之间的分号“;”才是必需的。
====================================================================
一条语句由一个或多个表达式、关键字或者运算符(符号)组成。典型地,一条语句写一行,尽管一条语句可以超过两行或更多行。两条或更多条语句也可以写在同一行上,语句之间用分号“;”隔开。通常,每一新行开始一条新语句。不过显式地终止语句是一个好方法。这是用分号 (;) 来实现的,分号是 JScript 语句的终止字符。