JavaScript

365 阅读20分钟

前端认识:

  • 光会html+css你只能算是一个网页设计
  • 前端html+css+js+node.js(框架)
  • 一个完整的页面应用
    • html页面结构
    • css表现
    • js行为给页面增加动态效果
    • 原生JS就是内功可以让我们页面更具生命力
  • 前端的工作
    • html5+原生APP(IOS 安卓)
    • 微信公众号 小程序(水滴步步宝)
    • 客户端 RN app
    • pc 移动页面
    • node.js后端
    • 全栈工程师

JS是什么

  • JS (JavaScript) 一门动态脚本语言 主要运行浏览器里 + node.js(服务端)
  • JS让我们页面 有动态交互效果 其实就是有更好的 与用户互动

JS里面我们要学习些什么

  • ECMAScript(标准)简称ES (ES6 ES7 ES8) 制定了 JS中核心内容(语法 变量 数据类型 语句 关键字 保留字 运算符)
  • 文档对象模型DOM(Document Object Model):提供了一些属性和方法
  • 让我们操作html页面中的元素(html标签)
  • 浏览器对象模型BOM(Browser Object Model):提供了一些属性和方法 让我们操作浏览器

JS学习视频

day1

javascript 三大部分

  • ECMAScript(标准)简称ES 规定了JS中核心内容(语法 变量 数据类型 语句 关键字 运算符等)
  • DOM(文档对象模型)提供了一些属性和方法
  • 让我们能够操作页面中的html元素(document.getElementByID())
  • BOM(浏览器对象模型)提供了一些属性和方法 让我们能够操作浏览器(window.open())

JS引入方式

  • 外链式
<script src="test.js"></script>
  • 内嵌式
<script type="text/javascript">
    alert("hello world!");
</script>
  • 行内式
<h3 onclick="alert('hello world!')">你好</h3>
  • JS的引入方式
    • 1.外链式 页面js太多时 推荐使用 好维护
    • 2.内嵌式 JS代码比较少时
    • 3.行内式 不常用
  • 注意:内嵌式和外链式不能混用
  • 错误写法:
<script src="test.js">
    alert("hello world!");
</script>
  • 正确写法:
<script>
     alert("珠峰");
</script>

JS为什么放在body中

  • 按照传统的做法,所有script元素都应该放在页面的head元素中,这种做法的目的就是把所有外部文件(包括css和JavaScript文件)的引用都放在相同的地方,可是,在文档的head元素中包含所有JavaScript文件,意味着必须等到全部JavaScript代码都被下载、解析和执行完成之后,才能开始呈现页面内容(浏览器在遇到body标记时才开始呈现内容)

  • 对于那些需要很多JavaScript代码的页面来说,这无疑会导致浏览器在呈现页面时出现明显的延迟,而延迟期间的浏览器窗口中将是一片空白。为避免这个问题,现代web应用程序一般都把全部JavaScript引用放在元素中页面内容的后面。

<script>
        // 获取元素必须要等html元素解析完才行
        //    在js中 根据ID名 获取页面中元素(html标签)
        var doc = document.getElementById('box');
        Console.log(doc);
</script>
<style>
        .box {
            width: 100px;
            height: 100px;
            background-color: #ff3344;
        }
    </style>
    <div class="box" id="box">12328923</div>
    <!-- DOM就是通过js操作html标签 -->
    <script>
        // 获取元素必须要等html元素解析完才行
        //    在js中 根据ID名 获取页面中元素(html标签)
        var asc = document.getElementById('box');
        console.log(asc);
    </script>
    <!-- 
        JS引入方式
        注意的
        JS存放位置
        1.JS 一般最好是放在body底部(要先让浏览器加载HTML 然后再JS获取元素)
        2.外链式和内嵌式不能混用在一个script标签当中
     -->

JS中的变量

  • 变量:可变化的值 存储数据(值)
  • 定义变量:
    • var 变量名 = 值
  • 关键字 在JS中有特殊意义的单词 我不能随便用
  • 一个= 赋值的意思
  • var n = 2019;

n 这个变量 存储的值就是2019

  • text这个变量 存储的值就是下面这段话:
var text = '关键字 在JS中有特殊意义的单词 我不能随便用';
  • alert("弹出框内容");
  • 变量用来存储值和代表值
  • 把变量n所存储的值作为弹框内容
