如果两个值具有相同的类型,那么就检测它们的等同性。
如果两个值的类型不同,它们仍然可能相等,用下面的规则和类型
转换来检测它们的相等性。(数字有最高的优先级)
1)如果一个值是Null,另一个值是Undefined,则它们相等。 2)如果一个值是字符串,另一个值是数字,那么字符串先转化为数
字再进行比较
3)如果一个值是布尔值,另一个值为数字或字符串,布尔值和字符
串都先转化为数字再进行比较,true为1,false为0.
4)如果一个值是对象,别一个是数字或字符串,则对象转换为相应
的原始类型的值。
5)其它组合的值不等的。
5.5关系运算符
5.5.1比较运算符(<,>,<=,=>)
这些比较运算符的运算数可以是任意类型的。但是比较运算只能在
数字和字符串上执行,所以不是数字或字符串的运算数将被转换为数字或字符串。
1) 字符串和数字比较,转换为数字再进行比较。
2)操作数不能转换为数字或字符串时,比较结果为false。 3)若一个操作数为NAN或转换为了NAN,比较结果为false。
5.5.2In运算符
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
函数之所以可以由此运算符来检测属性,因为函数也可以有属性,
并且本身就是特殊的对象(或叫类更好些),所以由推开去,很多对象有的功能,函数和数组也有
5.5.3instanceof运算符(跟C#的is关键字类似)
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\\
5.6字符串运算符
字符串算符“+“中,字符串的优先级最高。 如:1+”2”=”12”,”2”+1=”21”.
5.7逻辑运算符
5.7.1逻辑与运算符(&&)
先计算左边表达式的值,如果左边表达式值可以转换为false,那么
返回的是左边表达式的值,否则,它将计算右边的表达式的值,并且返回这个表达式的值。
5.7.2逻辑或运算符(||)
原理同逻辑与运算符,先计算左边表达式的值,如果左边表达式的
值可以转换为true,则返回这个表达式的值,否则,它将计算右边表达式的值,并且返回该表达式的值。
5.7.3逻辑非运算符(!)
在对操作数取反之前,!运算符先把它的运算数转换为一个布尔类
型的值,这意味着,对任何值x应用两次运算符(即!!x)都可以将它转换成一个布尔值。第一次为了使操作数在布尔环境中取得操作数的相反的布尔值,而第二次就是使取得操作数的正确的布尔值!! 5.10其它运算符
5.10.2typeof运算符(与C#的typeof()运算符一样的)
它测试一个操作数,返回一个字符串来表式一个操作数的类型。
对数字、字符串或布尔值,返回”number”、”string“、”boolean”,
而对数组、对象和Null,它返回的是”object”,而对函数运算数,返回的是”function”,如果运算数是未定义的,它将返回”Undefined”.
5.10.4delete运算符
它将删除运数所指定的对象的属性、数组元素或变量或函数的属性。
如果删除成功返回true,若不能删除,返回false。并非所有的属性和变量都是可以删除的,某些内部的核心和客户端属性不能删除,用var语句声明的用户定义变量也不能被删除。
注意,删除属性、变量(数组不一样)不只是把它们的值设置为un
defined,当删除它们后,它们全部变成未定义的,也即不存在的,再次尝试读取它们时会出错。
Delete所能影响的只是属性值,并不能影响被这些属性引用的对象,
即这些对象只要用其它属性引用就还存在!
5.10.5void运算符
它可以出现在任何类型操作数之前,它总是舍弃运算数的值,然后
返回undefined.这种运算符通常用在客户端的javascript:Url中,在这里可以计算表式的值,但是不会显示出这个值。
open a widn
ow 六、语句
6.1switch语句
ECMAScript v3标准允许case 语句扣跟随任意的表达式。例如: Case 60*60:
Case Math.pi; Case n+1;
注意:由于匹配的case表达式是用===等同运算符判定的,而不是用
==运算符判定的,所以表达式必须在没有类型转换的情况下进行匹配。
6.9for/in语句
For(variable in object) {statement }
Variable应该是一个变量名,声明一个变量的var语句,数组的一个元
素或者是对象的一个属性。Object是一个对象名。
在循环体执行之前,对象的一个属性名会被作为字符串赋给变量variab
le。在循环体中可以使用这个变量和[]运算符查询该对象属性的值。
注意,for/in循环中的variable可以是任意的表达式,只要它们的值适
用于赋值表达式的的左边即可。
JS的数组是一种特殊的对象,因此可以像循环对象属性那样枚举数组下
标。
如果for/in循环的主体删除了一个还没有枚举出的属性,那么该属性就
不再枚举,如果循环主体定义了新属性,那么循环是否枚举该属性则由JS的实现决定。
For/in循环并不会遍历所有对象的所有可能的属性,那些被标记为只读
的、永久的或不可列举的(继承的也不可以),这些属性使用此语句是枚举不出来的,所有用户自定义的属性可以枚举的!