JavaScript 02 (运算符和选择结构)

js的关系运算符,js的逻辑运算符,js的赋值运算符,js的运算符的优先级问题,js的自增和自减,js的选择结构

目录:

一、关系运算符

二、逻辑运算符

三、赋值运算符

四、a++和++a

五、运算符的优先级问题

六、选择结构(if/else if/else)



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

欢迎大家去我的个人技术博客看看,点赞收藏注册的都是好人哦~

https://xiaowu.xyz

一、关系运算符


首先,关系运算符得到的结果一定是一个布尔值的结果,也就是true或者false.



关系运算符有哪些?

<、>、<=、>=、==、===、!=、!==

注意:单个等号(=),表示的是赋值,而不是比较。



<、>、<=、>=是小学数学内容,类似于5>3,3<5这样的,就不细谈了。

两个等号(==)      判断两个值是否相等,只比较数值 不比较类型         

 !=        判断两个值是否不相等,只比较数值 不比较类型

三个等号(==)       判断两个值是否全等,既比较数值 又比较类型

!==       判断两个值是否不全等 (既比较数值 又比较类型)


数字的比较十分简单,我们需要记住一些特殊的比较。

    // 特殊的

    // undefined == null  //undefined 等于 null 

    // 0 != null;    //0  不等于 null

    // NaN != NaN   // NaN  不等于 NaN

    // "NaN" != NaN  // 字符串类型的NaN  不等于  number类型的NaN

    // "NaN" == "NaN"  // 字符串类型的NaN  等于 字符串类型的NaN 

    // 1 == true  // number类型的1  等于  布尔类型的true

    // 0 == false  // number类型的0  等于  布尔类型的false

    // 2 != true   // number类型的2   不等于  布尔类型的true

    // null != false  // null   不等于  布尔类型的false 

    // undefined != false  //undefined 不等于  布尔类型的false 

    // NaN != false  //NaN不等于  布尔类型的false 



null != false // null   不等于  布尔类型的false

undefined != false // undefined 不等于  布尔类型的false 

NaN != false // NaN 不等于  布尔类型的false 

这三个会有很多程序员有疑问。

因为我们肯定有用过

if(!null / undefined / NaN){

    alert(1);

}


这个1肯定会弹出,那么( !null / undefined / NaN) 一定是 true,那么(null / undefined / NaN),一定是false

所以得到:

null                 == false

undefined     == false

NaN                == false

但是!这个是错误的!!!

写在if的表达式里,相当于:

if(Boolean(null / undefined / NaN)){}

所以(null / undefined / NaN)会被转换为布尔值类型的false来进行比较。

所以!!!

(null / undefined / NaN)直接进行比较是不等于false的



js中的 关系表达式不能连写(是可以写,但是结果不好理解,所以我们为什么要为难自己)

var c = 3 < 5 <  2;   //true    首先3<5  =>  true ,然后 true<2  ,true会被转成1,1<2  => true;


二、逻辑运算符

与(&&)    或(||)    非(!)


与/且 (&&) 同真为真 遇假为假 (找假的)

var result = 5 > 3 && 5 < 10;                                 // true && true => true

var result = 5 > 3 && 5 < 10 && 1 == false;          // true && true && false =>false


或 (||) 同假为假 遇真为真 (找真的)

    var result = 5 > 3 || 5 < 10;       // true || true => true

    var result = 5 > 3 || 5 > 10;       // true || false  => true

    var result = 5 < 3 || 5 > 10;       // false || false  => false

非(!) 颠倒是非,真变成假,假变成真

    var result = !(5 > 3);         // false

    var result = !false;            // true

    var result = !1;                 // false

    var result = !null;             // true



拓展:

我们需要明白一点,逻辑运算符不会去改变变量的类型,我们之前的例子出现的结果都是false和true是因为关系运算符的结果。

所以 

会有这样的操作

var a = 1 && 2;            //2

var a = 0 && 5;            //0

var a = 1 || 2;               //1

var a = 0 || 5;               //5

var b =  1 && 2 || 3;     //2 

思路是这样的

遇到&&的时候

会将 &&两边的值看做是一个布尔类型的值(只是判断的时候隐式转换了,但是没有改变原值)

当&&遇到true的时候,会继续往后找,直到找到 某个值 转换为布尔值为false,他就会停下来,那个值就是最终的结果。

如果没有值为false的,就会一直找到最后,输出最后一个值。

口诀:假前真后


遇到||的时候

会将 ||两边的值看做是一个布尔类型的值(只是判断的时候隐式转换了,但是没有改变原值)

