(三).变量

3.1变量类型

JS是非类型的,也即变量可以存放任意类型的值。

3.2变量的声明

重复的声明和遗漏的声明

可以使用VAR语句声明一个变量不仅是合法的,而且也不会造成任何错误。

如果尝试读一个未声明的变量的值,JS会生成一个错误。如果尝试给一个用VAR语句的变量赋值,JS会隐式声明这个变量,但注意,隐式声明的变量总是被创建一个全局变量,即使该变量只是一个函数体内使用。

————————-

对于变量的声明:

b;

alert(b);

错误!

var b;

alert(b)

提示 “undefined”

故最好加上 var

————————-

3.3变量的作用域

————————–

关于 VAR

function outerFun()
{

var a =0;

alert(a);
}
var a=4;
outerFun();
alert(a);
结果是 0,4 . 因为在函数内部使用了var关键字维护a的作用域在outFun()内部.

function outerFun()
{
//没有var
a =0;
alert(a);
}
var a=4;
outerFun();
alert(a);
结果为 0,0

原因
JavaScript的变量也是有作用域的,只是它非常的笼统,就分为全局变量和函数变量。作为全局变量的时候,有没有var 都没有关系,但是,在function中,有var就表示是局部变量,没有var就表示是全局变量。

————————–

如果一个局部变量或函数的参数声明的名字与某个全局变量的名字相同,那么就有效地隐藏了这个全局变量。

局部变量必须是用vary语句,否则就是全局变量了。

3.3.1没有块级作用域

JS中没有块级作用域的概念,函数中声明的所有变量无论是在哪里声明的,在整个函数中它们都是有定义的。实际这个说法对全局变量也是起作用的,例

Var scope=”global”

Function f(){

Alert(scope);//displays “undefined”,not global

Var scope=”local”;

Alert(scope); //displays “local”

}

F();

局部变量在整个函数体内部都是有定义的,这就意味着在整个函数体中会隐藏了同名的全局变量。虽然局部变量在整个函数体中是有定义的,但是在执行var语句之前,它是不会被初始化的。这个例子说明了把有的变量集中起来放置在函数的开头是一个好的编程习惯。

3.4未定义变量和未赋值变量

未定义变量就是没有被告声明过的,无论是显示声明不是隐式声明,读取这样的变量会出错

未赋值的变量是虽已经声明了,但是没有给它赋值!

3.5作为属性的变量

3.5.1全局对象

JS解释器开始运行时,它首先要做的事情之一就是在执行任何JS代码之前,创建一个全局对象,这个对象的属性就是JS程序的全局变量。当声明一个JS的全局变量或函数时,实际上所做的是定义了那全局对象的一个属性。或者说用一个同名的属性来存储全局变量和全局函数。

此外,JS解释器还会用预定义的值和函数来初始化全局对象的许多属性,如Infinity,parseInt,Math分别引用了数值infinity,预定义函数ParseInt()和预定义对象Math.

在程序的顶层代码(不是函数中的代码)可以用this关键字来引用这个全局对象。

在客户端JS中,Window对象代表浏览器窗口,它的包含在该窗口中的所有JS代码的全局对象,这个全局对象具有自我引用的window属性,它代替了this属性,可以用来引用全局对象。

3.5.2局部变量: 调用对象

内嵌的函数、函数的参数和局部变量是调用对象的属性。

3.6深入理解变量作用域

在JS的顶层代码中,作用域链只由一个对象构成,那就是全局对象。所有的变量都是在这一对象中查询的。如果一个变量存在,那么这个变量的值就是未定义的。在一个函数(非嵌套)中,作用域链由两个对象构成,第一个函数的调用对象,第二个就是全局对象。当函数引用一个变量时,首先检查的是调用对象,其次才检查全局对象。在嵌套函数的作用域链中可以后在三个或更多的对象,查找方式以此类推。

(四).表达式和运算符

4.1算术运算符

4.1.1除法运算符

