关键字与保留字:
关键字:
break、else、new、var、case、finally、return、void、catch、for、switch、while、continue、function、this、with、default、if、throw、delete、in、try、do、instanceof、typeof
保留字:
abstract、enum、int short、boolean、export、interface、static、byte、extends、long、super、char、final、native、synchronized、class、float、package、throws、const、goto、private、transient、debugger、implements、protected、volatile、double、import、public
基本语法
JavaScript严格区分大小写
弱类型,声明变量用var(无论什么类型变量都用var声明)
每条语句后加分号。(不是必须,但建议加上。)
字符串使用单引号’abc’。(双引号也行。推荐;html→双引号,js→单引号)
注释:
//单行注释
/* 多行注释 */
<!-- -->是html的注释,不是javascript的注释,可以用来注释:<!-- <script></script> -->
在<script></script>标签里面使用<!-- -->是什么意思?
当某些浏览器不支持JavaScript的时候,把<script></script>标签中的内容注释掉,这样就不会显示在浏览器上了。用IE1.5可以测试出效果。现在基本可以不考虑这个问题了。
JavaScript数据类型
共六种:
Boolean(布尔)、Number(数字)、String(字符串)、Undefined(未定义)、Null(空对象)、Object(对象类型)
除了Object是引用类型以外,其他都是基本数据类型
Undefined类型、Null类型都是只有一个值的数据类型,分别为undefined与null.
基本类型与引用类型的区别
数值,布尔值,null,undefined属于基本类型。对象,数组和函数属于引用类型。基本类型在内存具有固定的大小。一个数值在内存占八个字节,而一个布尔值使用一位可以表示了。引用类型没有固定大小。
String也是基本类型,不能为String添加动态属性,而引用类型是可以的。
JavaScript中的null和undefined区别?
undefined,表示一个未知状态
声明了但是没有初始化的该变量,变量的值是一个未知状态(undefined)。 (访问不存在的属性或对象window.xxx)
方法没有明确返回值时,返回值是一个undefined.
当对未声明的变量应用typeof运算符时,显示为undefined(*)
null表示尚未存在的对象,null是一个有特殊意义的值。可以为变量赋值为null,此时变量的值为“已知状态”(不是undefined),即null。(用来初始化变量,清除变量内容,释放内存)
undefined==null //结果为true,但含义不同。
undefined===null //false(*),先判断类型是否一致,然后判断值。
变量声明:
声明变量的时候无法:int i=0;只能通过var i=0;声明变量,和C#中的var不一样,不是C#中那样的类型推断。
var test=“hello”;
var test1=“hello”,age=20;
var i=100; i=“hello”;
var i,n,x;
var i=10,n=100,s=‘aaa’,m;
变量命名规则:以字母、下划线或$开头,中间可以包括字母、数字、下划线或$。(变量命名中多了一个$)
JavaScript中即可以使用双引号声明字符串,也可以使用单引号声明字符串。主要是为了方便和html集成,避免转义符的麻烦。
变量使用前可以不用var声明,这样的变量会变认为是“全局变量”(不推荐)
JavaScript是动态类型,因此var i=0;i=“abc”;是合法的。
例:
var i = 10; //声明一个变量,名字为i,指向10这个整数,一旦指向10,i就是int类型了。
i = "abc";//嫁鸡随鸡嫁狗随狗!
var n1 = '20';
var n2 = '20';
//将字符串类型转换成整型。
var result = parseInt(n1) + parseInt(n2);
alert(result);
JavaScript中判断已声明变量、参数是否初始化(可用)的方法:
假设已有变量x:
if (typeof(x) !=‘undefined’ && x!=null) { alert("可用"); }
if(x) { alert(‘变量可用!’); } else { alert(‘变量不可用!’); } //null、undefined、’’、0都认为是false
当x声明但没有赋值,或x为null,或x为0时,都表示不可用!// if(x),返回false
推荐用最后一种方法。但如果x有可能没有声明,则只能用typeof判断(否则会报错)。
JavaScript变量的作用域
默认如果直接在script标签中定义变量,则属于“全局作用域范围”(全局执行环境),即属于window对象。
全局作用域范围的变量直到网页关闭或浏览器关闭时才释放资源
一个页面中的多个<script>标签中的变量可以互相访问。
JS有垃圾回收机制,会定时对可释放资源的变量回收。将变量设置为null则表示可以被回收了。
注意:JS中没有块级作用域范围。函数中声明的所有变量,无论在哪里声明的,在整个函数中它们都有意义
例1:
function test() {
var i = 1;
if (1) {
var i = 2;
if (2) {
var i = 3;
alert(i);
} alert(i);
} alert(i);
}//输出结果: 全部是3
test();
例2:
var scope = "global";
function f() {
alert(scope); //结果:undefined,不是global
var scope = "local";
alert(scope); //结果:local
}
f();
很多人认为第一次调用会显示global,因为声明局部 变量的var语句还没有执行。但是由于这个作用域规则的限制,输出的并不是“global”。局部变量在整个函数内都是有定义的,这就意味在整个函数中都隐蔽了同名的全局变量。虽然局部变量在整个函数中都是有定义的,但是执行var语句之前,它是不会被初始化的,因此上面的例子中,函数f和下面的函数等价:
function f(){
var scope;//局部便令在函数开头声明。
alert(scope);//此处该变量有定义,但值仍为“undefined”
scope=”local”;//现在我们初始化该变量,并给它赋值。
alert(scope);//此处该变量具有值
}
注意:这个例子说明了为什么将所有的变量声明集中起来放置在函数的开头是一个好的编程习惯。
注:
在JavaScript中对为声明的变量赋值不会引起错误,相反,程序会在全局作用域中隐式地声明它。
JavaScript中字符串同样需要转义符 ’ \ ’,与C#一样。
想在页面输出:c:\windows\microsoft\vs.txt,这句话,需要这样写:alert(‘c:\\windows\\microsoft\\vs.txt’);不能用@,@只在C#中有效。
常见转义符:\t、\n、\’、\”、\\
if-else、for、while、do-while、switch、continue、break的用法参考c#语法。for循环稍有差异:for(var i=0;i<10;i++){ … }
注:switch判断时,是“全等于”,===
类型转换
parseInt(arg)//将指定的字符串,转换成整数
parseFloat(arg)//将指定的字符串,转换成浮点数
Number(arg)把给定的值(任意类型)转换成数字(可以是整数或浮点数);转换的是整个值,而不是部分值。如果该字符串不能完全转换为整型,则返回NaN。(Not a Number)
isNaN(arg)//判断arg是否为一个非数字(NaN),NaN与NaN也不相等。
String(arg)把给定的值(任意类型)转换成字符串;
Boolean(arg)把给定的值(任意类型)转换成 Boolean 型;
eval(codeString)//将一段字符串的js代码,计算并执行。类似于动态SQL语句。
alert(eval("2+3"));//输出结果5
eval('alert(100);'); //输出结果100
注: 类型转换参考结果
========================Boolean()===================
var b1 = Boolean(“”); //false - 空字符串
var b2 = Boolean(“hello”); //true - 非空字符串
var b1 = Boolean(50); //true - 非零数字
var b1 = Boolean(null); //false – null
var b1 = Boolean(0); //false - 零
var b1 = Boolean(new object()); //true - 对象
=========================String()-================================
与调用对象的toString()方法等效。
特列:当对象为null或undefined时,调用toString()会报错,而String()可以转换成功。
Example:
var v = null; v = String(v); //v的结果是”null”
var v; v=String(v); //v的结果是”undefined”
=========================Number()================================
Number (false)à0
Number(true)à1
Number(undefined)àNaN
Number(null)à0
Number("1.2")à1.2
Number("12")à12
Number("1.2.3")àNaN
Number(new object())àNaN
Number(50)à50
数值之间转换的技巧:
把数字转换为字符串
例:如果一个数字用在一个字符串连接表达式中,数字就会转化为字符串
var n=100;
var s=n+”booles of beer on the wallo”;
要把一个数字转换为字符串,只要给它添加一个空的字符即可。
var n=n+””;
要让数字更加现实地转换为字符串,可以使用String()函数。
var string_Value=String(number);
把数字转换为字符串的另一种方法使用toString()方法。
string_Value=number.toString();
Number对象的toString()方法有一个可选的参数,该参数用来指定转换的技术。如果不指定这个参数,转换会以10基数进行。然而,也可以按照其他的基数(2到36之间的数)来转换。例如:
var n=17;
binary_String=n.toString(2);//结果:“1001”
octal_String=”o”+n.toString(8);//结果:“021”
hex_String=’0x’+n.toString(16);//结果:“0x11”
把字符串转换为数字
当一个字符串用于数字环境中,它也会自动地转换为一个数字。
例: var product=”21”*”2”;//结果为42.
利用这一点,我们只要把一个字符串减去0,就可以将其转换为一个数字
var number=string_Value-0;
上述方法是将一个字符串转换为数字的一种技巧,但是更清楚明白的方法就是Number()构造函数作为一个函数来调用。
Var number=Number(string_Value);
这种把字符串转换为数字的方法的麻烦之处在于它过于严格。它只对以10为基数的数字有效,并且尽管它允许开头和结尾的空白,但是,在紧随数字的字符串中,它不允许出现任何非字符串。
要允许更多灵活的转化,可以使用parseInt()和parseFloat()。这些函数可以以字符串开始处和返回任何的数字,忽略和舍去非数字的部分parseInt()只截取整数,parseFloat()
截取整数和浮点数。
运算符
加法运算符(+)
运算符“+”可以对数字进行加法运算,也可以对字符串运算数进行连接操作。如果一个运算数是字符串,那么另一个运算数就会被转换成字符串。然后两者连接在一起。如果”+”运算符一个运算数是对象,那么它会把对象转换成可以进行加法运算或者进行连接操作的数字或字符串。这一转换时通过调用对象的方法valueof() 或者toString()来执行的。
减法运算符(-)
当吧运算符“-”用于二元操作时,它将从第一个运算减去第二个运算数。如果运算数是非数字的,那么运算符“-”会将他们转换成数字。
除法运算符(/)
运算符“/”将用它的第二个运算数来除第一个运算数。如果运算数是非数字的,运算符“/”会将他们转换为数字。在JavaScript除法的结果是浮点型的,如5/2结果是2.5。除数为0的结果为正无穷或负无穷,而0/0结果为NaN。
模运算符(%)
运算符“%”计算的是第一个运算数对第二个运算数的模。换句话说,就是第一个运算数被第二个运算数除运算达到某个次数时,返回的余数。如果运算数为非数字的运算符“%”会将他们转换为数字。结果的符号和第一个运算数的符号相同。
例:5%2de结果为1.
取模操作的运算通常都是整数,但也适用浮点数,如-4.3%2.1=-0.1。
一元减运算符(-)
当“-”被用于一元操作时(用于一个运算数之前),它将执行一元取反操作,简而言之,它将一个正值转换成相应的负值,反之亦然。如果运算数是非数字的,运算符“-”将他转换为数字。
一元加运算符(+)
为了与一元减运算符对称,JavaScript还有一元加运算符。如果觉得明确指定数值直接量的符号会使代码看起来更加清楚,可以采用该运算符。
递增运算符(++)
如果进行增操作的值不是数字,通过这一过程它也转换为数字。
递减运算符(--)同上
相等运算符(==)和等同于运算符(===)
把==读作‘等于’,把===读作‘完全等同’,就有助于减少混淆。
下面的规则用于判定===运算符是否完全相等。
如果两个值的类型不同,他们就不相同。
如果两个值的类型是数字,而且值相同,那么除非其中一个或两个都是NaN(这种情况他们不是等同的),否则他们是等同的。值NaN永远不会与其它任何值等同。包括自身,要检测一个值是否是NaN可以使用全局函数isNaN();
如果两个值都是字符串,而且字符串在同一位置上的祖父完全相同,那么它们就完全等同。
如果两个值都是布尔值true或者两个都是布尔值false,那么它们等同。
如果两个值引用的是同一个对象,数组或函数,那么它们完全等同。如它们引用的是不同的对象(数组或函数),它们就不完全等同,即使这两个对象具有完全相同的属性或两个数具有完全相同的元素。
如果两个值都是null或都是undefined,它们完全相同。
下面的规则用于判定==运算相等:
如果两个值具有相同的类型,那么就检测它的等同性。如果它们两个值完全相同,就相等,如果它们不完全相等,则它们不等。
如果两个值类型不同
如果一个值为null,另一个值是undefined,它们相等。
如果一个是字符串,另一个是数字,再用转换后的值进行比较。
如果一个值为true,将它转为1.如果一个值为false,把它转化为0
如果一个值为对象,另一个为字符串,将对象转换我原始类型的值再比较,使用对象的toString()或valueof()方法把对象转化成原始类型的值。
其他的数值组合是不相等的
例:“1”==true; //该表达式为true.
这两个外表完全不同的值事实上相等。首先,布尔值true被转换为数字1,然后字符串“1”也被转换为数字1,所以现在两个数字是相同的。
举例说明==与= = =的区别:
==(等号),当且仅当两个运算符相等时返回true。 !=(不等号)
var v1 = 100;
var v2 = "100";
if (v1 == v2) {
alert("相等");
} else {
alert("不相等");
}//以上代码输出结果为“相等”。
===(全等号),只有当无需类型转换时就相等的时候才返回true。!==(非全等号)
var v1 = 100;
var v2 = "100";
if (v1 === v2) {
alert("相等");
} else {
alert("不相等");
}//以上代码输出结果为“不相等”。
比较运算符:小于(<) 大于(>) 大于等于(>=) 小于等于(<=) 不等于(!=)
比较规则:
如果两个运算都是数字,或都被换成了数字,那么采取数字比较。
如果两个运算数都是字符串,或者都被换成字符串,那么将作为字符串进行比较。
如果一个运算符数字是字符串,或者被转为字符串。而一个运算数是数字,或者被转成了数字。那么运算符会将字符串转换为数字,然后执行数字比较。如果字符串不代表数字,它将转换为NaN,比较的结果为false。
如果对象可以转换为数字或者字符串。JavaScript将执行数字转换。
如果运算数都不能被成功低转换为数字或者字符串。,比较运算符总是返回false
如果某个运算数是NaN,或被转化为NaN,比较运算符总是生成false。
注意:字符串比较是会区分大小写,所有大写字母小于小写字母。当某个运算数是NaN或被转换为NaN时,四个比较运算符返回false。
in 运算符
in运算符要求左边的运算数是一个字符串,或可以被转化成字符串,右边的运算数是一个对象或数组。如果该运算符左边是其右边对象的一个属性名,它返回true。
例如:
var point={x:1,y:1};
var has_x_Cord=”x” in point;//true
var has_y_Cord=‘y’ in point;//true
var has_z_Cord=’z’ in point;//false
字符运算
运算符’+‘进行字符运算。它给予字符串运算数的优先级比数字运算数高。如果该运算符的一个运算数是字符串(或一个对象),那么另一个运算数将被转换为字符串,然后执行连接运算,而不是执行加法运算。另一方面比较运算符的两个运算数都是字符串,那么它将执行字符串比较,如果只有一个运算数是字符串,JavaScript会把它转换为数字。
例:1+2;//结果3
”1“+”2“;//结果12
“1”+2;//结果 12
11<3;//结果false
“11”<”3”;//结果true
”11“<3;//结果false
“one”<3;//结果:false
最后注意的重要的一点,当”+“用于字符串和数组时,它并不一定具有结合性。结果依赖操作顺序,除非括号改变这一顺序。
例: var s=1+2+”blind mice“;//结果:”3blind mice”
var t=”blind mice”+1+2;//结果:blind mice3
逻辑运算符
逻辑与(&&) 逻辑或(||) 逻辑非(!)
对象创建运算符(new)
例:o=new Object();
delete运算符
delete运算符是一个一元运算符,它将删除运算数所指定的对象的属性,数组元素或变量。如果删除成功则返回true,不能删除则返回false。并非所有属性和变量都可以删除的,某些内部的核心属性和客户端属性不能删除,用var语句声明的用户定义变量也不能被删除。如果delete使用的运算符是一个不存在的属性,它将返回true。
例:var o={x:1,y:2};
delete o.x;//return true
typeof o.x;//undefined
delete o.x;//return true
delete o;//return false
delete 1;//return true
x=1;
delete x;//return true
注意:删除属性,变量或数字元素不是把他们的值设置为undefined,删除该属性不再存在。
delete所能影响只是属性值,并不能影响这些属性引用的对象
例:var my=new Object();
my.hire=new Date();
my.fire=my.hire;
delete my.hire;
document.write(my.fire);
语句
switch语句:每一个case语句的结尾处都用了关键字break.
注意:case关键字后跟随的是数字和字符直接量,这是实际应用中switch语句最常用的方法,但是eCMScript v3标准允许case语句后跟随任意的表达式。
Switch语句首先计算switch关键字的表达式,然后按照出现的顺序计算case后的表达式,直到与switch表达式的值想匹配的case表达式为止。由于匹配的case表达式用===等同运算符排定的,而不是用==相等运算符判定的,所以表达式必须在没有类型转换的情况下进行匹配。
注意: 用含有副作用的case表达式不是好的程序设计习惯,因为每次执行switch语句并不会计算所有的case表达式。当只有某些情况下出现副作用时,很难理解并预测程序的正确行为。最安全的办法是把case表达式限制在常量变大时的范围内。
for/in 语句
在JavaScript中关键字for有两种使用方式。我们刚刚见过的在for循环中如何使用它,此外它还可以用于for/ in 语句。这个语句有点特别的循环语句,它的语法如下:
for(variable in object)
variable 应该是一个变量名,声明一个变量的var语句,数组的一个元素或者是对象的一个属性。Object是一个对象名或者是计算结果为对象的表达式。Statement通常是一个原始语句或者语句块,它构成了循环的主体。
注意:for/in循环中的variable可以是任意的表达式,只要它的值适用于赋值表达式的左边即可。每一次循环都会计算该表达式的值,这意味每次计算的值都不同,例:
var o={x:1,y:2,z:3};
var a=new Array();
var i=0;
for(a[i++] in o)