JavaScript笔记-2

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

推荐阅读更多精彩内容