let和const====均参考阮大神的es6入门

// 解构复制
// let [foo,[[bar],baz]] = [1,[[2],3]];
// console.log(foo);//1
// console.log(bar);//2
// console.log(baz);//3

// let [,,third] = ["foo","bar","baz"];
// console.log(third)//baz;

// let [x,,y] = [1,2,3];
// console.log(x+"---"+y)//1---3

// let [head,...tail] = [1,2,3,4];
// console.log(Array.isArray(tail))//证明是数组
// console.log(head+"--"+tail)//1--2,3,4
// console.log(typeof tail)//object

// let [x, y, ...z] = [‘a‘];
// 解构不成功,变量的值就等于undefined
// console.log(x+"---"+y+"---"+z)//a---undefined---[]

// 如果等号的右边不是数组(或者严格地说,不是可遍历的结构,参见《Iterator》一章),那么将会报错。
// 报错
// let [foo] = 1;
// let [foo] = false;
// let [foo] = NaN;
// let [foo] = undefined;
// let [foo] = null;
// let [foo] = {};

// 只要某种数据结构具有Iterator(迭代)接口,都可以采用数组形式的解构赋值。
// Generator函数(生产者?)
// function* fibs() {
// var a = 0;
// var b = 1;
// while (true) {
// //0 1 1 2 3 5
// yield a;
// //1,1 1,2 2,3 3,5 5,8
// [a, b] = [b, a + b];
// }
// }

// var [first, second, third, fourth, fifth, sixth] = fibs();
// console.log(first)//0
// console.log(second)//1
// console.log(third)//1
// console.log(fourth)//2
// console.log(fifth)//3
// console.log(sixth)//5

// var a = [];
// for (var i = 0; i < 10; i++) {
// a[i] = function () {
// console.log(i);
// };
// }
// a[6](); // 10

// var a = [];
// for (let i = 0; i < 10; i++) {
// a[i] = function () {
// console.log(i);
// };
// }
// a[6](); // 6

// let不像var那样会发生“变量提升”现象。所以,变量一定要在声明后使用,否则报错。
// console.log(foo); // 输出undefined
// //console.log(bar); // 报错ReferenceError

// var foo = 2;
// //let bar = 2;// 报错ReferenceError

// 只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
// var tmp = 123;
// 存在全局变量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let声明变量前,对tmp赋值会报错。
// if (true) {
// tmp = ‘abc‘; // ReferenceError
// let tmp;
// }

// var tmp = 123;
// if (true) {
// let tmp;
// tmp = ‘abc‘; //不报错
// }
// ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。

// 在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称TDZ)。
// if (true) {
// // TDZ开始
// //tmp = ‘abc‘; // ReferenceError
// //console.log(tmp); // ReferenceError

// let tmp; // TDZ结束
// console.log(tmp); // undefined

// tmp = 123;
// console.log(tmp); // 123
// }

// “暂时性死区”也意味着typeof不再是一个百分之百安全的操作。
// typeof x; // ReferenceError
// let x

// 作为比较,如果一个变量根本没有被声明,使用typeof反而不会报错。
//console.log(typeof y)//undefined

// 调用bar函数之所以报错(某些实现可能不报错),是因为参数x默认值等于另一个参数y,而此时y还没有声明,属于”死区“。如果y的默认值是x,就不会报错,因为此时x已经声明了。
// function bar(x = y, y = 2) {
// return [x, y];
// }

// bar(); // 报错

// function bar(y = x, y = 2) {
// return [x, y];
// }

// bar(); // 报错

// function bar(x = 2, y = x) {
// return [x, y];
// }
// bar(); // [2, 2]

// 暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。

// 不允许重复声明
// 报错
// function () {
// let a = 10;
// var a = 1;
// }

// // 报错
// function () {
// let a = 10;
// let a = 1;
// }

// function func(arg) {
// let arg; // 报错
// }

// function func(arg) {
// {
// let arg; // 不报错
// }
// }

