let和const在许多技师眼中可能将而已表达式新闻稿符,只不过错了他却是有许多小技术细节更为重要的,这儿我单纯如是说以下几点。
块级返回值
在ES6以后他们脑海中里如果只存有自上而下返回值和表达式级返回值,没块级返回值。所以为何要导入块级返回值呢?
防止内层表达式被全面覆盖
var str = “hello”; function d() { console.log(str); if (false) { var str = world; } } d();//undefined坚信许多刚进阶的老师看见前述标识符会略有困惑,只不过在自上而下返回值str表达式早已被新闻稿且表达式,为何我表达式里头出访不出呢。这儿就牵涉到表达式提高和表达式级返回值的概念。前述标识符只不过等同留用标识符,当表达式被继续执行的这时候聚合了两个捷伊返回值也是表达式返回值,js发动机会把表达式新闻稿提及方式体的最后面,我们能看见而已新闻稿了并没表达式。因此是 undefined。
var str = “hello”; function d() { var str ; console.log(str); if (false) { str = world; } } d();//undefined循环式表达式环境污染自上而下表达式
var str = hello; for (var i = 0; i < str.length; i++) { console.log(str[i]); } console.log(i); // 5许多老师复试的这时候可能将会碰到下面类似于的标识符,困惑点如果在为何会列印出为何会是5,反之亦然的规矩标识符有如上方。表达式会被提高,因此在循环式完结后i就被加总到了5.
var str = hello; var i; for ( i = 0; i < str.length; i++) { console.log(str[i]); } console.log(i); // 5es6的let和const新闻稿符,是不存有表达式提高的;与此同时也只在块级返回值施行。
那个标准答案如果很显著了吧
var str = “hello”; function d() { console.log(str); if (false) { let str = world; } } d();短暂性死区MDN
甚么是短暂性死区呢?许多人可能将很蒙蔽。那就听我暗喻,在我看来他们采用了let和const指示,返回值内会对那些指示新闻稿的表达式,在它的新闻稿周期内形成一种封闭返回值。这在语法上,称为“短暂性死区”。标识符展示如下:
if (true) { tmp = abc; // ReferenceError console.log(tmp); // ReferenceError let tmp; console.log(tmp); // undefined tmp = 123; console.log(tmp); // 123 }因为let和const新闻稿是不会被提高的,因此为了保障新闻稿的有效性,js的解释发动机会对表达式所处的块级返回值形成一种保护,因此在新闻稿以后采用会有语法错误,是不被允许的。
不能重复新闻稿
function de(){ var a = “1”; var a = “2”; console.log(a); } de()//不报错 function de(){ var a = “1”; let a = “2”; console.log(a); } de()//报错 function de(){ let a = “1”; let a = “2”; console.log(a); } de()//报错坚信我们一般不会新闻稿重复表达式编码,因此在这儿就不做解释了。如果我们感兴趣能自己研究或者来现场一起学习。
const常量
const新闻稿符的大多特性和let相同,这儿就不多做解释了。我们都知道const是新闻稿常量的,一但表达式被新闻稿成常量它就不能再被继续修改了。我们要注意的是这儿表达式不可被修改的是存储的地址值不可被修改,意思是单纯类型的数据是不能修改的。复合类型的数据(主要是对象和数组)const只能保证那个指针是固定的,而那个具体的对象实例包含的属性是能被修改的。看看标识符他们可能将会更清楚:
//实例一 const a = “hello”; console.log(a);//”hello” a = “world”;//Assignment to constant variable //实例二 const obj = {}; obj.name = “jack”; console.log(obj.name);//”jack” obj = {};//Assignment to constant variable. //实例三 const a = []; a.push(Hello); console.log(a); //[ Hello ] a.length = 0; a = [Dave]; // Assignment to constant variable.正如我们所看见的字符串a被复制后就不能在修改,而对象和数组是能改变它里头的元素的,但是不能给重新复制两个捷伊对象实例。由此就能断定const新闻稿出的表达式存的是固定的地址值。
关于es6还有更多的知识点,请关注我接下来的
作者:Topqiang
链接:
https://juejin.im/post/5aab182c518825558c472b1f