alert(n); //alert(n) => alert(2019)
alert(text) //alert(text) => alert('关键字 在JS中有特殊意义的单词 我不能随便用')
  • js代码自上而下一行一行执行的
  • 创建一个变量叫title并且他存储的值是100
    var title = 100;
    // 把此时title这个变量 所储存的值 通过弹窗打印出来
    alert(title); //100
    // 变量的值是可以修改的
    // 将title变量存储的值 修改成2018
    title = 2018; 
    // 再次将title的值 打印出来
    alert(title);//2018
    title = 2019; 
    alert(title);//2019
  • 常量 恒久不变的量 一旦被定义 就不能被修改
  • const 也是关键字 用来创建常量的 const 常量名 = 值
    const hello = 'hello world!';
    alert(hello);
    hello = 2019;
  • 变量就是用来存储值和代表值的 var num = 100;
  • 定义变量 var 变量名 = 值(所要储存的值)
  • 变量的值可以被修改
    var n = 1000;
    n = 100;

JS中的输出方式

  • js中的输出方式 就把js中的内容 输出显示到页面中
  • 输出到页面中 DOM里面提供的方法
document.write('我是页面中的 内容')
  • innerHTML 将内容输出到指定页面元素中
  • innerText
  • 将变量text存储的数据内容 输出到页面当中
  • JS把内容直接放到body里面了
    document.write(text);
    document.write('<h1>JavaScript</h1>');
    document.write('<h1>JavaScript</h1>')
    document.write('<h2>JavaScript</h2>')
    document.write('<h3>JavaScript</h3>')
    document.write('<h4>JavaScript</h4>')
<body>
   <h3 id="title"></h3>
   <p id="c"></p>
  <script>
     //获取ID名为title的页面标签h3
    var a = document.getElementById('title');
     // 元素.innerHTML = 元素内容
    // 将内容输出显示到页面h3标签中
    // a.innerHTML = '我是页面中的 标题3'
    var text = '欢迎来到掘金!我们给你的102495553@qq.com邮箱发送了一封账号验证邮件,为了你的账号安全,请尽快验证。重新发送邮件'
     var c = document.getElementById('c')
     c.innerHTML = text
 </script>
 </body>
  • innerHTML 和innerText作用一样
  • 区别:

innerText不能够识别标签内容 innerHTML能够识别标签内容

  • innerText将内容作当做普通文本 直接输出到页面元素中
    a.innerText = '<i>我是页面中的标题3434</i>';
    a.innerHTML = '<i>我是页面中的标题3434</i>';
  • 页面中输出方式
    document.write('<h3>hello</h3>');将内容直接输出到body中,能够识别标签
  • innerHTML/innerText将内容输出到指定元素标签内

  • 弹窗输出 会阻塞浏览器渲染页面

    alert('弹窗内容');//普通提示框
    confirm('你确认要退出登录');//确认框
    prompt('你的名字是什么?');//输入框
  • 控制台输出(通常进行JS代码调试)
  • 控制台会显示出一些JS代码运行时错误信息
<body>
   <h3 id="title"></h3>
  <script>
    console.log('控制台输出');
    console.dir('')//在控制台输出更详细的内容
    var ele = document.getElementById('title');
    console.log(ele);
    console.dir(ele);
    var ele = 123;
    console.log(ele);
  </script>

命名规范

  • var 变量名 = 值
    1. 驼峰式命名法(小驼峰 大驼峰)
  • 小驼峰命名法 第一个单词首字母小写 从第二个单词开始 首字母要大写 var getContextId = 123;
  • 大驼峰每个单词首字母都要大写 (面向对象 定义类) var GetElementById = 20;
  • 2.严格区分大小写
    var a = 100;
    var A = 200;
    console.log(a);
    console.log(A);
  • 3.数字 字母,但是数字不能作为开头
        var 1a = 100; //错误写法
        var c1 = 200;
        _ $ 可以作为开头
        var _c = 'c';//内置的自定义变量
        var $c = 'c';//jQuery类库中的元素
  • 4.定义变量时 不能使用关键字 和 保留字(后面升级关键字) var document const

