let和const、var

let和const、var

一、var声明的变量会挂载在window上,而let和const声明的变量不会

  1. var a = 100;
  2. console.log(a,window.a); // 100 100
  3. let b = 10;
  4. console.log(b,window.b); // 10 undefined
  5. const c = 1;
  6. console.log(c,window.c); // 1 undefin

二、let

用来声明变量,但是所声明的变量只在let命令所在的代码块内有效

  {
    let a=12
    alert(a)//12
  }
  alert(a)//报错 找不到

let不像var那样会发生变量提升,所以一定要先声明后使用。

  console.log(foo); //undefined
  console.log(bar); //报错
  var foo = 2;
  let bar = 3;

let不允许在相同作用域内重复声明同一个变量。

   let a=12;   let a=5;//报错   console.log(a)


三、const

const同样可以创建块作用域变量,同样只在声明所在的块级作用域中有效。但其值是固定的,不可更改,只读。

    {
    const a=12;
      alert(a);//12
    }
    alert(a)//报错

一旦声明变量,就必须立即初始化,不能留到以后赋值。

  //只声明不赋值就会报错,不能使用null占位
  const foo; //报错

const和let一样没有变量提升,同样不能重复声明。

如果声明的是复合类型数据,可以修改其属性

  const obj = {a:100};

obj.name = 'apple';
  obj.a = 10000;
  console.log(obj);  // {a:10000,name:'apple'}
  var a = 100;
  if(1){

     a = 10;

    //在当前块作用域中存在a使用let/const声明的情况下,给a赋值10时,只会在当前作用域找变量a,
    // 而这时,还未到声明时候,所以控制台Error:a is not defined
    let a = 1;
  }

五、三者之间的区别:

  1. var声明的变量会挂载在window上,而let和const声明的变量不会
  2. var声明变量存在变量提升,let和const不存在变量提升
  3. let和const声明形成块作用域,而var不存在此作用域
  4. 同一作用域下let和const不能声明同名变量,而var可以

注意:在js解析的时候,优先解析const,因为它不能修改的是栈内存在的值和地址。然后解析let 因为没有块作用域可能底层有处理,最后解析var。

标签模板

本质不是模板 而是函数的另一种调用形式

标签就是事先封好的函数 参数就是后面接的字符串

alert`hello`

//等同于

alert(["hello"])

${}作为分隔符 固定的字符串 放进数组里面 ${}里面的变量依次作为后面的参数

标记模板(函数)的参数:

参数1 :被变量分割成的字符串数组

参数2… :变量

函数的扩展

函数参数的默认值

ES6里面可以给参数设置默认值

1.为了防止报错 不用特地在函数内部处理参数

2.设置了默认值 即使不传参数 程序也不会报错

注意:参数是在函数的局部作用域内设置的局部变量 默认是函数内部声明过的 所以不要使用let在函数内部声明

Symbol

Symbol 是ES6新引入的一种基本数据类型 表示独一无二的值 是js中的第六种基本数据类型

基本数据类型:string number boolean undefined null Symbol

typeof的返回值 string number boolean undefined object function Symbol

特性

Symbol函数生成的数据 是唯一的  即便是参数也是不一样的

  • 引入的背景

    • 对象的属性名容易产生命名冲突,为保证键名的唯一性,所以es6引入Symbol数据类型,确保创建的每个变量都是独一无二的。
  • 特点

    • Symbol类型的数据是类似字符串的数据类型,由于Symbol函数返回的值是原始类型的数据,不是对象,所以Symbol函数前不能使用new命令,否则会报错。

    • 可选参数。由于控制台输出不同的Symbol变量时都是Symbol(),所以为了区分,在Symbol变量传入参数进行区分。

let a1 = Symbol('a1')

let a2 = Symbol('a2')
  • 用法
  • 定义对象的唯一属性名

//在对象里用Symbol作为属性名的三种写法
let name = Symbol()
//第一种方式:借助数组读取name变量,此时不能用点运算符,点运算符默认后面的参数时字符串
let a = {}
a[name] = 'Nick'
//第二种方式:构造时声明
let a = {
    [name]:'Nick'
}
//第三种Object.defineProperty
let a = {}
Object.defineProperty(a,name,{value:'Nick'});
  • 定义常量
//定义字符串常量
const name = Symbol('Nick')
原文地址:https://www.cnblogs.com/zycs/p/14053018.html