# 第2章 语法

# 由于使用块注释,会报语法错误

js中/* */块注释,中的字符也可能出现在正则表达式字面量中,所以块注释对于被注释的代码块来说是不安全的。应该避免使用/* */,而使用//注释。

  // /*
  //   var a=/a*/.match(a)
  // */
1
2
3

# js不允许使用保留字来命名变量或参数

  var undefined=1;
  var NaN=2;
  var Infinity=3;
  // var if=1;//if报错
  console.log(undefined,NaN,Infinity);//undefined,NaN,Infinity 并不会打印123
  // function (if,b){}//if报错

  // var if={}//if报错
  var obj={
    false:{new:1},
    if:4,//保留字
    undefined:1,
    NaN:2,
    Infinity:3
  }
  console.log(obj.false.new);//1
  console.log(obj.if)//4
  console.log(obj.undefined)//1
  console.log(obj.NaN)//2
  console.log(obj.Infinity)//3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 1和1.0

  console.log(1===1.0)//true
1

# 转义字符反斜杠\

  var a='\1111x\aa"x\'x/nx\nx\\x';
  console.log(a)
  // I1xaa"x'x/nx
  // x\x
1
2
3
4

# switch中default在最上边

  switch ('2') {
    default:
      console.log('default')
      break;
    case 2:
      console.log('数字2')
      break;
    case '2':
      console.log('字符串2')//会进这个
      break;
  }
  //先执行case中的语句,没有找到匹配就执行default语句。
1
2
3
4
5
6
7
8
9
10
11
12

# js不允许在return关键字和表达式间换行,如果return后没值,就返回undefined

  var a2=function(){
    return
      2;
  }()
  console.log(a2)//undefined
1
2
3
4
5

# js不允许在break关键字和标签间换行

  function foo() {
    dance:
    for(var k = 0; k < 4; k++){
      dd:
      console.log(k)//0
      for(var m = 0; m < 4; m++){
          if(m == 2){
            //这样就可以直接break掉整个循环嵌套了!!
            break dance;

            /* 换行就不起作用了 */
            // break
            // dance;
          }
          console.log(m)//0,1
      }
    }
    console.log('dance')
  }
  foo();//0 0 1 dance
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# typeof

typeof运算符产生的值有'number'、'string'、'boolean'、'undefined'、'function'、'object'

# &&和&、||和|

function x1(){
    return true
  }
  function x2(){
    return false
  }
  console.log(x1()&&x2());//x1和x2都执行了,返回false
  console.log(x2()&&x1());//只有x2执行了,x1没执行,返回false

  console.log(x1()&x2());//x1、x2都执行了,返回0
  console.log(x2()&x1());//x1、x2都执行了,返回0

  console.log(x1()||x2());//只有x1执行了,返回true
  console.log(x2()||x1());//x1、x2都执行了,返回true

  console.log(x1()|x2());//x1、x2都执行了,返回1
  console.log(x2()|x1());//x1、x2都执行了,返回1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

总结:

  1. 双与(&&)如果第一个返回值为false第二个就不执行,第一个为true就执行第二个。返回结果为true或false

  2. 单与(&)两个都执行完,返回结果为与计算后的值

  3. 双或(||)如果第一个返回值为false执行第二个,第一个返回值为true第二个就不执行。返回结果为true或false

  4. 单或(|)两个都执行完,返回结果为与计算后的值

# js内建对象

Number、String、Boolean、Date、Math、RegExp、Array、Function

  for (const i of 'qwer') {
    console.log(i)//qwer
  }
  for (const i in 'qwer') {
    console.log(i)//0123
  }
  var bbb={0:'q',1:'w',length:2}
  var eee={0:'q',1:'w',length:2,[Symbol.iterator]:Array.prototype[Symbol.iterator]}
  var aaa={0:'q',1:'w'}
  var ccc=[1,2,3]
  var ddd='1234'
  console.log(Array.from(aaa)) //[]
  console.log(Array.from(bbb)) //["q", "w"]
  console.log(Array.from(ccc)) //[1,2,3]
  console.log(Array.from(ddd)) //["1", "2", "3", "4"]
  // for (const x of bbb) {
  //   console.log(x)//Uncaught TypeError: bbb is not iterable
  // }
  for (const x of eee) {
    console.log(x)//qw
  }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21