运算符

首页 > JavaScript语法 > 运算符

目录

■ 一览

&&, &=, &, ~, | , ^, , , ? :, --, --, /=, /, ==, ===, >, >=, ++, ++, <<=, <<, <, <=, -=, -, %, %=, *=, *, !=, !==, ^=, ! , ||, |=, +=, +, >>=, >>, =, >>>=, >>>

赋值运算符

var = exp

把值 exp 赋予变量 var 。等于号(=)不是相等而是赋值的意思。

xx = 5;      // 把 5 赋值给 xx
yy = xx;     // 把 xx 的值(= 5)赋予 yy
zz = "ABC";  // 把值 "ABC" 赋予变量 zz

下面的语句的意思是把变量 xx 的值加上2,再赋值给变量 xx 。如果 xx 本来的值为5,那么这条语句运行完后 xx 的值就变成7。

xx = xx + 2:  // 把 xx 的值加上 2 再赋值给 xx

下面的语句的意思是把 5 赋值给变量 yy 和 xx 。

yy = xx = 5;   // 把 5 赋值给变量 yy 和 xx

算术运算符

exp1 + exp2
exp1 - exp2
exp1 * exp2
exp1 / exp2
exp1 % exp2

exp1exp2 的加法、减法、乘法、除法计算。运算符 % 用来求 exp1 除以 exp2 的余数。

xx = 3 + 2;   // 把 3 + 2 的结果 5 赋值给变量 xx
xx = 3 - 2;   // 把 3 - 2 的结果 1 赋值给变量 xx
xx = 3 * 2;   // 把 3 * 2 的结果 6 赋值给变量 xx
xx = 3 / 2;   // 把 3 / 2 的结果 1.5 赋值给变量 xx
xx = 3 % 2;   // 把 3 % 2 的结果 1 赋值给变量 xx

使用运算符 + 的时候要注意,当 exp1exp2 之中有一个是(或两者都是)字符串的时候,运算符 + 将产生连接字符串的作用,而非算术运算符的作用。比如说下面的例子,xx 的值不会是 127 。


xx = "123" + 4;   // xx 被赋予的值为"1234"

注意输入在表单里的值也会被看成是字符串,如果想当作数值使用的话,可以在使用前先减0。运算符 - 只有算术运算符的功能,如果把字符串"123" 减去 3 的话,结果会是数值 120 。

<script type="text/javascript">
<!--
function func() {
    alert(document.F1.T1.value + 4);        // 结果为"1234"
    alert((document.F1.T1.value - 0) + 4);  // 结果为127
}
// -->
</script>
<form name="F1" action="#">
<input type="text" name="T1">
<input type="button" value="OK" onclick="func()">
</form>
var++
++var
var--
--var

xx++ 是 xx 的值加 1 的意思。xx-- 是 xx 的值减 1 的意思。xx++ 会先使用 xx 的值再把 xx 加1,++xx 则先把 xx 加1再使用 xx 的值。xx-- 和 --xx 也一样。

a = 5; a++:     // a 的值为6
a = 5; b = a++; // a 的值为6,b 的值为5
a = 5; b = ++a; // a 的值为6,b 的值为6

■ 关系运算符

exp1 == exp2
exp1 != exp2

== 运算符判断 exp1exp2 是否相等,相等的话返回值为 true(真),不相等的话返回值为 false(假)。!= 运算符判断 exp1exp2 是否不等,不相等的话返回值为 true(真),相等的话返回值为 false(假)。数值和字符串都能使用。

if (xx == 5) {
    alert("xx is five.");
}
if (yy != "ABC") {
    alert("yy is not ABC.");
}

数值和字符串互相比较的时候,通常都会自动转换类型。比如下面代码的比较结果为 true。

if ("123" == 123) {
    alert("true");
}
exp1 < exp2
exp1 <= exp2
exp1 > exp2
exp1 >= exp2

比较 exp1exp2 的大小并返回 true(真)或 false(假)。上面的运算符分别为小于(<)、小于等于(<=)、大于(>)、大于等于(>=)。

if (xx < 123) {
    alert("xx 比 123 小。");
}

当这些运算符用来比较字符串的时候,会以英文字母的顺序来比较。

if (xx < "H") {
    alert("xx 的顺序在 H 前面。");
}
exp1 === exp2
exp1 !== exp2

上面两个运算符属于精准判断。当数值和字符串互相比较的时候,== 运算符与 != 运算符都会自动转换类型进行判断,而 === 运算符与 !== 运算符则不进行自动转换,数值与字符串的比较结果永远是 false 。

if ( 123  ==   123 ) { …… }    // true(真)
if ("123" ==  "123") { …… }    // true(真)
if ("123" ==   123 ) { …… }    // true(真)
if ( 123  ==  "123") { …… }    // true(真)
if ( 123  ===  123 ) { …… }    // true(真)
if ("123" === "123") { …… }    // true(真)
if ("123" ===  123 ) { …… }    // false(假)
if ( 123  === "123") { …… }    // false(假)

