最后需要注意的是,“<=”和“>=”运算符在判断相等的时候,并不依赖相等运算符和和严格相等运算比较规则。相反,小于等于运算符芝是简单的“不大于”,大于等于运算只是“不小于”。只有一个例外,的那个一个操作数(后转换后)是NaN的时候,所有4个比较运算符均会返回fasle.
iii.in运算符
in运算符希望它的左操作数是一个字符串或者可以转换为字符串,希望它的右侧是一个对象。如果右侧的对象拥有一个名为左操作数值的属性名,那么表达式返回true.例如
复制代码 代码如下:
var point = {
x: 1,
y: 1
} //定义一个对象
"x" in point //=>true 对象有一个名为x的属性
"z" in point //=>false 对象无名为z的属性
"toString" in point // =>true 对象继承了toString方法
var data = [7, 8, 8]
"0" in data //=>true 数组包含0
1 in data //=>true 数字转换为字符串
3 in data //=>fase 没有索引为3的元素
iiii.instanceof运算符
instanceof运算符希望左操作符为一个对象,右操作数标示对象的类。如果左侧的对象是右侧类的实例,则表达式返回true;负责返回false.第9章将会讲到。javascript对象的类是通过初始化他们的构造函数的来定义的。这样的话,instanceof的右操作数应当是一个函数。比如:
复制代码 代码如下:
var d = new Date(); //构造一个新对象
d instanceof Date; //计算结果为true, d是Date() 创建的
d instanceof Object //计算结果为true ,所有的对象都是Object的实例
d instanceof Number //计算结果为 false,d不是一个Number对象
var a = [1,2,3] //数组直接量创建数组
a instanceof Array //计算结果true a为数组
a instanceof Object //true 所有的数组都是对象
a instanceof RegExp //fasle 数组不是正则表达式
需要注意的是,所有对象都是Object的实例。当通过instanceof盘对一个对象是否为一个类的实例的时候,这个判断也叫“父类”(superclass)的检测,如果instanceof的左侧操作对象不是对象的话,instanceof返回false。如果右侧操作不是函数,则抛出类型错误的异常。
为了理解instanceof运算符是如何工作的,必须首先理解“原型类”(prototype chain),原型链作为javascript的继承机制,将在6章2节2小节详细描述。
为了计算表达式o instanceof f ,javascript笔仙首先计算f.prototyoe,然后在原型链中查询o,如果找到,那么o是f(或者f的父类)的一个实例,那么返回true。反之false
10.逻辑表达式
逻辑运算符"&&"、“||”、“!”是对操作进行布尔算术运算,经常和关系运算符一起配合使用,逻辑运算符将多个关系表达式组合起来组成一个更复杂的表达式。
i.逻辑与
"&&"运算符可以从三个不同的层次进行理解。最简单一层理解是,当操作数都是布尔值是,“&&”对两个布尔值执行布尔与(AND)操作,只有在第一个操作数和第二个操作数都是true的时候,它才返回true.如果其中有一个操作数为false.则它返回false.
"&&"长用来连接两个关系表达式
x == 0 && y == 0; //只有在x和y都是0时,才返回true
关系表达式总是返回true或false,因此当这样使用的时候,“&&”本身也返回true或 false。关系运算符的优先级要比"&&"(和“||”)要高,因此类似这种表达式可以放心地书写,而不用补充园括号。