操作符包括算术操作符、位操作符、关系操作符、相等操作符。操作符一般用于数值型,如果不是数值型会被转换成数值型,对象会先调用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
也不支持函数重载,同名函数会被后一个覆盖。
网友评论