跳到主要内容

ES6 新增了哪些新特性 (二)

· 阅读需 3 分钟
一介布衣
全栈开发者 / 技术写作者
  • 文章目录
  • 对象字面量申明增强

  • 模版字符串

  • 函数默认参数

  • Let

  • Const

  • 支持换行

  • 关于 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;
`