// 变量提升
// ES5只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景。

// 第一种场景,内层变量可能会覆盖外层变量。
// var tmp = new Date();

// function f() {
// console.log(tmp);
// if (false) {
// var tmp = "hello world";
// }
// }

// f(); // undefined

// var tmp = new Date();

// function f() {
// console.log(tmp);
// if (true) {
// var tmp = "hello world";
// }
// }

// f(); // undefined
// 上面代码中,函数f执行后,输出结果为undefined,原因在于变量提升,导致内层的tmp变量覆盖了外层的tmp变量。
// 第二种场景,用来计数的循环变量泄露为全局变量
// var s = ‘hello‘;
// for (var i = 0; i < s.length; i++) {
// console.log(s[i]);
// }

// console.log(i); // 5

// var s = ‘hello‘;
// for (let i = 0; i < s.length; i++) {
// console.log(s[i]);
// }
// console.log(i); // i is not defined

// 这表示外层代码块不受内层代码块的影响
// function f1() {
// let n = 5;
// if (true) {
// let n = 10;
// }
// console.log(n); // 5
// }
// f1()//5

// 互不影响
// {{{{
// let insane = ‘Hello World‘;
// {let insane = ‘Hello‘;
// console.log(insane)//Hello
// }
// console.log(insane)//Hello World
// }}}};

// 块级作用域的出现,实际上使得获得广泛应用的立即执行匿名函数(IIFE)不再必要了。
// IIFE写法
// (function () {
// var tmp = ...;
// ...
// }());

// // 块级作用域写法
// {
// let tmp = ...;
// ...
// }

// ES5严格模式
// ‘use strict‘;
// if (true) {
// function f() {}
// }
// 报错

// ES6严格模式
// ‘use strict‘;
// if (true) {
// function f() {}
// }
// 不报错

// 报错
// function f() { console.log(‘I am outside!‘); }
// (function () {
// if (false) {
// // 重复声明一次函数f
// function f() { console.log(‘I am inside!‘); }
// }

// f();
// }());

// ES6的块级作用域允许声明函数的规则,只在使用大括号的情况下成立,如果没有使用大括号,就会报错。
// ‘use strict‘;
// if (true) {
// function f() {}
// }

// // 报错
// ‘use strict‘;
// if (true)
// function f() {}

// const声明一个只读的常量。一旦声明,常量的值就不能改变。
// const foo = {};
// foo.prop = 123;

// foo.prop
// 123

//foo = {}; // TypeError: "foo" is read-only

// 常量foo储存的是一个地址,这个地址指向一个对象。不可变的只是这个地址,即不能把foo指向另一个地址,但对象本身是可变的,所以依然可以为其添加新属性。

// const a = [];
// a.push(‘Hello‘); // 可执行
// a.length = 0; // 可执行
// a = [‘Dave‘]; // 报错

// 如果真的想将对象冻结,应该使用Object.freeze方法
// const foo = Object.freeze({});

// // 常规模式时,下面一行不起作用;
// // 严格模式时,该行会报错
// foo.prop = 123;
// 常量foo指向一个冻结的对象,所以添加新属性不起作用,严格模式时还会报错。

// ES6为了改变这一点,一方面规定,为了保持兼容性,var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。也就是说,从ES6开始,全局变量将逐步与顶层对象的属性脱钩。

// var a = 1;
// // 如果在Node的REPL环境,可以写成global.a
// // 或者采用通用方法,写成this.a
// window.a // 1

// let b = 1;
// window.b // undefined

时间: 2024-10-21 13:17:05

let和const====均参考阮大神的es6入门的相关文章

Eclipse中普通java项目转成Web项目(此为参考其他大神的)

在eclipse导入一个myeclipse建的web项目后,在Eclipse中显示的还是java项目,按下面的步骤可以将其转换成web项目. 1.找到项目目录下的.project文件 2.编辑.project文件,找到<natures>...</natures> 3.2中找到的结点中加下面的的代码 <nature>org.eclipse.wst.common.project.facet.core.nature</nature><nature>or

