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中的逻辑运算符&&、||,位运算符|,&

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352