js的数据类型,循环语句,变量,流程控制,函数,作用域

266 阅读11分钟

1.js是什么已及发展历史 JS是一种运行在客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能 浏览器就是一种运行JS脚本语言的客户端,运行在浏览器上的。

2.js的组成 JavaScript 是 ECMAScript,DOM 和 BOM 三个组成的。 js 的三种书写方式 行内式 外链式

3变量 变量是计算机内存中存储数据的,根据变量名称可以获取到内存中存储的数据; 有一个东西需要暂时存储起来,比如说就是一个数字 100,我把它存放到了变量 a 中,我后续想要使用他的时候就可以直接通过变量 a 获取到数字 100 变量其实就相当于一个容器,内部可以存储任意类型的数据,使用变量时,用的是内部存储的数据。 使用变量可以方便的获取或者修改内存中的数据 变量的定义 用var 的关键字进行定义,后面必须加一个空格,空格后面自定义变量名字。 变量的命名规范 遵守规则,驼峰命名,语义化 ### 数据类型检测

  1. 数据类型检测 JS语言是一门动态类型的语言,变量并没有一个单独的数据类型,而是会随着内部存储数据的变化,数据 类型也会发生变化变量的数据类型,与内部存储数据有关将来使用变量时,需要知道内部存储的数据是什 么类型,避免程序出错使用 typeof 的方法进行数据检测检测方式:在 typeof 后面加小括号执行,将要 检测的数据放在小括号内部

  2. Number(数据)方法 Number()可以用于任何数据类型,将其他数据类型转为数字 字符串:纯数字字符串转为对应数字,空字符串和空白字符串转为0,非空非纯数字字符串转为NaN parseInt()方法:字符串转整数方法 转换时如果是纯数字,可以直接转为number如果是数字开头将开头的转为number其他省略,只能是开头其他位置就是NaN,并且只保留小数点前的parseFloat()方法:字符串转浮点数方法保留小数点后面的数字,数字开头也可以转,同样的其他位置不行。

  3. tostring() null不能使用,undefined也不能用。 string 都可以正常转换。 Boolean()布尔 数字中除了0其他都可以转为true 字符中除了空的字符串(不是空的字符串)会转为false以外,其他都可以转为true undefined null都会转为false 类型 true真 false错 undefined未定义 null零 1,什么是分支语句 1.语法 if(判断的条件)当小括号内的条件为真时执行,运算顺序和数学一致 2.js的元素符 算数运算符. + ,— ,* ,/ , % 这几个运算符号在运算的时候,如果符号两边有非数字的类型,会转换数字,然后再运算这种情况我们叫做隐式转换。 3.赋值运算 “ = ,+= ,-= ,= ,/= ,%= ” 4.比较值运算 “ > , < , >= , <= , == ,!= , !== , === ” 得到的不是一个常规数字,是一个布尔值 (三个等号===叫全等号) 全等会对比数据的值,和数据类型进行转换。 !=叫做不等于。 !==js中叫不全等。 5.逻辑运算符 ( && , ||) &&.特点 前一个(符号左边)为真返回后一个,前一个为假返回后一个 ||特点 前一个为真,返回前一个 前一个为假,返回后一个 6.自增自减运算符 “ ++ ,-- ” 语法 1.++变量 2.变量++ 3.变量-- 4.--变量 作用将自身+1或-1 区别:符号在前先运算自减或自加,符号在后先参与周围表达式的运算,然后自减

    1. while while语句是一个最基本的循环语句,while语句也被称为while循环 语法: while(条件表达式){ 语句... } 案例: var i = 1; while (i <= 10) { console.log(i); i++; }
  4. do…while do…while和while非常类似,只不过它会在循环的尾部而不是顶部检查表达式的值,因此,do…while循环会至少执行一次。相比于while,do…while的使用情况并不 是很多。 语法: do{ 语句... }while(条件表达式); 案例: var i = 1; do { console.log(i); i++; } while (i <= 10); 1:
    var password; //输入框 用户输入密码,正确打印 不正确从新输入 prompt():浏览器提供,会出现弹窗,让用户输入内容 点击确定,返回用户输入的内容(字符串格式) 点击取消,返回一个null 第一个参数:用户提示信息 第二个参数:输入框默认文 while(password!=67890) //设置值,输入对了就打印密码正确 console.log('密码正确')

  5. for for语句也是循环控制语句,我们也称它为for循环。大部分循环都会有一个计数器用以控制循环执行的次数, 计数器的三个关键操作是初始化、检测和更新。for语句 就将这三步操作明确为了语法的一部分。 语法: for(初始化表达式 ; 条件表达式 ; 更新表达式){ 语句... } 案例: for (var i = 1; i <= 10; i++) { console.log(i); }

    1. for嵌套循环
    2. for嵌套循环:外层循环每一轮都要执行内层循环结束条件中的每一次 列: for(var i = 0;i < 3;i++){ //外层for循环 for(var c = 0;c < 3;c++){ //内层for循环 console.log('22222222'); } }
  6. 流程控制 break:结束最近的一次循环,可以在循环和switch语句中使用。 continue:结束本次循环,执行下一次循环,只能在循环中使用。 语法:

  7. document.write() //打印(渲染)在页面 console.log();//打印在控制台 document.write('(br)') 在页面换行 换行符:
    列: for(var a = 0;a<9;a++){ //外层循环--控制多少行 document.write('
    ') for(var b = 0;b<9;b++){ //内层循环--控制多少列或者一行有多少个 document.write('*') } document.write('
    ') }

  8. 函数 前端的函数, 与数学的函数, 完全是两个概念 可以粗暴的理解为 一个盒子 当一段需要多次使用的复杂代码段, 我们可以把它放在(抽离)一个盒子中(就是函数) 在需要使用的地方去调用即可 如何拥有(使用)函数 函数分为 定义(创建)和调用 定义(创建): 必须要有, 没有的话, 无法调用 调用: 也必须要有, 没有的话, 定义就没有意义了

  9. 定义 语法: function () {} 1.赋值式定义 var fn = function () {} 声明式定义 function 函数名() {} 具体含义: function ---> 关键字 函数名(可以不写) ---> 不写的函数, 我们称之为匿名函数, 如果有 叫具名函数(函数) () ---> 书写参数的位置(暂时不讲) {} ---> 代码, 函数调用要执行的代码 2.调用 函数的定义分两种方式, 调用 只有 1 种 语法: 函数名() 3.声明式与赋值式的区别 区别: 1. 书写 2. 调用 赋值式定义, 不能再定义前 调用函数, 声明式可以 fn() fn1() // 正常调用 var fn = function () { console.log(1) } function fn1() { console.log(2) }

     fn()
     fn1()
    
  10. 变量提升 在 浏览器读 JS 代码的时候 有一个 预解析, 此时会有一个变量提升 什么是变量提升 在预解析时, 将 JS 内部的 变量 全部提升到 当前作用域顶端(当前代码的最上边) 变量提升的时候, 值不会到最顶端, 可以理解为, 把声明变量提升到最顶端, 但是没赋值 什么是 变量提升 自己写的代码: fn() var fn = function () { console.log(1) } fn()

         浏览器预解析
             fn()                        ---> 不需要变量提升
             var fn = function () {      ---> 需要变量提升
                 console.log(1)
             }
             fn()                        ---> 不需要变量提升
    
         变量提升后
             var fn;         ---> fn == undefined
    
             fn()            ---> undefined()
             fn = function () {console.log(1)}
             fn()            ---> 打印1
    

    浏览器在预解析的时候, 除了会做 变量提升 还会做一件事; 函数的声明提升(值也跟着上去了) 自己写的代码 fn() function fn() { console.log(1) } fn()

         浏览器预解析
         fn()                ---> 不需要提升
         function fn() {     ---> 需要 函数声明提升
             console.log(1)
         }
         fn()                ---> 不需要提升
    
         函数声明提升后
         function fn() {
             console.log(1)
         }
    
         fn()            ---> 正常打印
         fn()            ---> 正常打印  
    
  11. 函数的参数 为什么要有 参数? 如果 没有 参数, 那么函数的功能 相对单一, 不够灵活 函数的参数 他的 作用 ---> 能够让函数的功能更加灵活, 更方便在多个地方调用 参数也可以让我们的函数更具有 差异性 参数语法 1. 形参 ---> function或者函数名后的 小括号 2. 实参 ---> 函数调用时的 小括号中 参数的作用 1. 形参 每书写一个形参, 就相当于在函数内部创建一个变量, 形参的值 是由 实参传递进来的 2. 实参 按照书写顺序 一一对应, 传递给形参

  12. 函数参数的数量 参数数量不一致 1. 形参少, 实参多 2. 实参少, 形参多 1. 形参少, 实参多 function fn(a) { console.log(a) } fn(1, 2, 3)

      1. 形参少, 实参多
         我们当前案例, 传递 1个形参, 3个实参
         第一个实参, 传递给 对应的形参
         后续的所有参数, 都不能通过形参获取
      2. 实参少, 形参多
         我们当前案例, 传递 3个形参, 1个实参
         第一个实参, 传递给对应的形参
         后续没有实参
         所以, 后续的形参相当于 之声明不赋值 ===> undefined  
    
  13. 函数参数的默认值 函数参数的默认值 创建形参的时候, 直接赋值 如果传递对应实参, 按照实参的值 如果没有传递对应实参, 按照默认值 function fn(a, b, c){ console.log(a, b, c) } fn(200)

         function fn1(a, b = 100, c = 200){
             console.log(a, b, c)
         }
         fn1(50)
         fn1(50,100)
         fn1(50,100,200)
    
  14. 函数的返回值 函数的返回值 每一个函数都有返回值, 不管是否写了返回值 每个函数 默认都会有返回值 ---> 默认返回 undefined 如果我们自己手写了 返回值, 那么就不会返回默认值了, 返回的是 我们书写的 函数返回值书写语法 return 要返回的内容 注意点: 函数的返回值具有中断函数的功能, 所以我们手写返回值需要放在最后 var num = prompt('请输入一个值') function fn() { console.log(1) } var myFn = fn() // fn 函数的返回值, 会赋值给 变量 myFn console.log(myFn) // ---> undefined

     function fn1() {
         return '我是 fn1 的返回值'
     }
     var myFn1 = fn1()
     console.log(myFn1)  // 我是 fn1 的返回值
    
     function fn() {
         console.log(1)
         console.log(2)
         console.log(3)
    
         return 500
     }
    
     fn()
    
     function fn(a) {
         规定, 函数不能接受数字。
         if (typeof (a) == 'number') {
             console.log('哈哈哈')
             return
         }
         if (typeof (a) == 'number') return
         console.log('参数 a 不是数字类型的, 所以会执行到我这个位置')
         }
         fn('100')
    
  15. 作用域 我们的变量 !! 不是说 在任何地方都可以使用 就是变量有一个使用区间, 这个可以使用的区间 就叫做 作用域 作用域分为两个(现在所学的暂时为两个)

    1. 全局作用域 就是再 script 标签内部声明的变量 就是全局作用域的变量 在 全局作用域声明的变量, 在哪里都可以使用 浏览器在运行的时候 会给我们一个 window 对象, 我们的全局作用域 内声明的变量 全都在 window 对象中
    2. 局部(函数)作用域 就是在 函数内部 的大括号内 这个区间叫做 函数作用域 在函数作用内声明的变量, 只能在当前函数内部使用, 在函数外部(超过作用域了) 就无法使用 函数作用域内声明的变量, 不会挂载到 window 对象上 var a = 100 // 在全局作用域中声明的变量, 同时他也会挂载到全局对象 window var a1 = '这是我手写的' // 在全局作用域中声明的变量, 同时他也会挂载到全局对象 window console.log(window) function fn() { // 这里边就是函数作用域 var amyFn = '我是在函数作用域内声明的变量' console.log(amyFn) // 我是在函数作用域内声明的变量 } fn() console.log(amyFn) // amyFn is not a defined
  16. 变量的访问规则
     console.log(a)
     会先在自己当前作用域内查找 变量 a, 找到直接使用(打印)
     如果没有找到!!! 会向上层作用域查找, 不会向下层查找!!!
     如果 上层作用域 内也没有找到, 会继续向 上层作用域的上层作用域查找(相当于是去自己爷爷级作用域)
     一直会找到最顶层的全局作用域, 找到就是用, 找不到 就报错
     变量的赋值规则
     a = 1
     会先在自己当前作用域内查找 变量a, 找到直接赋值
     如果没找到!!! 会向上层作用域查找, 不会向下层查找!!!
     如果上层作用域内也没有找到, 会继续向上层作用域的上层作用域查找(去自己的爷爷级作用域)
     一直会找到最顶层的全局作用域, 找到直接赋值, 找不到 将 变量定义为全局变量  并赋值
     作用域链(纯概念)
     在自己作用域内查找, 找不到去上层, 不会去下层, 这样一层一层的一个链条 我们叫做作用域链
     简单总结: 永远向上查找, 不会向下
         var a = 100
         function fn() {
         会先在自己当前作用域(fn函数内部) 查找, 找到直接使用, 这里找不到, 因为函数内部没有声明变量a
         那么会去自己的上一层作用域(全局作用域)中查找, 找到直接使用
         console.log(a)              // 100
             function fn1() {
                 var a = 200
             }
         }
         fn()
         var a = 1
         function fn() {
             function fn1() {
         console.log(a)              // 1
                     查找规则:
                         1.在当前作用域(fn1函数内部)查找, 找到直接使用, 但是没找到, 所以会去父级(fn函数内部)
                         2. 在父级作用域(fn函数内部)查找, 找到直接使用, 但是没找到, 所以会去父级(全局)
                         3. 在全局作用域查找, 找到直接使用, 找到了 var a = 1;    所以会打印1
             }
         fn1()
         }
         fn()
         function fn() {
             function fn1() {
             console.log(a)
                     查找规则:
                         1. 在当前作用域(fn1函数内部)查找, 找到直接使用, 但是没找到, 所以会去父级(fn函数内部)
                         2. 在父级作用域(fn函数内部)查找, 找到直接使用, 但是没找到, 所以会去父级(全局)
                         3. 在全局作用域查找, 找到直接使用, 没找到    所以会报错
             }
             fn1()
         }
         fn()
         function fn() {
         function fn1() {
             a = 1
                 赋值规则:
                 1. 在当前作用域(fn1函数内部)查找, 找到直接赋值, 但是没找到, 所以会去父级(fn函数内部)
                 2. 在父级作用域(fn函数内部)查找, 找到直接使用, 但是没找到, 所以会去父级(全局)
                 3. 在全局作用域查找, 找到直接赋值, 没找到    所以会将变量定义为全局变量 并赋值
             }
             fn1()
         }
         fn()
         console.log(a)  // 1