当&&遇到false的时候,会继续往后找,直到找到 某个值 转换为布尔值为true,他就会停下来,那个值就是最终的结果。

如果没有值为true的,就会一直找到最后,输出最后一个值。

口诀:真前假后



逻辑运算符的优先级:

!>  &&  >  ||


三、赋值运算符

=  等号  赋值运算符

将一个值 +,-,*,/,%后再赋值给原值的就可以使用赋值运算符

var a = 10;

a = a + 5;

可以写成

    a += 5;

    // a += 5;          // a = a + 5;

    // console.log(a);

    // a -= 5;         // a = a-5;    //95

    // a *= 5;         // a = a*5;    //500

    // a /= 5;         // a = a/5;    //20

    // a %= 5;       // a = a/5;    //20 


如果 加减赋值运算 的具体 数值 为1的话  还可以进一步的简写

a++;

a--;


四、  a++ 和 ++a


!!!!!!!!!!!!!!!

    // 如果在自增过程中存在其他操作

    //  a++  先赋值  在自增

    //  ++a  先自增  在赋值

    //  a--  先赋值  在自减

    //  --a  先自减  在赋值

    // 总结 

    // ++/-- 在后 先赋值 再自操作 (a++,a--);

    // ++/-- 在前 先自操作 再赋值 (++a,--a);



自增过程中存在其他操作

    var a = 10;

    var b = a++;                 //10    先赋值  在自增

    console.log("a", a);      //11

    console.log("b", b);      //10


自增过程中不存在其他操作

无论是前自增还是后自增,变量本身都不会被影响,都会变成自增后的结果

var a = 10;

var b = a++;       //自增过程中 ++ 在后 先赋值,在运算

console.log(b);  //10 

console.log(a); // 11 无论你是先自增还是后自增 => 11 


复杂一点的:

     //     a        11      12         13         12     11 =>11

    var sum = a++ + ++a + a++ * 2 + a-- + --a;

    //    sum = 10 +     12  +  12*2   + 13  +  11;


五、运算符的优先级问题


运算符的优先级很重要,它将决定表达式的执行属性,如果不清楚运算符的优先级,可能会得到意想不到的结果

注意:

算术运算符  */%  高于  +-    

5 + 10 * 2

关系运算符  > , >=  < <=    高于  == ===  !=  !==      

举例 

5>3==1  =>  true == 1  => true


逻辑运算符  &&  ||  !      !  大于  &&  大于  ||      

举例 

5<3 || 5<10 && 5<2  => 5<3 || false  =>  false


! > 算术运算符 ( */%  >  +- )  >  关系运算符  >  逻辑运算符 (有一个比较特殊 !)

    var result = 5 > !3; // ! 优先级高于 关系运算符 5>false

    var result = 5 + !3; //    !  优先级高于 算术运算符  5+false  => 5


运算符的优先级,越往上越高

运算符的优先级


六、选择结构(if/else if/else &&  switch case)


程序的三大结构

1.  顺序结构 (从上朝下执行的代码就是顺序)  代码一天接一条执行

2.  选择结构 (根据不同的情况,执行对应代码  作出不同的选择);

3.  循环结构 (重复的做一件事)



if循环---单分支

if(表达式){

    表达式的结果为真的时候,所执行的语句

}

if循环---双分支

if(表达式){

    表达式的结果为真的时候,所执行的语句

}else{

    表达式的结果为假的时候,所执行的语句

}        

if循环---多分支

if(表达式1){

    表达式1 的结果为真的时候,所执行的语句

}else if(表达式2){

    表达式2 的结果为真的时候,所执行的语句 

}else if(表达式3){

    表达式3 的结果为真的时候,所执行的语句 

}else{

    前面表达式都为假的时候,所执行的语句

}

注意:

1.if后面的()不能省略。

2.无论执行语句是一条还是  多条,一对{ }都不能省略。


那么,什么是JS表达式呢?

JS表达式  由 运算符  和  操作数(变量和常量)  组成

(可以是单独的操作数,但是不能是单独的运算符)

    // 1+5      a+1

    // 5>3      5>a

    // 5>3 && 5<a

    // 数字 字符串  boolean

    // var a = 1;

    // var a = 10;

    // a++;  // a<10

    // a--;  // a>=10

    // console.log(a);


单分支

写一个0-20的随机数,如果这个数小于10,那么就加1

    var a = Math.round(Math.random() * 20);  // 0 - 20

    console.log(a); //13

// 当括号内的表达式结果成立(为true时),则执行大括号内的语句,否则执行 else 中的语句。   