数据类型

  • 规定JS中 值都可以有哪些
        var n = 123;
        var text = '数据类型';
        var str = '123';
        var str = "123";
        var s = '';//空字符串
        var s = "";
  • 基本数据类型(原始数据类型)
    • number 数字类型 例如 1 -1 0.25
    • String 字符串类型 例如 '' ""
    • Boolean 布尔类型 true 真 (对) false 假(错)
    • Null null 空值 空指针对象
    • undefined 未定义
    • (Symbol ES6标准)
  • 引用数据类型(复合数据类型)
  • 对象数据类型

        数组 Array[]
        正则 /\d+/
        date 日期对象 
        Math 数学对象   
        ...
    
  • 函数数据类型 function() {}

检测数据类型

  • typeof
  • instanceof
  • constructor
  • Object.prototype.toString.call()
  • typeof
  • 语法
  • typeof 值/变量
        //Number
        var n = 2019;
        console.log(typeof n);//"number" typeof n => typeof 2019
        console.log(typeof 1);//"number"
        // String
        console.log(typeof "你好"); //"String"
        // Boolean
        console.log(typeof true); //"Boolean"
        console.log(typeof false);//"Boolean"
        // Null
        console.log(typeof null); //"object" 空指针对象 先特殊记
        // undefined 
        console.log(typeof undefined);//"undefined"
        // 普通对象{}
        var obj = {id: 1};
        console.log(typeof obj); //"object"

        // 数组[]
        var arr = [1,2,3];
        console.log(typeof arr); //"object"
        //正则
        var reg = /\d+/;
        console.log(typeof reg); //"object"
  • 缺陷 typeof 不能够具体细分 对象数据类型中 数组 正则 普通对象
        // 函数
        function fe() {}
        console.log(typeof fe);//"function"
  • typeof 通常用来检测基本数据类型和函数
  • typeof的返回值都哪些
  • "number" "string" "boolean" "undefined" "object" "function"

JS数据类型之Number

  • Number 数字类型:正数 小数 负数 0 NaN(非数字 特殊值)
        console.log(typeof NaN); //"number"
        /*
            typeof 1
            typeof -1
            typeof 0.25
            typeof 0        
        */
  • 数字类型转换,主要针对的是将字符串转换为数字
  • Number() 严格转换 只要包含非数字字符 就直接返回NaN
        console.log(Number('10')); // 10
        console.log(Number('a10')); // 返回 NaN
        console.log(Number('10.12')); // 10.12
  • 将boolean类型转化为数字
        console.log(Number(true)); // 1
        console.log(Number(false)); // 0
        // null
        console.log(Number(null)); // 0
        // undefined
        console.log(Number(undefined)); // NaN
  • Array 先将数组转换为字符串 在转换成数字
    • 数字转换成字符串 就是把中括号换成引号
        Number([]); // Number([]) => Number('') => 0
        Number([100]); // Number([100]) => Number('100') => 100
        Number([10, 20, 30]); // Number([10,20,30]) => Number('10,20,30') => NaN
        // Number({})
        // NaN
        // Number(/\d+/)
        // NaN
        // Number(function fe() {})
        // NaN
        console.log(Number([undefined])); // 等价于 Number([])
  • 将字符串中的数字提取出来
    • parseInt
    • parseInt 从左到右 进行提取 一旦遇到非数字字符 停止提取 将提取到的数字字符 一数字形式返回
    • 如果开头第一个字符就是非数字字符 就直接返回 NaN
    • parseInt 不能识别小数点 它有取整作用
        // parseInt (10.5); //10
        // parseInt (10.5px); //10
  • parseFloat
  • parseFloat 和 parseInt 功能一样 只是多识别一个小数点
        console.log(Number('100px')); //NaN
        console.log(parseInt('-100a')); //100
  • 操作符 + 和Number()方法一样
        +'' //0
        +'12321' //12321
        +'123a12' //NaN
        +'a12' //NaN
  • isNaN() 检测一个值是不是NaN(代表非数字)
  • isNaN(NaN)如果是NaN 返回true 说明这个值不是有效数字
  • isNaN(1) 如果不是NaN 返回false 说明这个值是有效数字
        isNaN(1 + undefined);  //isNaN(1 + undefined) => isNaN(NaN) => true
  • isNaN先将值用Number()方法转换下 然后再判断是不是NaN
        isNaN('10'); //isNaN(Number('10')) => isNaN(10) => false
        isNaN('10px'); //isNaN(Number('10px')) => isNaN(NaN) => true
        isNaN(null); //isNaN(Number('null')) => isNaN(0) => false
        isNaN(true); //isNaN(Number('true')) => isNaN(1) => false
        isNaN(10); //isNaN(Number('10')) => isNaN(10) => false
        isNaN([1]]); //isNaN(Number([1])) => isNaN(1) => false
  • Number()方法返回值情况只有两种
    • 如果成功转换为数字 就返回这个数字
    • 如果转换数字失败 就返回NaN
        var num = parseFloat('width:100px');
        console.log(typeof num =='number');

