JavaScript操作符
操作符
一元加操作符
放在数值前面,对数值不会产生任何影响。例如:
1 | var num=25;num=+num;//结果依然为25 |
一元减操作符主要用于表示负数,例如将1转换成-1.例如:
1 | var num=25;num=-num;//结果依然为-25 |
位操作符
位操作符就是把数字全部转换成二进制01表示,然后依次对每个位进行相关的操作。
- 按位非(“~”):按位非操作的本质:操作数的负值减1。对比减一操作和按位非操作来说,由于按位非是在数值表示的最底层执行操作,因此速度更快。
- 按位与(“&”)
- 按位或(“|”)
- 按位异或(“^”):相同为0,不同为1
- 左移(“<<”):左移不会影响操作数的符号位。出现空位用0填充。
- 有符号的右移(“>>”):会将数值向右移动,但保留其符号位。遇到空位,就用符号位填充
- 无符号右移:(“>>>”):会将数值的所有32位都向右移动。遇到空位,用0填充。
布尔操作符
- 逻辑非(“!”);首先会将它的操作数转换为一个布尔值,然后再对其求反。返回的一定是布尔值
- 逻辑与(“&&”)适用于任何类型的操作数,但是不一定返回布尔值。如果第一个操作数是对象,则返回第二个操作数;如果第二个操作数是对象,则只有在第一个操作数的求值结果为true的情况下才会返回该对象;如果两个操作数都是对象,则返回第二个操作数;如果第一个操作数是null,则返回null;如果第一个操作数是NaN,则返回NaN;如果第一个操作数是undefined,则返回undefined。逻辑与属于短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值。
- 逻辑或(“||”)如果第一个操作数是对象,则返回一个操作数;如果第一个操作数的求值结果为false,则返回第二个操作数;如果两个操作数都是对象,则返回第一个操作数;如果两个操作数是null,则返回null;如果两个操作数是NaN,则返回NaN;如果两个操作数是undefined,则返回undefined。逻辑与属于短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值。
乘性操作符
- 乘法(
*
) 除法(/
) - 求模(
%
)
加性操作符
- 加法(
+
)数值算法同加法,字符串:如果两个都是字符串,就直接将两个操作符拼接起来,如果一个是字符串,则将另一个操作数转换为字符串,然后再将两个字符串拼接起来。 - 减法(
-
)数值算法同剑法,与加法不同的是,如果一个操作数是字符串或者非数值型,则先将其转换成数值然后再相减。
关系操作符
小于(<)、大于(>)、小于等于(<=)、大于等于(>=)这几个操作符都返回一个布尔值
如果是一个字符跟一个数值比较,会把该字符转换为数值,然后再比较
相等操作符
- 相等和不相等(==、!=):先转换再比较。null和undefined值是相等的;如果两个操作符都是对象,则比较他们是不是指向同一个对象。
- 全等和不全等(===、!==):仅比较不转换
1
2var result1=(“55”==55);//true,因为转换后相等,null和undefined值是不相等的,因为他们是不同类型的值
var result1=(“55”===55);//false,因为不同的数据类型不相等
赋值操作符
1 | (=)、(*=)、(/=)、(+=)、(-=)、(%=)、(<<=)、(>>=)、(>>>=) |
switch语句在比较值时用的是全等操作符,因此不会发生类型转换(例如“10”不等于10)
函数在定义时不必指定是否返回值,函数会在执行完return语句之后停止并立即退出,因此,位于return语句之后的任何代码都不会执行。return语句也可以不带有任何返回值。
严格模式对函数有一些限制:
1 | 不能把函数命名为eval或arguments |
理解参数
ECMAScript函数的参数与大多数其他语言中函数的参数有所不同。ECMAScript不介意传递进来多少个参数,也不在乎传进来参数是什么数据类型。也就是说,即便我们定义的函数只接收两个参数,在调用这个函数时也未必一定要传递两个参数。可以传递一个、三个甚至不传递参数,而解析器永远不会有什么怨言。之所以会这样,是因为ECMAScript中的参数在内部使用一个数组来表示的。函数接收到的始终都是这个数组,而不关系数组中包含哪些参数(如果有参数的话)。如果这个数组中不包含任何元素,无所谓;如果包含多个元素,也没有问题。实际上,在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。
其实arguments对象只是与数组类似,因为可以使用方括号语法访问它的每一个元素(即第一个元素是arguments【0】,第二个元素是arguments【1】,以此类推),使用length属性来确定传递进来多少个参数。
ECMAScript函数的一个重要特点:命名的参数只提供便利,但不是必须的。如果有参数,对应位置的参数可以和arguments对象元素参数互用。
关于arguments的行为,还有一点比较有意思。那就是它的值永远与对应命名参数的值保持同步。
没有传递值的命名参数将自动赋予undefined值。
ECMAScript函数没有重载,因为ECMAScript函数没有签名,因为其参数是由包含零或多个值的数组来表示的。而没有函数签名,真正的重载是不可能做到的。
ECMAScript如果定义了两个名字相同的函数,则该名字只属于后定义的函数