if (a < 10) {  

        a++;  //执行语句

    }

    console.log(a);


双分支

写一个0-20的随机数,如果这个数小于10,那么这个数就加1,否则这个数就减一

    var a = Math.round(Math.random() * 20);  // 0 - 20

    console.log(a); //13

// 当括号内的表达式结果成立(为true时),则执行大括号内的语句,否则不执行。

if (a < 10) {  

        a++;  //执行语句

    } else {

        a--;

    }

    console.log(a);


多分支

判断学生分数的区间[0-100]

成绩判定

大于等于90  优秀  

大于等于80小于90 优秀

大于等于70小于80 良好

大于等于60小于70 及格

小于60  不及格

var score = Math.round(Math.random() * 100);     //0-100

    console.log(score)

    // 从上往下,满足哪个条件就执行其相对应的语句,都不满足时,执行最后的else的语句,只能进入其中之一。

    if (score >= 90) {

        document.write(score + "优秀");

    } else if (score >= 80 && score < 90) {  //[80-90)

        document.write(score + "良好");

    } else if (score >= 70) {      // [70,80)

        document.write(score + "一般");

    } else if (score >= 60) {

        document.write(score + "及格");

    } else {

        document.write(score + "不及格");

    }


选择结构的嵌套

// 选择结构是可以嵌套的

    var score = Math.round(Math.random() * 100); //0-100

    console.log(score)

    if (score >= 90) {  //90 - 100

        // document.write(score + "优秀");

        // 90-99

        // 100

        if (score == 100) {

            document.write(score + " 666666");

        } else {

            document.write(score + "优秀");

        }

    } else if (score >= 80 && score < 90) {  //80-90

        document.write(score + "良好");

    } else if (score >= 70) {  // [70,80)

        document.write(score + "一般");

    } else if (score >= 60) {

        document.write(score + "及格");

    } else {

        document.write(score + "不及格");

    }


拓展:在input框中输入一个成绩,并判断成绩的等级

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <meta http-equiv="X-UA-Compatible" content="ie=edge">

    <title>小五的技术blog</title>

</head>

<body>

    <input id="content" type="text"><button id="btn">判断</button><input id="result" type="text">

</body>

<script>

    // 需求:在input框中输入一个成绩,并判断成绩的等级

    // input#content  取值(点击的时候取值)

    // button#btn      点击取值

    // input#result  把结果输出到result框中

    // !  能改变元素的只有元素本身

    // 1. 获取需要用到的元素  (通过id名来获取元素)

    var conInp = document.getElementById("content");  // 在文档中  通过id名来获取元素

    // console.log(conInp, document.getElementById("content"));

    var btn = document.getElementById("btn");

    // console.log(btn);

    var resultInp = document.getElementById("result");

    // console.log(resultInp);

    //2. 给 btn绑定一个点击事件  当你点击按钮时  执行function 后面{}中语句 (!!!!!!!!    不要用document.write() )

    // 页面加载时  点击事件不会主动执行  (当你手动点击按钮的时候 会执行 function 后面{}中语句 )

    btn.onclick = function () {  // 事件执行的内容

        // console.log(11111111);

        // console.log(conInp.value);  // 点击时获取

        // conInp.value = "haha";  //  赋值  把haha放到  conInp的value中;

        // 3.  点击时取值 

        var score = conInp.value;  // 取的是输入框中的值(值!!!!!!!!!!!!!!!! 不能代表 conInp =>  都是string类型)

        if (score >= 0 && score <= 100) { // 如果分数在 0-100 以内  在判断分数的级别

            // 4.  把结果 放到 resultInp(元素)的value中

            if (score >= 90) {

                resultInp.value = "优秀"; //  把优秀 放到 resultInp(元素)的value中

            } else if (score >= 80) {

                resultInp.value = "良好";

            } else if (score >= 70) {

                resultInp.value = "一般";

            } else if (score >= 60) {

                resultInp.value = "刚及格";

            } else {

                resultInp.value = "送你一场造化!";

            }

        } else {  // 如果分数不在 0-100 以内  弹出请输入正确的分数

            alert("请输入正确的分数");

        }

    }

    // console.log(22222222);

</script>

</html>


这种练习还有很多,各种语言除了语法不同,但是大体的逻辑都是相同的。

比如:

输入一个0-100的数 判断是奇数还是偶数

随意输入一个年份,判断这个年份是否为闰年。

    1.能被4整除而不能被100整除.(如2004年就是闰年,1800年不是.)

    2.能被400整除.(如2000年是闰年)

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

推荐阅读更多精彩内容