ECMA 简介
1995年,javascript横空出世,解决表单验证问题;
1996年,javascript 发布1.0,1.1版本;
1997年,因为浏览器不同,当时网景公司(javascript),微软(JScript),nombas(scriptease)形成了一个三足鼎立的一个局势,给编程人员带来了极大的不便利(不同浏览器需要不同的代码);于是,程序员们纷纷向ECAM(欧洲计算机制造商协会)提出申请,指定一个标准;于是ECMA在javascript1.1的基础上,发布了ECMAscript; (为啥不叫javascript因为版权问题,而且是ECMA提出来的嘛,给挂个名总是合理的);
1999年,HTML4.0发布,提出异步数据传输方案 web2.0
2008年,chrome V8引擎横空出世
提出了ES4.0 分离除了 ES5.0(09年) 和ES6.0(15年)
ES6—— LET
补充作用域知识: 全局作用域; 函数作用域;块级作用域;
var的缺陷: 变量声明提升,存在作用域泄露问题,可以重复定义相同变量;
if(false){
var a = 10; // 未执行改语句,但是由于变量声明提升;函数作用域中 a = undefined
}else{
console.log(a); // a = undefined
}
// undefined
for(var i = 0; i < 100; i++){
}
console.log(i); // 100 i只想在循环中使用,作用域泄露;
var a = 100;
// ...
var a = 1000; // 代码过多时,可能定义了相同的变量名而不自知,造成不必要的错误
let {块级作用域} 特点: 在块级作用域中定义的变量只会在当前作用域中有用;
{
let a = 100;
var b = 100;
{
console.log(a); // a = 100;
let c = 100;
}
//console.log(c); // 报错;c未被定义;
}
console.log(b); // b = 100;
console.log(a); // 报错,a未被定义; 只在当前作用域有效;
let的变量会存入TDZ(temporal dead zone 暂时性死区中),对变量进行声明后从TDZ中取出;若使用的变量存在TDZ中会报错;
let x = x; // x 被存入TDZ中,将 x 赋值给 x ;x使用是还在TDZ中,报错;
let不可重复定义变量;
let a = 'a';
let a = 'b'; // 不可重复声明,不存在变量声明提升;
let 让每个块找到自己专属的那个变量;
{
let a = 'a';
{
let a = 'b';
console.log(a); // b
}
console.log(a); // a
}
let i = 100;
for(let i = 0; i < 5; i++){
let i;
console.log(i); //undefined * 5
// 三个 i 都不在同一个块级作用域
}
console.log(i); // 100
// 解构拆分
{
let i = 100;
{
let i = 0;
while(i++ < 5){
let i;
console.log(i); // undefined * 5
}
}
console.log(i); // 100
}
ES6——CONST 定义常量;
常量为原始值时不可被改变;常量为引用值时可以被改变(地址不变);
不可以被重复定义;
不可以定义但是不赋值(毕竟是常量啊,不赋值对得起这个名字吗!!!)
const PI = 3.14;
{
const PI = Math.PI;
console.log(PI); //3.141592653589793
}
console.log(PI); // 3.14
const people = {
}
people.name = 'angela';
const people; // 不可重复定义 Uncaught SyntaxError: Identifier 'people' has already been declared;
const people; // 报错:定义不赋值 Uncaught SyntaxError: Missing initializer in const declaration
例题:返回一个随机的n位数;
function random(n) {
let max = 1;
for(let i = 0; i < n; i++){
max *= 10;
}
// 首位补一操作
// return function () {
// let rnum = Math.random();
// rnum = rnum * 10 >= 1 ? rnum : (rnum * 10 + 1) / 10;
// return parseInt(rnum * max);
// }
// 末尾补0操作
return function () {
let str = '';
str += parseInt(max * Math.random());
let len = n - str.length;
for(let i = 0; i <len; i++){
str += '0';
}
return str;
}
}
var random8 = random(8);