在js中,由于所有的数字都是浮点型的,所以除法的结果也是浮点型的,除数是0的结果为正无穷大或负无穷,而0/0的结果则是NaN.

4.1.2模运算符

取模操作的运算数通常都是整数,但它也适用于浮点数,如-4.3%2.1=-0.1;

4.1.3相等运算符和等同运算符

判定==运算符比较的两个值是否相等。

如果两个值具有相同的类型,那么就检测它们的等同性。

如果两个值的类型不同,它们仍然可能相等,用下面的规则和类型转换来检测它们的相等性。

1)如果一个值是Null,另一个值是Undefined,则它们相等。

2)如果一个值是字符串,另一个值是数字,那么字符串先转化为数字再进行比较

3)如果一个值是布尔值,另一个值为数字或字符串,布尔值和字符串都先转化为数字再进行比较,true为1,false为0.

4)如果一个值是对象,别一个是数字或字符串,则对象转换为相应的原始类型的值。

5)其它组合的值不等的。

4.1.4比较运算符(<,>,<=,=>)

这些比较运算符的运算数可以是任意类型的。但是比较运算只能在数字和字符串上执行,所以不是数字或字符串的运算数将被转换为数字或字符串。

4.1.5In运算符

In运算符要求左边的运算数是一个字符串,或可以被转换为字符串,右边的运算数是一个对象或数组。如果该运算符左边的值是其右边对象的一个属性名,它返回true。

Var point={x:1,y:2};

Var has_x_record=”x” in point;//return true

Var has_z_record=”z” in point;//return false

4.1.6instanceof运算符

Instanceof运算符要求左边的运算数是一个对象,右边的运算数是对象类型的名字。注意,所有对象都是类object类的实例。

例:

Var d=new Date();

d instanceof Date;//return true

d instanceof Object;//return true

d instanceof Number//return false

var a=[1,2,3];

a instanceof Array;//return true

a instanceof Object;//return true

4.1.7逻辑运算符

逻辑与运算符(&&)

先计算左边表达式的值,如果左边表达式值可以转换为false,那么返回的是左边表达式的值,否则,它将计算右边的表达式的值,并且返回这个表达式的值。

逻辑或运算符(||)

原理同逻辑与运算符,先计算左边表达式的值,如果左边表达式的值可以转换为true,则返回这个表达式的值,否则,它将计算右边表达式的值,并且返回该表达式的值。

逻辑非运算符(!)

在对操作数取反之前,!运算符先把它的运算数转换为一个布尔类型的值,这意味着,对任何值x应用两次运算符(即!!x)都可以将它转换成一个布尔值。第一次为了使操作数在布尔环境中取得操作数的相反的布尔值,而第二次就是使取得操作数的正确的布尔值!!

4.1.8typeof运算符

它测试一个操作数,返回一个字符串来表式一个操作数的类型。

对数字、字符串或布尔值,返回”number”、”string“、”boolean”,而对数组、对象和Null,它返回的是”object”,而对函数运算数,返回的是”function”,如果运算数是未定义的,它将返回”Undefined”.

4.1.9delete运算符

它将删除运数所指定的对象的属性、数组元素或变量。如果删除成功返回true,若不能删除,返回false。并非所有的属性和变量都是可以删除的,某些内部的核心和客户端属性不能删除,用var语句声明的用户定义变量也不能被删除。

注意,删除属性、变量或数组元素不只是把它们的值设置为undefined,当删除它们后,它们全部变成未定义的,也即不存在的,再次尝试读取它们时会出错。

Delete所能影响的只是属性值,并不能影响被这些属性引用的对象,即这些对象只要用其它属性引用就还存在!

4.1.10void运算符

它可以出现在任何类型操作数之前,它总是舍弃运算数的值,然后返回undefined.这种运算符通常用在客户端的javascript:Url中,在这里可以计算表式的值,但是不会显示出这个值。

open a widnow</a href=”javascript:void window.open();”>