2019-12-06 JS 数学运算符

Q1 自己搜索查询num++(后面自加)和++num(前面自加)的区别,并进行总结.

num++ 后置++,是先赋值再加1

看下面的例子

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8"/>
    <script type="text/javascript">
    var num = 2;
    document.write(num++ + "<br/>");
    document.write(num);
    </script>
  </head>
  <body>
  </body>
</html>

猜测,根据num++的特性,第一次打印的时候num并没有执行加1的操作,所以打印的是num的初始值2,经过打印之后加1,后面再一次打印,num的值变成了3,看结果验证我们的猜想


image.png
++num 前置++,是先加1再赋值

看例子

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8"/>
    <script type="text/javascript">
    var num = 2;
    document.write(++num + "<br/>");
    document.write(num);
    </script>
  </head>
  <body>
  </body>
</html>

猜想前置++是先加1再赋值,那第一次打印的时候他先加1再打印,所以是3,第二次依旧是3


image.png

Q2 自己搜索查询如何利用Math方法对得到的结果进行保留两位小数,四舍五入,向上取整,向下取整等操作,并进行总结。

看程序总结math的所有计算操作

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8"/>
    <script type="text/javascript">
    var num = 2.23456;
    var num1 = 2.598;
    // 1、保留2位小数
    document.write("保留2位小数:" + num + " = " + Math.round(num).toFixed(2) + "<br/>");
    document.write("保留2位小数:" + num1 + " = " + Math.round(num1).toFixed(2) + "<br/>" + "<br/>");
    document.write("保留2位小数:" + num + " = " + Math.ceil(num).toFixed(2) + "<br/>");
    document.write("保留2位小数:" + num1 + " = " + Math.ceil(num1).toFixed(2) + "<br/>" + "<br/>");
    document.write("保留2位小数:" + num + " = " + Math.floor(num).toFixed(2) + "<br/>");
    document.write("保留2位小数:" + num1 + " = " + Math.floor(num1).toFixed(2) + "<br/>" + "<br/>");
    // 2、四舍五入
    document.write("四舍五入:" + num + " = " + Math.round(num) + "<br/>");
    document.write("四舍五入:" + num1 + " = " + Math.round(num1) + "<br/>" + "<br/>");
    // 3、向上取整
    document.write("向上取整:" + num + " = " + Math.ceil(num) + "<br/>");
    document.write("向上取整:" + num1 + " = " + Math.ceil(num1) + "<br/>"+ "<br/>");
    //4、向下取整
    document.write("向下取整:" + num + " = " + Math.floor(num) + "<br/>");
    document.write("向下取整:" + num1 + " = " + Math.floor(num1) + "<br/>"+ "<br/>");
    </script>
  </head>
  <body>
  </body>
</html>

结果如图


image.png
总结
  • 保留两位小数都是先对小数进行四舍五入或者向上取整或者向下取整之后再保留的,所以要先用round() \ ceil() \ floor()再保留
  • 只用round()是四舍五入取整的意思
    下面总结math()对象的所有对象方法
方法 描述
ceil(x) 对数进行上舍入。
floor(x) 对数进行下舍入。
round(x) 把数四舍五入为最接近的整数。
random() 返回 0 ~ 1 之间的随机数。
max(x,y) 返回 x 和 y 中的最高值。
min(x,y) 返回 x 和 y 中的最低值。
abs(x) 返回数的绝对值。
exp(x) 返回 e 的指数。
log(x) 返回数的自然对数(底为e)。
pow(x,y) 返回 x 的 y 次幂。
sqrt(x) 返回数的平方根。
sin(x) 返回数的正弦。
cos(x) 返回数的余弦。
tan(x) 返回角的正切。
asin(x) 返回数的反正弦值。
acos(x) 返回数的反余弦值。
atan(x) 以介于 -PI/2 与 PI/2 弧度之间的数值来返回 x 的反正切值。
atan2(y,x) 返回从 x 轴到点 (x,y) 的角度(介于 -PI/2 与 PI/2 弧度之间)。
toSource() 返回该对象的源代码。
valueOf() 返回 Math 对象的原始值。

Q3 分别指出以下运算的结果

下面直接贴运算结果