知乎萧井陌大神《编程入门指南v1.3》思维导图

??毕业之后才发现大学的基础课程是多么的关键,有幸在知乎上看到萧井陌大神的文章,打算将涉及的内容学一学,下午花了1h用思维导图将文章梳理如下,希望对大家有帮助(图片太大,因此进行了分割):

c#简单的ajax显示方法,仅供新人参考,大神勿喷!

通过后台拼接的方式实现ajax显示 后台代码: public string IndexDo2()        {            StringBuilder str = new StringBuilder(); //引用命名空间 System.Text            List<Hmodel> list = bll.SentSayShow();            foreach (var reg in list)            {                str

【JavaWeb】参考大神重新写的上传下载

自学java,选择从简单的javaweb入手了. 读了网上某位大神的细致文章,了解后自己写了这篇上传下载的,加上了自己一部分的理解注释. 算是入门篇吧.大致完成了任务,比较粗糙. fileHanderServlet.java (文件上传处理) 1 package up.file.Servletfile; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 i

跟随前端大神的脚步

1. 大神 寻找Github.微博.知乎等技术社区上比较活跃.影响力大的圈内大神,供大家膜拜! 视野所限,未必全面,欢迎大家推荐.自荐. 排名不分先后,序号只为标记方便. 提供信息只为学习交流之用,如有冒犯,请见谅:如果涉及隐私或不愿公开内容,请联系我. 1.1 国际 Chris Coyier Codepen创始人,css-tricks站长. 联系方式: CodePen. Dribbble. Twitter. GitHub. Instagram Sara Soueidan 2015 net aw

2014编程之美-资格赛-大神与三位小伙伴

题目2 : 大神与三位小伙伴 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 L国是一个有着优美景色且物产丰富的国家,很多人都喜欢来这里旅游并且喜欢带走一些纪念品,大神同学也不例外.距离开L国的时间越来越近了,大神同学正在烦恼给她可爱的小伙伴们带什么纪念品好,现在摆在大神同学面前的有三类纪念品A, B, C可以选择,每类纪念品各有N种.其中种类为A_i, B_i, C_i的纪念品价值均为i, 且分别有N+1-i个剩余.现在大神同学希望在三类纪念品中各挑选一件然后赠送给

前端大神总结的学习方法【引用】

下面是一些前端大师的学习方法,目前我正在学习,希望对大家有用! 转载出处: https://github.com/qiu-deqing/FE-learning FE-learning 必备基础技能 基本开发工具 学习方法和学习目标 入门之路 继续提高 一些个人经历 LingyuCoder的学习经历 工具 技能 语言基础 进阶 项目 未来 其他 入门书 一些不错的网站 历程 MrRaindrop的学习经历 缘起 项目,下一个项目 收集癖和知识管理 跟对神 读书 前端的定位 最后 结合个人经历总结的

前端大神

1. 大神 寻找Github.微博.知乎等技术社区上比较活跃.影响力大的圈内大神,供大家膜拜! 视野所限,未必全面,欢迎大家推荐.自荐. 排名不分先后,序号只为标记方便. 提供信息只为学习交流之用,如有冒犯,请见谅:如果涉及隐私或不愿公开内容,请联系我. 1.1 国际 Chris Coyier Codepen创始人,css-tricks站长. 联系方式: CodePen. Dribbble. Twitter. GitHub. Instagram Sara Soueidan 2015 net aw

ScrollView嵌套ListView的滑动冲突问题,是看大神的方法的,作为学习以后用的到

在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结构的原因.这个结构碰到的问题.几种解决方案和优缺点比较,这4个方面来为大家阐述.分析.总结. 实际上不光是ListView,其他继承自AbsListView的类也适用,包括ExpandableListView.GridView等等,为了方便说明,以下均用ListView来代表. 大神就是牛,给出了好