■ 逻辑运算符

exp1 && exp2

exp1 为真,并且,exp2 也为真的时候,返回值为真,否则返回值为假。下面的例子里,当 mon 大于等于 1,并且小于等于 12 的时候,运行 if 语句内的代码。

if ((1 <= mon) && (mon <= 12)) {
    alert("xx is between 1 and 12.");
}
exp1 || exp2

exp1 为真,或者,exp2 为真的时候,返回值为真,否则返回值为假。下面的例子里,当 xx 的值为 "ABC",或者为 "abc" 的时候,运行 if 语句内的代码。

if ((xx == "ABC") || (xx == "abc")) {
    alert("xx is ABC.");
}
!exp1

exp1 的值为假的时候,返回值为真。

if (!(xx == 5)) {
    alert("xx is not five.");
}

■ 条件运算符

exp1 ? exp2 : exp3

exp1 的值为真的时候,返回值为 exp2 ,否则返回值为 exp3 。下面的例子里,当 xx 大于等于 5 的时候,把返回值 "big" 赋值给变量 yy ,否则就把返回值 "small" 赋值给 yy 。

yy = (xx >= 5) ? "big" : "small";

■ 逗号运算符

exp1, exp2

永远返回 exp2 的值。但是要注意,逗号运算符比赋值运算符的优先度低,所以代码 xx = 1, 2; 会被解释为 (xx = 1), 2; 。另外,在函数的参数列表中用逗号(,)隔开各参数,这里的逗号不会被解释成逗号运算符。

b=2;
c=7;
d=7;

a1=(++b,--c);   // 返回值为--c也就是6,所以a1的值为6
a2=++b,--d;     // 赋值运算符优先于逗号运算符,所以a2的值为++b也就是3

■ 位运算符

exp1 & exp2
exp1 | exp2
exp1 ^ exp2
~exp1

exp1exp2 看成4字节的整数,进行 AND(&)、OR(|)、XOR(^)、NOT(~)运算。

xx = 0x87654321 & 0xffff0000;  // xx 的值为 0x87650000
xx = 0x87654321 | 0xffff0000;  // xx 的值为 0xffff4321
xx = 0xffff0000 ^ 0xff00ff00;  // xx 的值为 0x00ffff00
xx = ~0xffff0000;              // xx 的值为 0x0000ffff
exp1 << exp2
exp1 >> exp2
exp1 >>> exp2

exp1 看成4字节的整数,将 exp1 左移(<<)、右移(>>)、补零右移(>>>) exp2 位。>> 在左端补最大的数字,而 >>> 在左端补零。

xx = 0x12345678 << 8;  // xx 的值为 0x34567800
xx = 0x12345678 >> 8;  // xx 的值为 0x00123456
xx = 0x87654321 >> 8;  // xx 的值为 0xff876543
xx = 0x87654321 >>> 8; // xx 的值为 0x00876543

看不懂无所谓,做普通网页基本用不到。

■ 扩展赋值运算符

var += exp
var -= exp
var *= exp
var /= exp
var %= exp
var &= exp
var |= exp
var ^= exp
var <<= exp
var >>= exp
var >>>= exp

比如 xx += 5; 是 xx = xx + 5; 的意思。同样,xx -= 5; 是 xx = xx - 5; 的意思。以此类推。

xx += 5;    // 相当于 xx = xx + 5;
xx -= 5;    // 相当于 xx = xx - 5;
xx *= 5;    // 相当于 xx = xx * 5;
xx /= 5;    // 相当于 xx = xx / 5;
xx %= 5;    // 相当于 xx = xx % 5;
xx &= 0xff; // 相当于 xx = xx & 0xff;
xx |= 0xff; // 相当于 xx = xx | 0xff;
xx ^= 0xff; // 相当于 xx = xx ^ 0xff;
xx <<= 8;   // 相当于 xx = xx << 8;
xx >>= 8;   // 相当于 xx = xx >> 8;
xx >>>= 8;  // 相当于 xx = xx >>> 8;

■ 运算符的优先级

运算符的优先级如下表所示。即使你可以背出各运算符的优先级,但不代表每个看代码的人都能背出,所以推荐尽量把优先运行的运算符用括号括起来,让每个人都能看明白。

优先级运算符



数组([]) 括号(( ))
増減(++ --) 负号(-) 取反(~) NOT(!)
乘除余(* / %)
加减(+ -) 连接字符串(+)
位移(<< >> <<<)
比较(< <= >= >)
比较(== != === !==)
AND(&)
XOR(^)
OR(|)
且(&&)
或(||)
条件(? :)
赋值(=) 扩展赋值(+=等)
逗号(,)