数据类型之Boolean

  • boolean:true(真) false(假)
  • 其他类型都可以转换成boolean类型(true或false)
    • 0 '' null NaN undefined 这五个值转换为Boolean类型都是false 其余都是true
  • 怎么转换为Boolean类型
    • Boolean()将其他类型的值 转换为boolean
       console.log(Boolean(0)) //false
       console.log(Boolean('')); //false
       console.log(Boolean(null)); //false
       console.log(Boolean(NaN)); //false
       console.log(Boolean(undefined)); //false
  • !! 操作符 等价于 Boolean()
        console.log(!!0) //false
        console.log(!!'') //false
  • ! 取反
    • 先转换为Boolean再取反
        console.log('!0', !0)
        console.log('!空字符串', !'')
        console.log('!null', !null)
        console.log('!NaN', !NaN)
        console.log('!undefined', !undefined)
  • 0 '' null NaN undefined 这五个值取反都是true 其余都是false

JS普通对象

  • 引用数据类型就是用来存储多个值的(集合)
  • 语法
    • var obj = {属性名1:属性值,属性名2:属性值...};
  • 创建一个对象 属性是以键值对形式存在的
  • 属性名:属性值(键值对)
    • key:value
    • 多个属性之间用逗号隔开
  • 定义了一个对象 存储数据
        var obj = {
            title:"豆瓣电影Top10",
            name:'zhufeng',
            age:10,
            sex:'男'
        };
  • 关于对象的增删改查
  • 如何获取对象中的某个属性
    1. 对象名.属性名
    • 通过obj这个对象 找到属性title
    console.log(obj.title);
    console.log(obj.age);
    1. 对象名['属性名']
    console.log(obj['sex']);
    console.log(obj['name']);
  • 先获取元素
    var bt = document.getElementById('title');
    var text = document.getElementById('text');
    bt.innerHTML = obj.title;
    text.innerHTML = obj.text;
  • 获取属性需要注意的
    • 对象p名.属性名
    • 数字作为属性名 是不能使用第一种方式获取属性名
        var o = {
            0: '你好',
            1: 'hello'
        }
    
  • 错误写法 console.log(o.0);
  • console.log(o[0]); // '你好'
  • 如果用第二种方法 属性名 没有加引号 会把当做变量来解析
console.log(o[sex]);
  • 在JS中会把所有的单词当做变量来解析
        var c = 100;
        console.log(c);
        var obj2 = {
            title: 'hello',
            id: 24,
            0: 2019
        }
        console.log('title:' + obj2.title + '\n' + 'id:' + obj2.id + '\n' + '0:' + obj2[0]);
  • 2.增加属性
    var con = {
        id: 24
        };
    console.log('增加前', con);
    con.city = 'Beijing';
    con.name = 'zhufeng';
    con['city'] = 'Beijing';
    con['name'] = 'zhufeng';
    console.log('增加后', con);
  • 3.修改属性
        var n = {
            title: 'hello'
        };
        // 将对象 n的title属性 修改为24
        console.log('修改前', n);
        n.title = 24;

        n.text = 'hello';
        console.log('修改后', n);
  • 4.删除属性
    var info = {
        age: 20,
        name: 'zhufeng'
    }
    // 真删除
    // console.log('删除前',info);
    // delete info.age;
    // console.log('删除后',info);
    // 假删除
    console.log('删除前', info);
    info.age = null;
    console.log('删除后', info);
  • 如何创建一个对象
  • 创建对象的目的 就是用来存储多个值(存储数据)
        var obj = {
            name: 'zhufeng',
            id: 24,
            10: '数字属性'
        }
  • 对象增删改查
  • 1.对象名.属性名
