美文网首页JavaScript
ES6系列 (一)使用const声明常量

ES6系列 (一)使用const声明常量

作者: Eastboat | 来源:发表于2019-10-11 23:44 被阅读0次

带着问题去学习:

  1. 什么是常量?他们的工作机制是什么?
  2. 学会在什么时候使用常量?

常量不能被重新赋值

一旦将某个固定的值赋值给常量,任何重新给常量赋新值的尝试都会导致错误发生

//案例-1
const NORMAL_NUMBER=123; //定义一个常量
NORMAL_NUMBER=12; //尝试重新赋值
console.log(NORMAL_NUMBER); // 报错

以上代码会让我们的思维变得很混乱,我们脑海中会认为这是一成不变的常量,常量是不变的,所以我们不能给它重新赋值,但是你会发现,这里所说的"不变"和"不能重新赋值"有什么区别呢?

//案例-2
const normalObject = {}; //定义一个常量
normalObject.propertyOne = "this is property of One";
normalObject.propertyOne = "this is a new property"; //重新给对象的属性赋值
console.log(normalObject.propertyOne); //'this is a new property';

此时输出的是对象属性propertyOne重新赋值后的属性值

//案例-3
normalObject = { newProperty: "eastboat" }; //尝试重新赋值一个新的对象,将属性定义为newProperty
console.log(normalObject); //TypeError: Assignment to constant variable.

由上述可知,重新赋值与变量的绑定有关,也就是将名称绑定到某条数据上,如上案例 1,NORMAL_NUMBER 变量是被绑定到了数据 123 上面,所以重新赋值就会报错;而常量是不可变的,这里的不变是属于绑定时所含的实际数据的属性,如上案例 2 和 3 所示,常量绑定的是一个对象,我们都知道 js 中字符串,数组等都是不可变,但是对象是可变的(引用类型),所以创建后的对象我们将可变的值(属性)赋给它。如果将常量重新定义为一个新的对象(指向一个新的地址),此时就会报错,所以我们只能修改对象数据本身的值,而不能直接修改常量本身。

思考下列代码输出什么?

const num = 0;
num++;
console.log(num);

现在我们再看一个案例:

let strA='hello';
let strB=strA;
strB += ‘,world’;
console.log(strA)  //hello
console.log(strB) //hello,world
image
这也就是不能对常量使用运算符+=的原因,因为有新的值产生,那么此时你可以再次思考下面代码发生了什么?
const strA = "hello";
const strB = strA.concat(",world!");

有时候直觉让我们觉得报错,但是请记住concat 是对字符串进行的操作,不改变现存的字符串或对含有此字符串的变量进行重新赋值,所以此时 strB 得到的是一个新的字符串

何时使用常量?

//最常见使用常量创建标识
const ADD_PERSON = "ADD_PERSON";
const DEL_PERSON = "DEL_PERSON";
let personArr = [];

function actionHandler(action) {
  if (action.type == ADD_PERSON) {
    personArr.push(action.person);
  } else if (action.type == DEL_PERSON) {
    personArr.splice(personArr.indexOf(action.person), 1);
  }
}

如果上面的personArr不会被重新赋值,我们是否可以使用 const 来声明?

const ADD_PERSON = "ADD_PERSON";
const DEL_PERSON = "DEL_PERSON";
const personArr = [];

function actionHandler(action) {
  if (action.type == ADD_PERSON) {
    personArr.push(action.person);
  } else if (action.type == DEL_PERSON) {
    personArr.splice(personArr.indexOf(action.person), 1);
  }
}

设想:我现在需要一个动作来清空列表,可能我们本能的会想到,使用item=[]来清空数组,但是上面我们使用的是const声明的常量,常量是不能被重新赋值的

const ADD_PERSON = "ADD_PERSON";
const DEL_PERSON = "DEL_PERSON";
const DEL_ALL_PERSON = "DEL_ALL_PERSON"; //增加清空数组行为
const personArr = [];
function actionHandler(action) {
  if (action.type == ADD_PERSON) {
    personArr.push(action.person);
  } else if (action.type == DEL_PERSON) {
    personArr.splice(personArr.indexOf(action.person), 1);
  } else if (action.type == DEL_ALL_PERSON) {
    personArr.splice(0, personArr.length); //清空数组
  }
}

最后看一个案例

//常量与绑定值有关,不与所绑定值里面的数值有关,函数仅仅是返回数值,而不是绑定的值
//所以新的let绑定的值可以安全的进行重新赋值
function getValue() {
  const val = 123;
  return val;
}
let myVal = getValue();
console.log((myVal += 1)); //124

相关文章

  • ES6语法

    Tags: ES6 [TOC] ES6 常量 //ES6 const PI=3.1415926;//const声明...

  • 2.ES6 const常量

    ES6中可以使用const声明一个只读的常量。 1、一旦声明,常量的值就不能改变;2、常量声明就要定义值,否则报错...

  • ES6系列 (一)使用const声明常量

    带着问题去学习: 什么是常量?他们的工作机制是什么? 学会在什么时候使用常量? 常量不能被重新赋值 一旦将某个固定...

  • 1.暂时性死区

    ES6中,let/const是使用区块作用域;var是使用函数作用域;在let和const声明变量和常量之前访问对...

  • ES6-------学习(1)

    ES6的三种声明方式: var:一般用在全局。let:一般用在局部。const:在ES6也是用来声明常量的,常量你...

  • ES6+

    ES6简介 ECMAScript 第六代标准 let 和 const 用于声明变量或声明常量 变量和常量var 和...

  • var、let、const 比较

    let 和const 是ES6新定义的,存在一定特性。let用来声明变量,const 用来声明常量。 一、块级作用...

  • JS中的this

    这篇文章不讨论es6的let和const关键词,它们比较特殊,使用let和const关键词声明的变量和常量,会形成...

  • ES6新增了哪些特性?

    ES6新增了哪些特性? const(声明常量),let(声明变量),var(声明变量)全局 map和set数据类型...

  • 2018-09-04

    js变量和常量 JS中与变量常量声明相关的关键字有var、let以及const,其中let和const是ES6的新...

网友评论

    本文标题:ES6系列 (一)使用const声明常量

    本文链接:https://www.haomeiwen.com/subject/jxdfmctx.html