ES6学习笔记(一)
来源:互联网 发布:java时间怎么加减 编辑:程序博客网 时间:2024/06/13 10:03
1、let
在变量声明前使用会报错,而var在变量声明前使用,值为undefined。
ES6新增了let
命令,用来声明变量的,声明的方法与var
相似,但是let
命令声明的变量只在let
当前的代码块内有用,在别的地方调用let
声明的变量会报错,如:
function f(){ console.log(a);//ReferenceError: a is not defined { let a=3; }};
上列中,如果把let
改为var
,得到的结果就会是undefined;
2、只要块级作用域内存在let命令,它所声明的变量就会被绑定到这个区域,不再受外部影响
for (let i = 0; i < 3; i++) { let i = 'abc'; console.log(i);}// abc// abc// abc
循环条件中的let
是一个作用域,循环体内的let是一个作用域,互不影响。
3、暂时性死区
如果代码块内存在let和const命令,这个区块对这些变量从一开始就形成了封闭作用域,也就是“暂时性死区”,typeof也不再是一个百分百安全的操作了。
typeof x; // ReferenceErrorlet x;
如果变量a未被声明
typeof a; //"undefined"
4、let不允许在相同作用域内重复声明一个变量,会报错
function func() { let a = 10; let a = 1;}func();//报错
5、ES5只有全局作用域和函数作用域,而ES6的let有块级作用域
function f1() { let n = 5; if (true) { let n = 10; } console.log(n); // 5}
外层作用域无法读取内层作用域的变量。
6、ES6明确声明允许块级作用域之中声明函数,但在块级作用域中,函数声明的行为类似let,块级作用域外不可引用。
在ES5的环境下:
//浏览器的ES5环境function f() { console.log('I am outside!'); }(function () { if (false) { // 重复声明一次函数f function f() { console.log('I am inside!'); } } f();}());//'I am inside!'
在ES6的环境下:
// 浏览器的 ES6 环境function f() { console.log('I am outside!'); }(function () { if (false) { // 重复声明一次函数f function f() { console.log('I am inside!'); } } f();}());// Uncaught TypeError: f is not a function
7、do表达式
正常被let声明的变量在该块级作用域外是无法引用的,但如果在该块级作用域外加do,该作用域就会返回块级作用域内部最后执行的表达式的值。如:
let x = do { let t = f(); t * t + 1;};//x=t*t+1;
8、const命令声明的变量不能改变其值,否则报错
const用来声明一个只读的常量,因此在声明的同时需要给它赋值,否则报错!
const a;// SyntaxError: Missing initializer in const declaration
本质上,const的值不能修改是因为存储该变量的地址不能修改,如果是简单类型的数据,值保存在变量指向的内存地址上,如果是复合类型的数据,变量指向的内存地址保存的是一个指针,指针是固定的,但是指针指向的数据结构是否可变是不一定的,此处慎用。
const foo = {};// 为 foo 添加一个属性,可以成功foo.prop = 123;foo.prop // 123// 将 foo 指向另一个对象,就会报错foo = {}; // TypeError: "foo" is read-only
const a = [];a.push('Hello'); // 可执行a.length = 0; // 可执行a = ['Dave']; // 报错
如果想对象冻结,可以使用object.freeze
方法,对冻结了的对象添加属性将不起作用,但只是冻结对象的话在严格模式下会报错,想彻底冻结对象的话需要把对象的属性也冻结。如下:
var constantize = (obj) => { Object.freeze(obj); Object.keys(obj).forEach( (key, i) => { if ( typeof obj[key] === 'object' ) { constantize( obj[key] ); } });};
9、const的作用域与let一样,只在其声明的块级作用域内有效,只能在声明后使用,且不可重复声明
if (true) { const g = 5;}g; // Uncaught ReferenceError: MAX is not defined
10、global对象
引入global顶层对象,在所有环境下,global都是存在的,都可以从它拿到顶层对象。
为了确保在所有环境下,global都是存在的:
// CommonJS 的写法require('system.global/shim')();// ES6 模块的写法import shim from 'system.global/shim'; shim();
将顶层对象放入变量global中:
// CommonJS 的写法var global = require('system.global')();// ES6 模块的写法import getGlobal from 'system.global';const global = getGlobal();
阅读全文
0 0
- ES6学习笔记(一)
- ES6学习笔记(一)
- ES6学习笔记(一)
- ES6学习笔记(一)
- ES6学习笔记(一)let const
- es6 学习笔记(一)箭头函数
- 【Web】ES6学习笔记(一)
- ES6笔记(一)
- 《ES6深入浅出》学习笔记(一)
- ES6学习(一)
- ES6学习笔记(一)--let和const命令
- ES6入门笔记(一)
- es6学习系列---(一)
- webpack学习ES6(一)
- ES6语法学习(一)
- es6学习过程(一)
- ES6学习笔记(二)
- ES6学习笔记(三)
- php jpgraph库
- Redis原理实战安装配置及与LAMP整合
- Linux基本概念及操作(终端、shell、快捷键、通配符)
- 初学python:递归输出斐波那契数列
- c语言作业1028/1029
- ES6学习笔记(一)
- Makefile和Kconfig配置项目——Input子系统fingerprint
- 异常:There was no TypeHandler found for parameter id of statement
- 云计算的应用有哪些
- StackExchange.Redis官方文档(二)【配置】
- Java中二叉树面试题
- Android 开发中比较常见的5个内存泄漏问题及解决办法
- js中的原始值是什么?
- mysql中的本文存储(varchar char text blob)