console.log(obj.name);
  • 2.对象名['属性名']
    console.log(obj['name']);
  • 获取一个数字属性
    console.log(obj['10']);
  • 增加
    obj.title = 'hello zhufeng';
    obj['text'] = 'hello world';
    console.log(obj);
  • 修改 把原有的属性 重新赋值
        obj.name = 'xiugai';
        console.log(obj);
    delete obj.id;
    console.log(obj);
  • 假删除
    info.name = null;
    console.log(obj);
  • 对象里不能有重复的属性 如果有的话 是以最后一个为准
    var num = {
        id: 20,
        id: 30,
        id: 40,
        id: 2019
    };
    console.log(num); // {id: 2019}

基本数据类型与引用数据类型的区别

  • 基本数据类型 操作的是值
    var num = 100;
  • 引用数据类型操作的是地址
    • 对于对象数据类型 会为对象 单独分配一块内存 来存储多个值
        var num = {
            num1: 100,
            num2: 200,
            num3: 300
        }
  • JS代码主要运行在浏览器里
  • 浏览器会为我们JS代码提供运行环境 全局作用域(地球)
alert('你好');
var num = 100;
  • obj2 实质上存储的就是 这个对象 内存地址(引用地址)
var obj2 = { id: 123, title: 'hello' };
  • 根据obj2存储的地址 来找到里面的叫title的这个属性
obj2.title;
  • 基本数据类型 操作的是值(直接存储的就是一个具体的值)
  • 引用数据类型 操作的是引用地址(存储的是一个引用地址)
  • info存储引用地址 xxxfff11
    var info = {
      name: 'gaohuan',
      age: 18,
      iphone: 13811111111
    };
  • 把变量info存储的值 给变量text一份
  • 把info变量存储的地址 又给了text一份
    var text = info;
    info = xxxfff11;
    text = xxxfff11;
  • 通过text存储引用地址 找到这块儿内存 将里面的age属性的值修改为28
    text.age = 28; // xxxfff11.age = 28
    // xxxfff11.age
    console.log(info.age); // 28
    var a = 2;
    // 将变量a存储的值 有给变量b一份
    var b = a; // b = 2
    console.log('b', b);

循环

循环:根据循环次数 一遍又一遍执行相同的代码

  • for 循环语句
  • 语法:
    • for(初始值;执行条件(循环结束条件);累加记录步长){ 代码块 每次要执行的代码code }
  • 通过for循环 打印输出五次'hello world'
for(var i = 0; i < 5; i++) {
    console.log('hello world!');
}
  • 每次循环分三步
    • 1.进行条件判断 i < 5 条件为true
    • 2.条件为true 执行循环体里的代码
    • 3.执行完后就让i的值累加一次 i++
for(var i = 0; i < 9; i++) {
    console.log('n',n); //最后一次循环  n = 9
}
// 注意:每次循环完 最后都要加加一次 i++
//循环结束后 n的值
console.log('end',n); // 10
  • while循环
  • 语法
  • while(条件) {只要条件成立为true,就会一直xun循环执行下去}
var n = -10;
while(n < 5) {
    //在自身的基础上累加5
    n+=5; //n=-5 n = 0 n = 5
    console.log('n',n); // -5 0 5
}
a ++; // a+=1
var a = 1;
a += 10;// a= a+10
console.log(a);

var n = 0;
while(n < 5) {
    n++;
    console.log('n:',n);
}

判断

  • if语句 条件语句 进行判断
  • 语法
  • if(条件) {条件为true执行代码}
  • 大于 >
  • 小于 <
  • 大于等于 >=
  • 小于等于 <=
  • 相对等于 ==
  • 绝对等于 ===
  • 不等于 !=
//绿灯
var text = "绿灯";
if(text === "绿灯") {
   console.log("前方是绿灯,可以通行");
}

//true
if(2 > 1) {
   console.log("2 > 1"); 
}
//false
if(6 < 3) {
   console.log("6 < 3");
}
  • if else
  • 如果...否则...
  • 语法
  • if(条件) {条件为true时 执行代码} else {条件为false执行的代码}
var light = '红灯';
if(light === '绿灯') {
    console.log("当前是绿灯,请通行。");
} else {
    console.log("请等一等 当前不是绿灯");
}
  • 多条件
  • if(条件1) {
  • 当条件1为true时,执行的代码
  • } else if(条件2) {
  • 当条件2为true时执行的代码
  • } else {
  • 当条件1和条件2都不为true是执行的代码
  • }
