操作符包括算术操作符、位操作符、关系操作符、相等操作符。操作符一般用于数值型,如果不是数值型会被转换成数值型,对象会先调用valueOf(),不能计算的话,调用toString()
一元操作符
只能操作一个值的操作符叫做一元操作符
递增和递减操作符
前置和后置的自增和自减操作符
++ --
不展开了
非计算值的操作举例
var s1 = "2"
var s2 = "z"
var b = false
var f = 1.1
var o = {
valueOf:function(){
return -1;
}
}
s1++ //3
s2++ //NaN
b++ //1
f-- //0.100000000000009
o--//-2
一元加减操作符
+放在数值前面没有影响,放在非数值前会使用Number()转成数值
-用于表示负数,放在非数值前会使用Number()转成数值
位操作符
ECMAScript中数值都是以64位存储,但位操作符不直接操作64位值,会先转换成32位,然后计算,然后再转换回64位。
对于有符号的整数,32位中前31位表示数值,第32位表示符号位,0为正数,1为负数。18的二进制表示00000000000000000000000000010010,或者10010。负数也以二进制码表示,但是负数使用的是补码。计算补码的步骤为:
- 求数值绝对值的二进制码
- 求得到的二进制码反码
- 反码加1
求 -18 的计算机二进制表示
绝对值的二进制码:0000 0000 0000 0000 0000 0000 0001 0010
反码:1111 1111 1111 1111 1111 1111 1110 1101
加1:1111 1111 1111 1111 1111 1111 1110 1110,
处理有符号整数时,位31不能访问,位31就是第32位
默认ECMAScript中,整数都是有符号整数,当然也有无符号整数,无符号整数都是正数,范围更大。
64->32->64,这种方式的处理会导致副作用,NaN和Infinity应用位操作时,会被当做0处理
1、按位非(NOT)
~,0变1,1变0
25求反-26 -26求反25
按位非的本质:操作数的负值-1(和计算机中负数的表示法有关)
2、按位与(AND)
&,1&1为1,1&0为0,0&0为0
3、按位或(OR)
|,1|1为1,1|0为1,0|0为0
4、按位异或(XOR)
^,相同为0,相反为1
5、左移
<<,左移不移符号位,左移n位,数值扩大2的n次方
6、右移
>>,此种右移也不移符号位,右移n位,数值缩小2的n次方
7、符号右移
>>>,此种右移会移动符号位,由于移位操作符都是以0作为填充,所以负数(符号位用1表示)符号右移会变成正数,同时符号右移越小,数值越巨大。正数符号右移,和正常的右移相同
布尔操作符
又叫逻辑操作符,有与或非
非
!,false变true,true变false,可以应用于任意类型,会先将值转换成boolean类型。转换规则如下:
与
&&,真真为真,真假为假,假假为假
或
||,真真为真,真假为真,假假为假
乘性操作符
乘法
除法
求模
加性操作符
加法
减法
关系操作符
小于(<),大于(>),大于等于(>=),小于等于(<=)
相等操作符
相等和不相等
全等和不全等
三目运算符
?:
赋值操作符
逗号操作符
语句
if语句
do-while语句
while语句
for语句
for-in
label
break continue
with
switch
以上东西太繁琐,以后慢慢补充
函数
语法
function 函数名(参数表){
函数体
}
函数不必指定返回值类型,可以用return返回任意值
函数示例
function abc(a,b,c) {
alert(a+b+c)
}
abc(1,2,3)
只写return,不写值,会返回undefined,不写return,也会返回undefined
函数参数
ECMAScript函数参数其实是一个数组,名为arguments,函数调用不必完全遵循函数定义,可以传多个参数,也可以不传任何参数。arguments其实只是与数组类似,因为支持下标语法。比如按照参数传入顺序依次取值,arguments[0],arguments[1],arguments[2],使用length属性确定参数个数。
function abc(a,b,c) {
alert(arguments[0]+arguments[1]+arguments[2])
}
abc(1,2,3)
不按函数原型调用
function abc() {
alert(arguments[0]+arguments[1]+arguments[2])
}
abc(1,2,3)
函数不支持重载,但是我可以使用一些手段实现函数重载
function doAdd() {
if(arguments.length == 1){
return arguments[0]
}else if(arguments.length == 2){
return arguments[0] + arguments[1]
}else if(arguments.length == 3){
return arguments[0] + arguments[1] + arguments[2]
}
}
alert(doAdd(1))
alert(doAdd(1,2))
alert(doAdd(1,2,3))
arguments中的值和参数名的值保持一致
function abc(a) {
a = 100
alert(arguments[0])
}
abc(1)
function abc(a) {
arguments[0] = 100
alert(a)
}
abc(1)
这并不是说,arguments和a内存是一份,其实是两份,只不过js帮我们让这两个值保持一致了,另外高程上说,修改参数,不会反映到arguments,可是经过试验,这种一致是双向的。
arguments的length属性的长度是由实际传入参数决定的,不是由函数定义决定的。没有传入值的参数会被自动赋值为undefined。ECMAScript中的所有参数传递都是值传递,没有引用传递。ECMAScript也不支持函数重载,同名函数会被后一个覆盖。