美文网首页
JavaScript笔记-2

JavaScript笔记-2

作者: 蚂蚁踩死我 | 来源:发表于2019-03-21 23:16 被阅读0次

    [TOC]

    控制流

    控制流的底层

    start=>start: 开始
    cond1=>condition: 判断
    sub1=>subroutine: 子程序
    op1=>operation: 程序
    end=>end: 结束
    
    start->cond1
    cond1(yes)->op1->end
    cond1(no)->sub1(top)->cond1
    

    while循环

    • 只要条件满足,会不断重复执行块语句

    块语句

    • 也称为复合语句
    • 花括号包裹的一系列语句得集合
    • 不是控制流语句
    • 和控制流结合使用

    空格

    辅助方法

    if else语句

    do…while循环

    for循环

    if语句

    控制流异常

    • break提前结束循环
    • continue循环跳到下一步
    • return退出当前方法
    • throw指出必须被异常处理器所捕获的异常(包括超出当前控制流得异常)

    switch语句

    for…in循环

    是为了那些循环对象中有一个属性key而设计的

    for(变量 in 对象){
        语句
    }
    
    const player = {name: 'Thomas',
                    rank: 'Midshipman',
                    age: 25} ;
    for(let prop in player){
            if(!player.hasOwnProperty(prop)) continue ;
        console.log(prop + ':' + player[prop]) ;
    }
    

    for..of循环(ES6)

    另一种在集合中遍历元素的方法

    for(变量 of 对象)
      语句
    
    • 可以遍历任何可迭代的对象
    • 遍历数组,又不需要知道每个元素的索引的最佳选择
    const arr = [ 'a', 'b', 'c'] ;
            for(let it of arr){
                alert(`arr的元素有${it}`) ;
            }
    

    实用的控制流模式

    使用continue减少条件嵌套

    //典型的嵌套控制流
    //num 是 randomNum()产生的随机数
    while(num > 1 && num < 100){
      if(num === 7){
            alert('lucky you') ;
      }
      else{
            num = randomNum() ;
      }
    }
    
    //使用contionue使结构更加「扁平」
    while(num > 1 && num < 100){
      if(num === 7){
            alert('lucky you') ;
            continue ;
      }
      num = randomNum() ;
    }
    

    使用break或return 避免不必要的计算

    循环结束后使用索引的值

    循环一个列表同时还在修改它,常用做法使用索引递减的循环方式

    表达式和运算符

    • 表达式是一种特殊的语句

      • 对生成的结果做显式的转换
      • 能解析成值,所以可以和其他表达式组合在一起
      • 可以用来赋值
      let x ;
      x = 3 * 5 ; //第一个运算符表达式3 * 5 ,返回结果15 
                  //第二个赋值表达式x = 15 ,返回结果就是所赋的值
      
    • 非表达式语句

    运算符

    • 运算符是表达式的"动作"
    • 运算符使用1个以上的操作数进行运算

    算数运算符

    JavaScript中所有的数字都是双精度的,所以算数运算可能返回小数

    运算符优先级

    比较运算符

    • 严格相等===

      两个值引用了同一个对象,或拥有相同类型的相同值

    • 非严格相等==

    比较数字

    • NaN与任何值都不想等,包括它自己

      • 可以使用内置函数isNaN(数字)判断某个数字是否是NaN,返回布尔值
    • 小数比较最好使用关系运算符测试它是否足够接近目标

      JavaScript中有个数字常数Number.EPSILON,1和比1大且最接近于1的数之差。

      const a = 0.1 ,
            b = 0.2 ,
            c = 0.3 ;
      
      //num 不为0 ,实际值是5.551115123125783e-17
      let num = a + b - c ;
      //如果直接 a+b === c 这样比较就会返回false
      
      //将a+b 和 c 的差num与Number.EPSILON相比
      if(num < Number.EPSILON ) alert(`a+b等于c`) ;
      

    字符串连接+

    JavaScript会根据运算对象的类型来决定执行加法 还是字符串连接

    逻辑运算符

      • undefined
      • null
      • false
      • 0
      • NaN
      • ''空字符串
    • 真(除了"假"的其他值)

      空数组也为

    与或非

    短路求值

    const bool1 = true ;
    let a = 0 ;
    //或运算,第一个为真,短路,之后的a++不执行。
    const result1 = bool1 || a++ ;
    
    const bool2 = false ;
    let b = 0 ;
    //且运算,第一个为假,短路,之后的b++都不执行
    const result2 = bool2 && b++ ;
    
    

    非布尔值的逻辑运算

    • 使用布尔值做运算,结果只能是布尔值
    • 非布尔值做运算,能确定结果的值就是逻辑运算的结果
    • 使用了!非运算符,永远返回布尔值

    条件运算符(三元运算符)

    const bool = false ;
    
    const message = bool ? "有消息了" : "没有消息" ;
    //等价于使用if...else
    if(bool){
        const message = "有消息了" ;
    }
    else{
        const message = "没有消息" ;
    }
    
    

    逗号运算符

    • 优先级最低

    • 它会按顺序执行多个表达式,但是只返回最后一个表达式的结果。

      const a = 1 ,
            b = 2 ,
            c = 4 ;
      
      const d = (a + b , b + c , a + c ) ;
      alert(d) ;//5
      
      

    分组运算符()

    位运算符

    类型判断运算符typeof

    表达式 返回值 备注
    typeof null "object"
    typeof Symbol() "symbol" ES6
    ... ... ...

    void运算符

    计算操作数并返回undefined,没什么用,唯一的用途是作为HTML标签<a>的URI

    <a href="javascript: void 0">lol</a>
    

    赋值运算符

    • 链式赋值

      let a, b ;
      a = b = 1 ;
      
    • 优先级低于关系运算符

      const a = 1;
      let n , m;
      
      n = a < 0 ;
      (m = a) < 0 ;
      console.log(n) ;//false
      console.log(m) ;//1
      

    解构赋值(ES6)

    允许将对象或数组分解成多个单独的值

    • 变量名必须与对象中的属性名保持一致

      const obj = {
                  name : 'Bob' ,
                  age : 25 ,
                  color : "red" ,
                  number : 001
              } ;
      
      //多个address,少了个number;
      const {
        address,
        name,
        age,
        color
      } = obj ;
      
      address;//undefined
      name;//'Bob'
      age;//25
      color;//'red'
      number;//error,未定义
      
      
    • 声明和赋值也可以分开,但是需要在赋值的时候使用()括起来

      // const 声明需赋值,所以此处换成let
      let address,
          name,
          age,
          color;
      
      ({address, name, age, color} = obj ) ;
      
      
    • 数组解构只能指派标识符得属性名

    • 展开运算符,可以将数组剩下的元素放入一个新的数组

      const arr = [1, 3, 5, 6, 7, 8, 10] ;
      let [one, three, five, ... other] = arr ;
      one;//1
      three;//3
      five;//5
      other;//[6, 7, 8, 10]
      
      
    • 数组解构可以方便交换变量的值

      let a = 1 , b = 0 ;
      [a, b] = [b, a] ;
      a; //0
      b; //1
      
      

    对象和数组运算符

    运算符 描述
    . 成员访问
    [] 计算机成员访问
    in 判断属性是否存在
    new 实例化对象
    instanceof 原型链测试
    ... 展开运算符
    delete 删除运算符

    模板字符串中的表达式

    表达式和控制流模式

    • if…else语句转化成条件表达式
    if(bool){
      message = '有' ;
    }
    else{
      message = '无' ;
    }
    
    //转化成表达式
    message = bool ? '有' : '无' ;
    
    • if语句转化成短路求值的逻辑或表达式
    if(!options) options = {} ;
    
    //转化
    options = options || {} ;
    

    相关文章

      网友评论

          本文标题:JavaScript笔记-2

          本文链接:https://www.haomeiwen.com/subject/moxkvqtx.html