js回顾、数组

94 阅读2分钟

var a = 10; var b = a; a = 20; console.log(b); //10

var a = [10]; var b = a; b.push(20); console.log(a,b); //[10, 20] [10, 20]

var a = {name:'S'}; var b = a; b.name = N; console.log(a,b); //{name: "N"} {name: "N"}

4:var属于ES5规范,let属于ES6规范

5:var有预处理机制,let没有。预处理机制也就是常说的声明提前

      声明提前:不管变量被声明在函数什么位置,所有变量声明都会被提升至函数顶部(变量声明指 var a; 即声明还未赋值)

           比如声明变量a并赋值为1,即 var a = 1; 则 var a;会被提升至函数顶部 (只是a被提前,a的值1不会被提前)

      注:1. 在声明变量时一定要初始化 ,初始化指 var a = 1; (声明并赋值 )

        2. 即使在函数内部,声明变量时一定要加上var,不要只写 a = 1; 否则变量a会自动升为全局变量

    

  下面立即函数执行后,控制台不会打印出1,而是undefined,因为只有声明被提前,值没有           下面立即执行函数执行后,控制台不会打印出1和undefined,而是报错,因为let声明的变量不会被提前

       :作用域的不同,var是全局作用域,let是块级作用域

    下面代码控制台会打印出1 

     下面代码控制台不会打印出1,会报错,提示a没有定义 (let定义的变量只在{}里才能访问到)

  

数组:
  <script>
  let arr = [
      {
          name:"Simba",
          age:20
      },
      {
          name:"Ace",
          age:30
      },
      {
          name:"Roger",
          age:40
      }
  ]
  //遍历
  arr.forEach(r => {
      r.gender = "男"
  })
  //通过旧数组映射出新数组
    console.log(arr.map(r => "姓名" + r.gender));
    console.log(arr.map(r => r.age));
    //过滤师选
    console.log(arr.filter(r => r.age >= 30));
    //是否存在
    console.log(arr.some(r => r.age === 20));
    //是否全部都是
    console.log(arr.every(r => r.gender === "男"));
    //统计操作
    console.log(arr.reduce((total,current) => total + current.age,0));
    
</script>

展开运算符 "..."
 <script>
    let a = {
        name: 'simba',
        age: 20
    }
    let b = {
        ...a,
        gender: "男"
    }
    console.log(b);
    console.log(...[1, 2, 3]);
    function test(...arr) {
        console.log(arr.reduce((a, b) => a + b));
    }

    test(1, 2, 3, 4, 5)
    function aaa(age = 20) {
    console.log(age);

    }

    aaa()
    aaa(33)
    let str = `我叫${b.name}`
    console.log(str);

 </script>