<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8" />
  <script type="text/javascript">

    var result = 42 == "42";
    document.write("{42 == '42'} = " + result + "<br/>");

    result = 42 === "42";
    document.write('{42 === "42"} = ' + result + "<br/>");

    result = "foo" == ["foo"];
    document.write('{"foo" == ["foo"]} = ' + result + "<br/>");

    result = "0" == false;
    document.write('{"0" == false} = ' + result + "<br/>");

    result = "" == [];
    document.write('{"" == []} = ' + result + "<br/>");

    result = "" == 0;
    document.write('{"" == 0} = ' + result + "<br/>");

    result = [] == 0;
    document.write('{[] == 0} = ' + result + "<br/>");

    result = "true" == true;
    document.write('{"true" == true} = ' + result + "<br/>");

    result = 0 == "\n";
    document.write('{0 == "\n"} = ' + result + "<br/>");

    result = 0 == null;
    document.write('{0 == null} = ' + result + "<br/>");

    result = false == {};
    document.write('{false == {}} = ' + result + "<br/>");

    result = 0.1 + 0.2 == 0.3;
    document.write('{0.1 + 0.2 == 0.3} = ' + result + "<br/>");

  </script>
</head>

<body>
</body>

</html>
image.png
总结
  • x和y都是null或undefined,规则: 没有隐式类型转换,无条件返回true

  • x或y 有一方是null或undefined,
    规则: 没有隐式类型转换,无条件返回false

  • x或y是NaN : NaN与任何数字都不等(包括他自己)规则:没有隐式类型转换,无条件返回false

  • x和y都是string,boolean,number
    规则:有隐式类型转换

    (1) string => number

    会通过Number()方法将string类型的数据转成number

    (2) boolean => number

    先调用Boolean(),再调用Number()

  • x或y 有一方是复杂数据类型

    规则:有隐式类型转换,会先获取复杂数据类型的原始值之后再做比较

    获取原始值:先调用valueOf(),在调用toString()方法

  • x和y都是复杂数据类型

    规则:只比较地址,如果地址一致则返回true,否则返回false

  • 转换特殊情况

转换为布尔值时的假值有:undefined、null、空字符串、0、-0、NaN,其余例如{}、[]都是真值

  • 常用特殊运算符

    加号运算符(+)

    若+两边存在一个字符串,将另一个也转为字符串进行字符串拼接

    其他情况下,都转为数值类型

  • 减号运算符(-)

    减号 - 将两边都转换成数值类型,不能连接字符串

  • 非运算符(!)

    逻辑非 ! 将其后变量或表达式转为布尔值

详情参考js盲点——隐式类型转换

Q4 分别指出以下四处变量a对应的值?并说明为何等于该值。

var a = 42;

a++;  // 此时 a 的值?
a;  // 此时 a 的值?

++a;  // 此时 a 的值?
a;  // 此时 a 的值?

猜测:

a++;此时a的值是42,因为是后置++,先赋值再自加,所以现在还没有赋值,没有加1。
a; 此时a的值是43,因为经过上面的运算,a加了1
++a; 此时a的值时44,因为是先加1再赋值
a;此时a的值仍是44,因为上面已经运算过了。
验证:

<script type="text/javascript">
    var a = 42;

    document.write("a++ = " + a++ + "<br/>");
    document.write("a = " + a + "<br/>");
    document.write("++a = " + ++a + "<br/>");
    document.write("a = " + a + "<br/>");

  </script>
image.png

Q5 分别指出以下四处变量a对应的值?并说明为何等于该值。

var a = 42 & 24;
 // 此时 a 的值?

a = a && 34; 
 // 此时 a 的值?

a = a | 54; 
 // 此时 a 的值?


a = a || 68; 
 // 此时 a 的值?

测试结果如下:

<script type="text/javascript">
    var a = 42 & 24;
    document.write("42 & 24 = " + a + "<br/>");

    a = a && 34;
    document.write("a && 34 =  " + a + "<br/>");

    a = a | 54; 
    document.write("a | 54 =  " + a + "<br/>");
    
    a = a || 68; 
    document.write("a || 68 =  " + a + "<br/>");
  </script>
image.png

解释:
&是按位与,两个数值的每一位分别相与,同时为1才得1,只要一个为0就为0。
|是按位或,两个数值的每一位分别相或,两个位只要有一个为1,那么结果都为1。否则就为0
&& 假前真后
|| 真前假后
42的二进制是0010 1010
24的二进制是0001 1000

42 & 24 = 0000 1000 = 8
8 && 34 = 34 //只要不是数字0都为真,所以根据假前真后的原则,取后面的34
//34的二进制是0010 0010
//54的二进制是0011 0110
34 | 54 = 0011 0110 = 54
54 || 68 = 54 //真前假后

更详细的资料可以看JS中的逻辑运算符&&、||,位运算符|,&

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。