ECMAScript与JavaScript的关系
ECMA是European Computer Manufacturers Association的缩写,即欧洲计算机制造商协会。欧洲计算机制造商协会是制定信息传输与通讯的国际化标准组织。
1996年11月,JavaScript的创造者Netscape公司,决定将JavaScript提交给ECMA,希望这种语言能够成为国际标准。次年,ECMA发布262号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言称为ECMAScript,这个版本就是1.0版。
该标准从一开始就是针对JavaScript语言制定的,但之所以不叫JavaScript,有两个原因。一是商标,Java是Sun公司的商标,根据授权协议,只有Netscape公司可以合法地使用JavaScript这个名字,且JavaScript本身也已经被Netscape公司注册为商标。二是想体现这门语言的制定者是ECMA,不是Netscape,这样有利于保证这门语言的开放性和中立性。
因此,ECMAScript和JavaScript的关系是,ECMA是JavaScript的标准,JavaScript是ECMA的一种实现。
历史版本
时间 | 版本 | 详情 |
---|---|---|
1996.11 | ES 1.0 | Netscape将JS提交给ECMA组织,ES正式出现 |
1998.06 | ES 2.0 | ES2正式发布 |
1999.12 | ES 3.0 | ES3被广泛支持 |
2007.10 | ES 4.0 | ES4过于激进被废弃 |
2008.07 | ES 3.1 | 4.0退化为严重缩水版的3.1,因为吵的太厉害,所以ES 3.1代号为Harmony(和谐) |
2009.12 | ES 5.0 | ES 5.0正式发布,同时公布了JavaScript.next也就是后来的ES 6.0 |
2011.06 | ES 5.1 | ES 5.1成为ISO国际标准 |
2013.03 | ES 6.0 | ES 6.0草案定稿 |
2013.12 | ES 6.0 | ES 6.0草案发布 |
2015.06 | ES 6.0 | ES 6.0预计发布正式版,JavaScript开始指向ES 7.0 |
ES6兼容性查看:http://kangax.github.io/compat-table/es6/
使用Babel解决ES6兼容性问题
提前编译
首先我们创建一个html文件,在里面输入ES6的新语法,用低版本浏览器运行这个文件。
<script>
let a = 1;
console.log(a);
script>
这次我们引入在线的babel.min.js,我们还要在script脚本中声明类型为”text/babel”,这样就可以在低版本浏览器中运行ES6的新语法了。
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.4.4/babel.min.js">script>
<script type="text/babel">
let a = 1;
console.log(a);
script>
1.可以重复声明,在团队协作时很容易造成冲突
var a = 1;
var a = 2;
2.无法限制修改,没有常量的概念
var a = 1;
a = 2;
3.不支持块级作用域,属于函数级作用域
if ( true ) {
var a = 1;
}
alert(a);
let a = 1;
let a = 2;
const a = 1;
const a = 2;
2. 支持块级作用域,在作用域内定义的变量或常量只能在作用域内使用
if ( true ) {
let c = 1;
}
console.log(c);
if ( true ) {
const PI = 3.14;
}
console.log(PI);
var arr = [1, 2, 3];
var a = arr[0];
var b = arr[1];
var c = arr[2];
console.log(a, b, c);
let [a, b, c] = [1, 2, 3];
console.log(a, b, c);
function fn(a){
return a * 2;
}
console.log(fn(5)); //10
let fn = (a) => {
return a * 2;
}
console.log(fn(5)); //10
let fn = a => a * 2;
console.log(fn(5)); //10
let fn = (a, b, ...args) => {
console.log(a); //1
console.log(b); //2
console.log(args); //[3, 4, 5]
}
fn(1, 2, 3, 4, 5);
let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
let arr = [...arr1, ...arr2];
console.log(arr); //[1, 2, 3, 4, 5, 6]
let fn = (a, b=2, c=3) => {
console.log(a, b, c); //1, 5, 3
}
fn(1, 5);
ES6新增了4个数组方法:map、reduce、filter、forEach
检查分数是否及格
let arr = [59, 60, 99, 31, 85];
let result = arr.map(item => item >= 60 ? "及格" : "不及格");
console.log(result); //["不及格", "及格", "及格", "不及格", "及格"]
let arr = [10, 20, 30, 40];
let result = arr.reduce((tmp, item, index) => tmp + item);
console.log(result); //100
let arr = [1, 2, 3, 4, 5];
let result = arr.reduce((tmp, item, index, arr) => {
if ( index != arr.length-1 ) { //不是最后一次先求和
return tmp + item;
} else { //最后一次求平均数
return (tmp + item)/arr.length;
}
});
console.log(result); //3
根据条件判断,去掉不想要的数据,返回想保留的数据
let arr = [5, 7, 10, 13, 15, 20, 25];
let result1 = arr.filter(item => {
if ( item%5 == 0 ) { //判断可不可以被5整除
return true; //保留可以被5整除的数
} else {
return false; //去掉不能被5整除的数
}
});
//可以简写成下面这种方式,直接通过布尔值判断,为true的保留,为false的去掉
let result2 = arr.filter(item => item%5 == 0); //保留可以被5整除的数
//这样得到的结果是一样的
console.log(result1); //[5, 10, 15, 20, 25]
console.log(result2); //[5, 10, 15, 20, 25]
遍历数组,第一个参数是数组的值,第二个参数是数组的下标
let arr = [2, 5, 6, 9, 7, 54];
arr.forEach((item, index) => {
console.log(index + ":" + item); //0:2, 1:5, 2:6, 3:9, 4:7, 5:54
});
ES6新增了2个字符串方法:startsWith、endsWith
let str = "https://www.baidu.com/";
console.log(str.startsWith("https://")); //true
let str = "1.txt";
console.log(str.endsWith(".txt")); //true
var title = "标题";
var content = "内容";
var str = "\
title:"+title+"
\
content:"+content+"
\
";
let title = "标题";
let content = "内容";
let str = `
title:${title}
content:${content}
`;
function My(name, age){ //构造函数伪装成类来使用
this.name = name;
this.age = age;
}
/*函数需要用prototype来追加,与主体分离,比较分散不便于维护*/
My.prototype.showName = function (){
alert(this.name);
}
My.prototype.showAge = function (){
alert(this.age);
}
var my = new My('Sain', 26);
my.showName(); //Sain
my.showAge(); //26
class My{ //使用class关键字定义一个类
constructor(name, age){
this.name = name;
this.age = age;
}
showName(){
alert(this.name);
}
showAge(){
alert(this.age);
}
}
var my = new My('Sain', 26);
my.showName(); //Sain
my.showAge(); //26
function addMyWeight(name, age, weight){ //如果想在刚才My这个类的基础上增加新的属性就要使用继承
My.call(this, name, age); //通过call来继承父级
this.weight = weight;
}
addMyWeight.prototype = new My();
addMyWeight.prototype.constructor = addMyWeight;
addMyWeight.prototype.showWeight = function (){
alert(this.weight);
}
var my = new addMyWeight('Sain', 26, '80kg');
my.showName(); //Sain
my.showAge(); //26
my.showWeight(); //80kg
class addMyWeight extends My{ //使用ES6的extend来继承My这个类
constructor(name, age, weight){
super(name, age); //等同于call继承父级
this.weight = weight //增加新属性
}
showWeight(){ //增加新方法
alert(this.weight);
}
}
var my = new addMyWeight('Sain', 26, '80kg');
my.showName(); //Sain
my.showAge(); //26
my.showWeight(); //80kg
JSON.stringify()
方法将json数据转化成字符串let json = {"a":10, "b": 5};
let str = JSON.stringify(json);
console.log(str); //{"a":10, "b": 5}
console.log(typeof str); //"string"
JSON.parse()
方法将字符串转换成json,字符串必须严格遵守json格式要求,key和value要用双引号包起来,value如果是数字的情况下可以不使用双引号。let str = '{"a": 10, "b": "hello"}';
let json = JSON.parse(str);
console.log(json); //Object {a: 10, b: "hello"}
console.log(typeof json); //object
let a = 1;
let b = 2;
let json = {a: a, b: b, c: 3};
let json = {a, b, c: 3}; //简写
let json = {
a: "hello",
say: function(){ //可以省略:和function,简写成say()
alert(this.a);
}
}
json.say(); //hello