JS语法
语句块
JS使用大括号构成语句块。
ES6 之前语句块是没有作用域的,从ES6开始支持 块作用域 ,let只能在块作用域内可见,函数作用域还是在函数内对内可见,外部无法直接访问
function hello() { let a = 1; var b = 2; c = 3 } //console.log(a) // 不可见 //console.log(b) // 不可见 //console.log(c) // 不可见吗?
块作用域
if (1) { let d = 4; var e = 5; f = 6 if (true) { console.log(d) console.log(e) console.log(f) console.log('-------------') g = 10 var h = 11 } } let d = 44 // console.log(d) // 块作用域使用let,不可见;但是块外的d可见 console.log(e) // 块作用域使用var,可见 console.log(f) // 块作用域隐式声明,可见 console.log(g) // 可见 console.log(h) // 可见
大括号中的一行可以不加括号,多行必须加,为了代码安全性,最好全都加上
流程控制
条件分支
a = 100 if (a<100) { console.log("less than 100") }else if (a>100) { console.log("more than 100") }else if (a === 100) { console.log("That's OK") }else { console.log("No")
注意等效false的值
false,undefined,null,0,NaN,空字符串,其他的都视为true
注意,空数组,空对象是等效true的
switch...case分支语句
switch (expression) { case label_1: statements_1 [break;] case label_2: statements_2 [break;] ... default: statements_def [break;] }
switch有向后穿透的能力,可以在case中恰当使用break语句,否则会继续向下执行
x = parseInt(Math.random() * 10)
switch (x) { case 0: console.log("zero"); break; case 1: console.log("one"); case 2: console.log("two"); case 3: console.log("three"); break; case 5: case 4: console.log("four") default: console.log("other") }
switch...case结构都可以转换为if...else...结构,多分支结构
for 循环
for 循环可以在一行实现。
( ; ; )第一部分是要迭代变量,进入时执行一次,第二个是退出条件,每次都要判断,第三个执行条件是在执行完代码块才执行的。
先判断退出条件,执行代码块,再走第三部分
// C风格循环 for (i=0;i<10;i++){ console.log(i) }
也可以这样使用,但是循环次数一样才能
for (var x=0,y=5;x<6;x++,y--) { console.log(x+y) }
也可以使用跳过的方法
for (i=0;i<10;i +=3){ console.log(i) }
死循环
for (;;) // 死循环 console.log(".......")
while循环 和 do...while循环
arr = [1,2,3,4] var i=0,j=arr.length-1 while (i<arr.length){ console.log(arr[i]); i++; }
do...while循环,先进入循环,然后判断,为真就继续循环
var i= 0 do{ console.log(arr[i]); i++; } while (i<arr.length);
for...in循环
对象操作语句for...in用来遍历对象的属性
for in 循环返回的是索引或者key,需要间接访问到值。
数组反正返回的是索引,C风格for循环操作可能方便点。根据个人喜好选择。
对象用for in合适
for...of 循环
注意:for ... of 不能迭代对象。
原因是,of后面必须是一个迭代器(TypeError: obj[Symbol.iterator] is not a function)
可类比python中的for in,例如for x in [ ]
只能迭代数组
break 、 continue
break 结束当前循环
continue 中断当前循环,直接进入下一次循环
for迭代的差别
function sum(arr){ for (let x in arr){ // 遍历index或对象属性 console.log(x, typeof(x),arr[x]); } for (let x of arr){ // 遍历元素 console.log(x, typeof(x)); } for (let x=0;x<arr.length;x++){ // 自己定义索引数值遍历 console.log(x, typeof(x),arr[x]); } } sum([3,6,9]);