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

    xiaoxiao2022-07-03  96

    运算符概述 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的值。

    最新回复(0)