var light = '黄灯';
if(light === '绿灯') {
    console.log("当前是绿灯,请通行。");
} else if(light === '黄灯') {
    console.log("请等一等 当前是黄灯");
} else {
    console.log("请一直等,当前是红灯");
}

===========================================
var time = 'morning';
if(time === 'morning') {
    console.log('Good morning 😊');
}else if (time === 'noon') {
    console.log('Good noon 😃')
} else if (time === 'afternoon') {
    console.log('Good afternoon 🙂')
} else {
    console.log('Good evening 🌙')
}
  • 其他的所有类型 都可以转换为boolean值(true or false)
  • 0 '' NaN null undefined 这五个值 转换为Boolean都是false 其余全是true
  • if() 会吧括号里的内容 隐式转换为boolean值
    • true 条件成立
    • false 条件不成立
if (0) {
    console.log(0000000);
}
if(2 + 3) {
    console.log('hello world'); 
}
if(-1 + 1) {
    console.log('bye bye world'); 
}
  • 定义一个变量age
  • 如果 age 等于 1 输出 hello 1
  • 如果 age 等于 10 输出 hello 10
  • 如果 age 等于 20 输出 hello 20
  • 否则 输出 hello world
var age = 10;
if(age === 1) {
    console.log('hello 1');
} else if(age === 10) {
    console.log('hello 10');
} else if(age === 20){
    console.log('hello 20');
} else {
    console.log('hello world');
}
  • switch 条件语句
  • 语法
    switch (值 / 变量) {
    case 1: //case 等于的意思
    // 等于1的时候 执行的代码
        break; //相当于结束中断
    case 2:
    // 等于2的时候 执行的代码
         break;
    case 3:
    // 等于3的时候 执行的代码
        break;
    default: //相当于else
    // 以上都不成立时 执行这里的代码
    } 
var num = 3;
switch (num) {
    case 1:
        console.log('数字1');
        break; //相当于结束中断
    case 2:
        console.log('数字2');
        break;
    case 3:
        console.log('数字3');
        break;
    default: //相当于else
        console.log('随便哪个数字啦');
}
=====================================================================================
var day = 3;
switch (day) {
    case 1:
        console.log('今天是周一 上班');
        break;
    case 2:
        console.log('今天是周二 上班');
        break;
    case 3:
        console.log('今天是周三 上班');
        break;
    case 4:
        console.log('今天是周四 休息');
        break;
    case 5:
        console.log('今天是周五 上班');
        break;
    case 6:
        console.log('今天是周六 上班');
        break;
    case 7:
        console.log('今天是周日 休息');
        break;
    default:
        console.log('今天 爱星期几 星期几, 我只想休息~😏')
}
  • 通常 每个case 后面要加一个break
  • 如果不加break 就会继续往下执行 知道碰到下一break
    var num = 1
    switch (num) {
    case 1:
        console.log('数字1');
        //  break;
    case 2:
        console.log('数字2');
        //  break;
    case 3:
        console.log('数字3');
        //  break;
    default:
        console.log('随便哪个数字啦');
    }

break 和 continue

  • break(中断)
    • 只要在循环体中遇到break 整个循环就结束了
    • 包括break 后面的代码都不会执行了 以及i++也不执行了
for(var i = 0; i < 10; i++) {
    //当 i = 5 的时候 整个循环就结束了
    if(i == 5) {
        break; //一旦遇到break整个循环就结束了
    }
    console.log('i',i); // 0 1 2 3 4
}
console.log('end',i); // end 5
  • continue(跳到下一轮)
    • 直接跳到下一轮 就把 continue 后面的代码忽略掉 并不会中断循环
for(var i = 0; i < 10; i++) {
    if(i < 5) { // i 小于5的时候 遇到continue
        // 不会执行 continue 后面的代码直接跳到下一轮循环
        continue;
    }
    console.log('i',i);// 5 6 7 8 9
}

