JavaScript权威指南(第6版) --- 自学笔记(22) --- 运算符概述

运算符概述
js的运算符用于算术表达式、比较表达式、逻辑表达式、赋值表达式等。
大多数运算符都是由标点符号表示的,比如"+"、"="。而一些运算符则是由关键字表示的,比如"delete"、"instanceof"。
js的运算符详细查看:http://www.w3school.com.cn/js/js_operators.asp,此处不做详细说明每个运算符,后期都会慢慢接触到。

操作数的个数
大多数运算符都是二元运算符,即将两个表达式合成一个稍复杂的表达式,也就是说需要2个操作数。例如:x*y、x/y、x%y等。
一元运算符,即需要一个操作数,例如 -x、++x、--x。
三元操作符,即需要三个操作数,例如 x == 1? x : y; 如果x等于1则返回x,否则返回y。

操作数类型和结果类型
一些运算符可以用于任何数据类型,但仍然希望他们的操作数是指定类型的数据。并且大多数运算符返回一个特定类型的值。
js运算符通常会根据需要对操作数进行类型转换。

console.log('"3" * "5"的值 = ' + ("3" * "5")); // js自动将字符串3和5,转换成数字的3和5

但有一些操作符对操作数类型有依赖,最明显的就是"+",如果两边都是数字,则进行加法运算,如有有一边是字符串,则进行 字符串拼接。同样"<"也可以操作数字或者字符串。

console.log('3 + 5 的值 = ' + (3 + 5));
console.log('"3" + 5的值 = ' + ("3" + 5));
console.log('3 + "5"的值 = ' + (3 + "5"));
console.log('"3" + "5"的值 = ' + ("3" + "5"));

运行结果:
3 + 5 的值 = 8
"3" + 5的值 = 35
3 + "5"的值 = 35
"3" + "5"的值 = 35

左值
是一个古老的术语,它是指表达式只能出现在赋值运算符的左侧。在js中,变量,对象的属性,数组元素均是左值,ECMAScript规范允许内置函数返回一个左值,但自定义函数则不能返回左值。

运算符的副作用
赋值运算符,如果给一个变量或者属性赋值,那么那些使用这个变量或者属性的表达式的值都会改变。
"++"递增、"--"递减运算符,与此类似,因为他们包含隐式的赋值。
delete运算符,删除一个属性,就像给这个属性赋值undefined。
其他的js运算符都没有副作用,但函数调用表达式和对象创建表达式有些特别,在函数体或者构造函数内部运用了这些运算符并产出副作用的时候,我们说函数调用表达式和对象创建表达式是由副作用的。

运算符优先级
优先级由高到低排序如下:
第一级:++,--,-(取反),+(转换为数字),~(按位求反),!(逻辑非),delete(删除属性),typeof(检测类型),void(返回undefined值)
第二级:*(乘法),/(除法),%(取余)
第三级:+(加法),-(减法),+(字符串连接)
第四级:<<(左位移),>>(有符号右位移),>>>(无符号右位移)
第五级:<,<=,>,>=(比较数字顺序,比较字母在字母表中顺序),instanceof(测试对象类),in(测试属性是否存在)
第六级:==(判断相等),!=(判断不等),===(判断恒等),!===(判断非恒等)
第七级:&(按位与)
第八级:^(按位异或)
第九级:|(按位或)
第十级:&&(逻辑与)
第十一级:||(逻辑或)
第十二级:?:(条件运算符)
第十三级:=,*=,/=,%=,+=,-=,&=,^=,|=,<<=,>>=,>>>=(变量赋值或运算且赋值)
第十四级:,(忽略第一个操作数,返回第二个操作数)

var x = "Hello" + (" world", " from here!!");
console.log(x); // Hello from here!! 忽略第一个操作符,返回第二个操作符

运算符优先级控制运算执行的顺序。优先级高的运算符总优先于优先级低的运算符。
可以显示使用圆括号重新运算符的优先级,例如 var w = (x + y) * z;
赋值运算符的优先级非常低,通常总在最后执行。
属性访问表达式和调用表达式,优先级要高于上面所有运算符。

console.log(typeof this.test()); // 虽然typeof 的优先级最高的运算符之一,但是还是在函数调用之后才执行的
function test() {  
    console.log("test inner");
}

执行结果:
test inner
undefined // 函数没有返回值,所以typeof 结果是undefined

运算符的结合性
结合性指定在多个具有相同优先级的运算符表达式中的运算顺序。
例如,从左到右指运算的执行是按照从左到右的顺序进行。
一元操作符,赋值,三元条件运算符都具有从右至左的结合性。

var w = x - y - z; 等价于 var w = ((x - y) - z);
x = ~-y; 等价于 x = ~(-y);
w = x = y = z; 等价于 w = (x = (y = z));
q = a? b : c? d : e? f : g; 等价于 q = a? b : (c? d : (e? f : g));

运算顺序 
运算符的优先级和结合性规定了他们再复杂表达式中的运算顺序,但并没有规定子表达式的计算过程中的运算顺序。
js总是严格按照从左到右的顺序来计算表达式。
例如:表达式 w = x + y * z,将首先计算子表达式w,然后x,y,z,然后y的值和z的值相乘,再加上x的值,最后将其赋值给表达式w所指代的变量或者属性。给表达式添加括号会改变乘法,加法和赋值运算的关系,但从左至右的顺序不会改变。
只有在任何一个表达式具有副作用而影响到其他表达式的时候,其求值顺序才会和看上去有所不同。如果表达式x中的一个变量自增1,这个变量在表达式z中使用,那么实际上,先计算出了x的值,再计算z的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值