ES6 新增了哪些新特性 (二)
文章目录
关于 ES6规范及新特性
对象字面量申明增强
ES6 之前,申明对象字面量方式其实就是直接定义一个json对象.存在的仅仅是对象的属性和值.
ES6 之后,对象字面量被扩展支持直接设置原型,
简洁属性赋值和方法,
超类调用,
这也让对象字面量和类声明的关系更密切,并让基于对象的设计更便利
ES6之前:
var obj = {
__proto__: theProtoObj,
// 下面的写法不会设置内部原型
'__proto__': theProtoObj,
// 方法
toString() {
// 调用父对象的方法
return "d " + super.toString();
},
// 属性名是一个表达式
[ "prop_" + (() => 42)() ]: 42
};
proto: theProtoObj
proto属性需要原生支持,这一属性在ECMAScript前一个版本中一度被废弃,目前 ES6 再度使用起来.
'proto': theProtoObj
上面这种设置内部原型的方法不会被支持, proto 并不是一个字符串,所以这种字符串设置方式不会被支持.
对象字面量支持方法调用:
toString(){
//调用父级对象的方法
return "d " + super.toString();
}
//属性名支持表达式
[ "prop_" + (() => 42)() ]
模版字符串
允许对字符串构建的定制化,避免注入攻击或其他需求
// 普通字符串
`This is a string.`
// 多行字符串
`This is
a string.`
// 字符串中嵌入变量
var name = "world", time = "today";
`Hello ${name}, how are you ${time}?`
// 模版标签
String.raw`In ES5 "\n" is a line-feed.`
// 下面构造一个HTTP请求头,来解释差值替换和构造
GET`http://foo.org/bar?a=${a}&b=${b}
Content-Type: application/json
X-Credentials: ${credentials}
{ "foo": ${foo},
"bar": ${bar}}`(myOnReadyStateChangeHandler);
函数默认参数
ES6 终于支持参数默认值了
function f(x, y=12) {
// 如果不传递y或传递undefined,y的值为12
return x + y;
}
f(3) == 15
Let
它的功能是定义变量,当时和 var 有很大区别.
let 定义的变量只有在它所在的代码块内有效.
它解决了一个问题,javascript 存在很大的缺陷就是没有作用域,所以定义的变量互相覆盖.
Let 的出现成功解决了这个问题.
function test() {
{
let m{
m=100;
}
// let变量可以再次赋值
m=200;
// 在块作用域中重复声明将会报错,如下
let x = 300;
}
}
Const
const也用来声明变量的关键字,但是它声明的是常量.
在 let 代码块中不能使用 Const 申明常量
如下代码是不允许的:
function test() {
{
let x;
{
// 块作用域
const x = "test"; //不允许这样代码块中的常量定义
}
}
}
支持换行
如果没有模板字符串,对于一个长字符串,你大概要写成这样的:
var sql =
"SELECT * FROM Users " +
"WHERE FirstName='Mike' " +
"LIMIT 5;"
当然也可以这样通过数组的形式实现:
var sql = [
"SELECT * FROM Users",
"WHERE FirstName='Mike'",
"LIMIT 5;"
].join(' ')
现在 ES6 支持这样的方式实现换行:
let sql = `
SELECT * FROM Users
WHERE FirstName='Mike'
LIMIT 5;
`