逻辑或与逻辑与

  • 逻辑或 ||
  • 逻辑与 &&
  • 取值
    • 逻辑或
      • 先看左边值 哪一个是真(true)就返回哪一个
      • 如果都为true就返回第一个
      • 如果都为false就返回最后一个
      console.log(0 || 2);// 2
      console.log(NaN || 'ABC');//ABC
      console.log(2 || null); // 2
      // 如果都为false就返回最后一个
      console.log(undefined || NaN); // NaN
      console.log(1 || 3 || 0 || NaN); // 1
      console.log(0 || 3 || 0 || NaN); // 3
      
    • 逻辑与 &&
      • 先看左边值 哪一个是(false)就返回哪一个
      • 如果都为true就返回最后一个
      • 如果都为false就返回第一个
      console.log(0 && null); // 0
      console.log(0 && 2); // 0
      console.log(2 && null); // null
      console.log(2 && 1); //1
      //先看左边值 哪一个是假(false)就返回哪一个值
      console.log(2 && null && 3 && NaN); // null
      //&& 优先级高于 ||
      console.log(3 && 4 || NaN || 0 && 1); // 4
      
  • 逻辑或 || (或者)
  • 逻辑与 && (并且)
  • 主要是在if 语句中应用
  • || 相当于或者or
if(条件1 || 条件2) {
    只要其中一个条件为true,就执行这里的代码
}
var n = 1;
//变量n的值 等于1或2的时候 都可以执行里面的代码
if(n == 1 || n == 2) {
    console.log('1或者2都可以');
}
// null 转换为Boolean  false
// 1 转换为Boolean true
if (null || 1) {
    console.log('hello true');
}
if (null || '') {
    console.log('hello 123');
}
  • 语法
  • && 相当于并且and
if (条件1 && 条件2) {
    //两边条件都为true时 就执行这里代码
}
 var n = 2;
 if (n == 2 && n != 3) {
    console.log('hello true');
}

var score = 75;
if(score >= 70 && score <80) {
    console.log('您的成绩中等');
}

取模

  • % 取模(取余)获取余数
  • 得到3%2的余数
console.log(3 % 2);//1
console.log(0 % 2);//0
console.log(1 % 2);//1
console.log(2 % 2);//0
console.log(3 % 2);//1
console.log(4 % 2);//0
  • 模几 反值情况就有几种
  • 比如%2 返回值情况两种0 1
  • 比如%3 返回值情况两种0 1 2
  • 比如%4 返回值情况两种0 1 2 3
console.log(0 % 4) // 0
console.log(1 % 4) // 1
console.log(2 % 4) // 2
console.log(3 % 4) // 3
console.log(4 % 4) // 0
console.log(5 % 4) // 1
console.log(6 % 4) // 2
console.log(7 % 4) // 3
console.log(8 % 4) // 3
  • 如果一个数 %2 0 说明是偶数
  • 如果一个数 %2 1 说明是奇数
  • 定义一个变量 num
  • 如果num除以2 余数等于0 输出"这是一个偶数"
  • 如果num除以2 余数等于1 输出"这是一个奇数"
var num = 3;
if(num % 2 === 0) {
    console.log('这是一个偶数');
} else {
    console.log('这是一个奇数');
}
  • 0 '' null undefined NaN 转换为Boolean类型都是 false 其余都是true
  • if语句的小括号 会隐式将条件 转换为Boolean值(true或 false)在进行判断执行
  • true 条件成立 条件不成立
  • num % 2 返回值情况 0 1
var num = 2;
if(!(num % 2)) {//2 % 2 = 0
    console.log("这是个偶数");
} else {
    console.log("这是个奇数");
}

=======================================

if (num % 2 === 0) {
    console.log("“这是个偶数”")
} else {
    console.log("“这是个奇数”")
}

三元运算符

  • 语法:
    • 条件?为true时执行 : false时执行
    var price = 11;
    if(price < 10) {
        console.log('比较便宜');
    } else {
        console.log('太贵了');
    }
    price < 10 ? console.log('比较便宜') : console.log('太贵了,能不能便宜点');
    
  • 将简单的if语句 改写成三元运算
if (price == 10) {
    console.log('价格刚刚好');
}
  • null undefined 相当于用来占位 避免语法报错
price == 10 ? console.log('比较刚好') : null;
  • 三元运算符 冒号以及后面的内容 是不能省略的
  • 错误写法 会报语法错误
price === 10 ? console.log('价格刚好')
  • = 赋值运算符
  • 三元运算符 优先级 要高于 赋值运算符
var num = 10 < 1 ? 'hello' : 'world';