学习要点:
1.ES6 简介
2.ECMAScript 历史
3.学习和创建 Demo
本节课我们来开始了解 ECMAScript6(简称 ES6),着重了解它的标准和历史。
这里,我们给出一张表格,了解一下 ES6 及之前的一些版本情况:
版本 | 说明 |
---|---|
ES1.0 | 1997 年发布 |
ES2.0 | 1998 年 6 月份发布 |
ES3.0 | 1999 年 12 月份发布 |
ES4.0 | 2000 年没发布的了(废弃了) |
ES4.0 | 2007 年 10 月草案发布(预计次年 8 月发布正式版) |
ES3.1 | 2008 年 7 月发布(吵架把 ES4.0 吵成 3.1 了) |
ES5.0 | 2009 年 12 月发布(3.1 改成了 5.0) |
ES5.1 | 2011 年 6 月份发布 |
ES6 | 2013 年 3 月草案冻结 |
ES6 | 2013 年 12 月草案发布 |
学习要点:
1.let 声明
2.const 声明
本节课我们来开始学习 ES6 中的 let 和 const 两种声明方式。
//块级区域
{
var value = 10;
let count = 20;
}
console.log(value); //10
console.log(count); //引用错误
console.log(value);//undefined
var value; //变量提升导致逻辑怪异
上面例子对比中,var 在后面声明,前面输出的值从逻辑上较为怪异;
按道理来说,var value; 应该在console.log前面然后正常输出undefined才对。
再来看看count
console.log(count);
let count;
我们发现这个就对了,符合正常的思维逻辑。
那我们放到前面再看呢?
let count;
console.log(count); //undefined
if (true) {
//死区开始
value = 20;
console.log(value);
//死区结束
let value = 10;
console.log(value);
}
console.log(typeof value);
let value;
var value = 10;
var value = 20;
console.log(value);
let value = 10;
let value = 20;
console.log(value);var value = 10;
let value = 20;
console.log(value);let value = 10;
var value = 20;
console.log(value);
let value = 20;
{let value = 10; //不建议相同,会乱的
}
console.log(value);//20
for (var i = 0; i < 10; i++) {console.log(i);
}
console.log(i); //var 声明,则 10;let 声明,报错
for (let i = 0; i < 10; i++) {console.log(i);
}
console.log(i); //var 声明,则 10;let 声明,报错
var list = [];
for (var i = 0; i < 10; i++) { //把这里改成 let,则会得到想要的值
list[i] = function () {
console.log(i);
}
}
list[5](); //这里不管设置多少,结果都是 10
var list = [];
for (let i = 0; i < 10; i++) { //把这里改成 let,则会得到想要的值list[i] = function () {console.log(i);}
}list[5](); //5
学习要点:
1.全局作用域
2.块级作用域
本节课我们来开始学习全局作用域和块级作用域的问题。
console.log(window.name);//因为name是window的一个属性,打印结果是一个空字符串
console.log(window.abcd);//它不是window的自带属性,所以打印结果是undefined
console.log(window.name);
console.log(window.abcd);console.log(name);//如果直接使用则还是空字符串
console.log(abcd);//这里直接使用,它既不是windown对象的属性,也没有声明,则报错
console.log(window.name === name);//得到结果他们是等价的
再看一个例子,我们此时声名一个非window对象的变量。再看看
var abcd = 10;
console.log(abcd);
console.log(window.abcd);
因此更加印证了标题的结论,简单来说,var声明的全局变量 它就是 window 的属性。
var name = 'es6';
console.log(name);
console.log(window.name);//被覆盖,所以这里造成了污染
{{{{
{let value = 10;}
console.log(value); //报错
}}}}
(function () {var value = 10;
}());
console.log(value); //报错//下面这个就把上面给代替了,方便了很多
{let value = 10;
}
{
function fn() {
console.log('块级函数');
}
}
fn(); //正常访问
此时我想做一个只能在块级内部才能访问到的函数,怎么做?
{let fn = function (){console.log('块级函数')}
}fn();
此时就找不到了,变成了一个私有函数,它只能在块级作用域内部使用
let 结合 函数表达式
{let fn = function (){console.log('块级函数')}fn();
}
学习要点:
1.数组解构
2.对象解构
本节课我们来开始学习 ES6 中数组和对象解构赋值的方法。
let info = ['Mr.Lee', 100, '男']; //数组赋值
let [name, age, gender] = info; //数组解构赋值
console.log(name);
console.log(age);
console.log(gender);
let info = ['Mr.Lee', 100, '男'],[name, age, gender] = info; //数组解构赋值
console.log(name);
console.log(age);
console.log(gender);
这里连变量都省掉了。
let [name, age, gender] = ['Mr.Lee', 100, '男'];
console.log(name);
console.log(age);
console.log(gender);
let [name, age, gender] = ['Mr.Lee', [100, '男']];
console.log(name);
console.log(age);
console.log(gender);
数组层次也需要匹配,才能获取到正确的值
// let [name, age, gender] = ['Mr.Lee', [100, '男']];
let [name, [age, gender]] = ['Mr.Lee', [100, '男']];
console.log(name);
console.log(age);
console.log(gender);
let [, , gender] = ['Mr.Lee', 100, '男'];console.log(gender);
let [name, age, gender = '男'] = ['Mr.Lee', 100];
console.log(name);
console.log(age);
console.log(gender);
let [name, ...other] = ['Mr.Lee', 100, '男'];
console.log(name);
console.log(other);
//定义对象字面量
let obj = {name : 'Mr.Lee',age : 100,
};
//解构对象字变量
let {name, age} = obj; //或({name, age} = obj);
console.log(name,age);
let obj = {
name : 'Mr.Lee',
age : 100,
}, name = 'Mr.Wang'; //被替代
({name, age} = obj);
console.log(name);
let obj = {name : 'Mr.Lee',age : 100,
};
//解构对象字变量
let {name, age,gender='男'} = obj; //或({name, age} = obj);
console.log(name,age,gender);
let obj = {name: 'Mr.Lee',age: 100,
};//解构对象字变量
let {name:Myname, age:Myage, gender = '男'} = obj;// console.log(name); //失效
// console.log(age);//失效
console.log(Myname);
console.log(Myage);
let obj = {name : 'Mr.Lee',age : 100,info : {id : 1,gender : '男'}
};
let {info : {id, gender}} = obj;
console.log(info )//此时info失效
console.log(id)
console.log(gender)
let {name, age} = {name : 'Mr.Lee', age : 100};
console.log(name)
console.log(age)
学习要点:
1.其它解构
本节课我们来开始学习 ES6 中更多类型的解构和常用方法;
let key = 1;
let value = '2';console.log(key);
console.log(value);//解构操作,变量互换
[key, value] = [value, key];console.log(key);
console.log(value);
function fn() {return ['Mr.Lee', 100, '男'];
}
let [name, age, gender] = fn();console.log(name,age,gender);function fn2() {return {name : 'Mr.Lee',age : 100,gender : '男'}
}
let {name:name2, age:age2, gender:gender2} = fn2();
console.log(name2,age2,gender2);
function fn([name, age, gender]) {console.log(name);console.log(age);console.log(gender);
}
fn(['Mr.Lee', 100, '男']);function fn2({name, age , gender}) {console.log(name);console.log(age);console.log(gender);
}fn2({name : 'Mr.Lee',age : 100,gender : '男'
});
let [x, y, z] = 'ABC';
console.log(x); //A//还可以直接解构出字符串的属性
let {length:len} = 'ABC';
console.log(len); //2
后面会说明
学习要点:
1.参数默认值
2.name 属性
本节课我们来开始学习 ES6 中函数传参默认值等问题;
function fn(name,age = 100,arr = [],obj = {},callback = function () {}) {//参数 1 是必须传递;//其余参数有默认值,可选传递;console.log(arr);console.log(obj);console.log(callback('hello'));
}fn('Mr.Lee', 200, [1,2,3], {key : 1}, function (info) {return info+'-es6';
});
function pi() {return 3.14;
}
function fn(r, p = pi()) { //pi()返回值交给 pconsole.log(r * r * p);
}
fn(10);
function fn(name = 'Mr.Lee', age) { //null,空都不行console.log(name);console.log(age);
}
fn(undefined, 100);
function fn(x, y = x) { //(y = x, x)错误console.log(y);
}fn(2);
function fn(name, ...other) { //不定参数之后不可再有参数console.log(other);
}
fn('Mr.lee', 100, '男');
function fn() {}
let fn2 = function () {};
let obj = {
fn3 : function () {}
};
console.log(fn.name);
console.log(fn2.name);
console.log(obj.fn3.name);
console.log((new Function()).name); //匿名函数 anonymous
学习要点:
1.箭头函数
2.绑定 this
本节课我们来开始学习 ES6 新增的箭头函数,然后理解一下箭头 this;
let fn = name => name;
console.log(fn('Mr.Lee'));
//翻译成函数代码为:
// let fn = function (name) {
// return name;
// };
let fn = (x, y) => x + y;
console.log(fn(10, 20));
//翻译成函数代码为:
// let fn = function (x, y) {
// return x + y;
// }
let fn = () => 'Mr.Lee';
console.log(fn());
//翻译成函数代码为:
// let fn = function () {
// return 'Mr.Lee';
// };
let fn = (x, y) => {return x + y;
};
console.log(fn(10, 20));
let fn = name => ({name : name, age : 100});
console.log(fn('Mr.Lee').name);
//翻译成函数代码为:
// let fn = function (name) {
// return {
// name : name,
// age : 100
// }
// };
let fn = ({name, age}) => name + ', ' + age;
console.log(fn({name : 'Mr.Lee', age : 100}));
((name) => {console.log(name);
})('Mr.Lee');
//翻译成函数代码为:
// (function (name) {
// console.log(name);
// })('Mr.Lee');
let obj = {name : 'Mr.Lee',age : 100,fn : function () {console.log(this)setTimeout(function () {console.log(this);console.log(this.name + ', ' + this.age);}, 500)}
};
obj.fn();
let obj = {name : 'Mr.Lee',age : 100,fn : function () {// console.log(this)let that = this;setTimeout(function () {// console.log(this);// console.log(this.name + ', ' + this.age);console.log(that.name);}, 500)}
};
obj.fn();
node环境下
浏览器环境
let obj = {name : 'Mr.Lee',age : 100,fn : function () {let that = this;setTimeout(() => {console.log(this.name + ', ' + this.age);}, 500)}
};
obj.fn();
学习要点:
1.箭头扩展
2.尾调用优化
本节课我们来开始学习箭头一些别的用法,以及尾调用优化的方法。
// let arr = [3, 1, 2].sort(function (a, b) {
// return a - b;
// });
// console.log(arr);//es6
let arr = [3, 1, 2].sort((a, b) => a - b);
console.log(arr);
let fn = (x, y) => {return arguments[0] + arguments[1]
}console.log(fn(10, 20));let fn2 = (...other) => {return other[0] + other[1]
};
console.log(fn2(10, 20));
let fn = (...other) => {return arguments[0] + arguments[1]
}
console.log(typeof fn);//function
console.log(fn instanceof Function);//true
function go(x) {
return x + 20;
}let fn = function (x) {//xxx 假设此处有很多代码
return go(x);//在函数内部最后一步调用了go函数
};
console.log(fn(10));
function fn(x) {
if (x <= 1) {
return 1;
}
return fn(x - 1);
}
console.log(fn(10));
只需要开启严格模式就可以尾调用优化了
'use strict';
function fn(x) {
if (x <= 1) {
return 1;
}
return fn(x - 1);
}
console.log(fn(10));
这里有个例子,什么叫做严格模式? 它就是规范你的代码的
开启严格模式,智能编辑器它就会报错
'use strict';
let public = 5;
console.log(public);
(1) .尾调用必须 return 返回; // go(x); 错误
(2) .尾调用 return 返回不得含其它操作 // return go(x) + 1; 错误
(3) .尾调用 return 返回的不是函数,而是函数赋值的变量,不在尾部;
学习要点:
1.新增方法
2.模板字符串
本节课我们来开始学习 ES6 新增的字符串方法以及模板字符串功能
// let text = '𠮷';
// console.log(text.length); //1
// console.log(text.charAt(0)); //吉 ,取text这个字符串的第一个字符
// console.log(text.charCodeAt(0));//21513 取十进制编码
// console.log(text.charCodeAt(1));//因为吉是单字符,所以第二个就字符就没有,所有是NaNlet text2 = '𠮷';
console.log(text2.length); //1
console.log(text2.charAt(0)); // 取个字符串的第一个字符,这就导致取不出来,因为这个字本身是一个字,但是它长度是2,charAt(0)就表示取第一个字符,一个字体的一半所以无法显示
//es6提供的codePointAt可以解决这个问题
console.log(text2.codePointAt(0));
//但是codePointAt得到的只是十进制码点,我们可以通过fromCodePoint方法得到单个字
console.log(String.fromCodePoint(134071));//𠮷
console.log(text2.charCodeAt(0));//55362 取十进制编码
console.log(text2.charCodeAt(1));//57271 因为𠮷是异体字长度是2,所以第二个就字符就能取到//此时我们有一个异体字
// console.log(String.fromCodePoint(134071));
console.log(String.fromCodePoint(134071));//𠮷
console.log('\u01D1');//Ǒ
console.log('\u004F');//O
console.log('\u030C');// ̌console.log('\u004F\u030C');//Ǒconsole.log('\u004F\u030C' === '\u01D1'); //正常来讲应该要相等的。但是不相等
console.log('\u004F\u030C'.normalize() === '\u01D1'.normalize());//es6提供的normalize可以解决这个问题
let text = 'Hello, Mr.Lee!';
console.log(text.includes('Mr.')); //true,是否找到'Mr.'
console.log(text.startsWith('ello')); //false,必须从开头找
console.log(text.endsWith('ee!')); //true,必须从结尾找
console.log(text.includes('Mr.', 8)); //false,超过位置,第二参数寻找的位置
在这里插入代码片
console.log('x'.repeat(5));
console.log('xyz'.repeat(3));
console.log('Mr.Lee'.repeat(0)); //空
console.log('x'.padStart(5, 'Mr')); //MrMrx
console.log('x'.padEnd(5, 'Mr')); //xMrMr
let name = 'Mr.Lee',
age = 100,
text = '我是' + name + ',今年' + age + '岁';
console.log(text);
let name = 'zhangsan',age = 18;text = `我是${name},今年${age}岁`; // \`转义//支持多行操作text2 = `我是${name},今年${age}岁`;console.log(text);console.log(text2);
let text = `1+1=${1+1}`;
console.log(text);
${${}}
这种模版嵌套的方式,也是支持的let flag = true,text = `结果:${flag ? `true${1+1}` : 'false'}`;console.log(text);
let text = `我\n是`;console.log(text);
console.log(String.raw `我\n是`)
学习要点:
1.正则扩展
本节课我们来开始学习 ES6 新增的正则表达式的扩展和改进部分。
//𠮷let result = /吉{2}/.test('吉吉');
let result2 = /𠮷{2}/.test('𠮷𠮷');
//es6为了解决这个问题,增加了一个u修饰符
let result3 = /𠮷{2}/u.test('𠮷𠮷');
console.log(result);
console.log(result2);
console.log(result3);
let text = 'xxx_xx_x_',patt = /x+_/;patt2 = /x+_/y;console.log(patt.exec(text)); //xxx_
console.log(patt.exec(text)); //xxx_
console.log(patt.exec(text)); //xxx_console.log(patt2.exec(text)); //xxx_
console.log(patt2.exec(text)); //xx_
console.log(patt2.exec(text)); //x_
let text = 'xxx_xx_x_',patt = /x+_/;patt2 = /x+_/y;console.log(patt.sticky); //false
console.log(patt2.sticky); //true
let text = 'xxx_xx_x_',patt = /x+_/;
patt2 = /x+_/y;console.log(patt.flags); //''
console.log(patt2.flags); //y
.
表示匹配所有,除了终止符,比如回车\n 换行\n 等等,使用 s 修饰符匹配let text = 'x\nyz',patt = /x.+yz/;patt2 = /x.+yz/s;
console.log(patt.test(text));//false
console.log(patt2.test(text));//true
//ES6 支持修饰符替换,之前会报错
let regex = new RegExp(/xyz/iu, 'g');
console.log(regex.flags); //g
学习要点:
1.数值扩展
2.Math 扩展
本节课我们来开始学习 ES6 新增的数值的扩展和改进功能。
console.log(Number('0b11'));
console.log(Number('0o11'));
console.log(Number('0x11'));
//非数值为 false,数值为 true
console.log(Number.isFinite(100));
console.log(Number.isFinite("100"));
//NaN 为 true,其余为 false
console.log(Number.isNaN(NaN));
console.log(Number.isNaN(100));
console.log(Number.parseInt('55.55a'));
console.log(Number.parseFloat('55.555b'));
console.log(Number.isInteger(10));
Javascript对于一些特别小的数值操作,它有精度问题
console.log(Number.EPSILON);
console.log(Number.EPSILON.toFixed(30)); //直观的看console.log(0.1 + 0.2 === 0.3);//falseconsole.log(0.1 + 0.2 - 0.3 < Number.EPSILON);//true
console.log(2 ** 4); //16,4 个 2 相乘
let num = 2;
num **= 5;
console.log(num); //32,5 个 2 相乘
console.log(Math.trunc(5.55)); //去掉小数部分
console.log(Math.sign(-5)); //判断是否为正、负、0 还是 NaN
console.log(Math.cbrt(2)); //求出一个值的立方根
console.log(Math.clz32(1)); //求一个数的 32 位二进制
console.log(Math.imul(2,-4)); //两个数整数形式相乘的结果带符号
console.log(Math.fround(1.555)); //求一个数单精度浮点形式
console.log(Math.hypot(3, 4)); //求出所有参数平方和的平方根
console.log(Math.expm1(-1)); //返回 Math.exp(x)-1
console.log(Math.log1p(1)); //求 ln(1+x),Math.log(1+x)
console.log(Math.log10(1)); //求 10 为底的 x 的对数
console.log(Math.log2(3)); //求 2 为底的 x 的对数
学习要点:
1.运算符扩展
2.方法的扩展
本节课我们来开始学习 ES6 新增的数组的扩展和改进功能。
function add(x, y) {return x + y;
}
console.log(add(...[10, 20]));
console.log(Math.max(...[1,2,3])); //求最大值
console.log([...[1,2], ...[3,4]]); //合并数组
//ES5 声明数组,当小于两位,显示长度
let items = Array(1,2,3);
let items2 = Array(3);
console.log(items)
console.log(items2)//这里竟然是空的,它只是声明了3个长度的一个数组。//ES6 声明数组,简化版
let items3 = Array.of(3, 2, 1);
let items4 = Array.of(3);
console.log(items3);
console.log(items4);
let obj = {0 : 'name',1 : 'age',2 : 'gender',length : 3,
};
let items = Array.from(obj);
console.log(items);let obj2 = {1 : 'name',2 : 'age',3 : 'gender',length : 3,
};
let items2 = Array.from(obj2);
console.log(items2);let obj3 = {'a' : 'name','b' : 'age','c' : 'gender',length : 3,
};
let items3 = Array.from(obj3);
console.log(items3);
可以看出对象转换成数组要求比较严格:
(1).key 必须是数值或字符串数字;
(2).length 设置长度,而且 key 在范围内;
既然要求这么严格,那什么样的场景会产生这种对象?
(1).DOM 的 NodeList 集合;
(2).ES6 新增的 Set 和 Map(后续内容);
//返回的是类似数组的对象
let nl = document.querySelectorAll('p');
这个时候就需要转换一下了
let items = [10, 20, 30, 40, 50];
//参数是一个回调函数,可以用箭头函数,findIndex 可以得到索引
console.log(items.find(value => value > 19));//20
console.log(items.findIndex(value => value > 19));//1
let items = [1, 2, 3, 4, 5];
items.fill('a');
console.log(items); //['a', 'a', 'a', 'a', 'a']
let items2 = [1, 2, 3, 4, 5];
items2.fill('a', 3, 4); //索引 3 开始,索引 4 结束
console.log(items2); //[1, 2, 3, 'a', 1]
let items = [1, 2, 3, 4, 5];
//从索引 0 开始复制值
//然后把值从索引 2 开始粘贴
//参数 3 设置结束粘贴索引值
items.copyWithin(2, 0);//3换成1
console.log(items);
学习要点:
1.简写方案
2.表达式方案
本节课我们来开始学习 ES6 新增的对象的扩展和改进功能
function fn1(name, age) {
//ES5 的写法return {name : name,age : age}
}console.log(fn1('Mr.Lee', 'age'));function fn2(name, age) {
//ES6 的写法return {name,age}
}console.log(fn2('Mr.Lee', 'age'));
let obj1 = {
//ES5 的写法fn : function () {return 'ES5 fn';}
};console.log(obj1.fn());let obj2 = {
//ES6 的写法fn() {return 'ES6 fn';}
};
console.log(obj2.fn());
//拼装组合属性
let obj = {['user' + 'Name'] : 'Mr.Lee',
};
console.log(obj.userName);
console.log(obj['userName']);//有空格的情况下
let obj2 = {['user' + ' Age'] : 100,
};
console.log(obj2['user Age']);//字符串属性
let obj3 = {'user Gender' : '男',
};
console.log(obj3['user Gender']);
//半动态
//通过变量 myName 动态更改 obj 属性名
//问题是当变量值更改了,属性名就失效了
// let myName = 'name';//Mr.Lee
let myName = 'name1';
let obj = {name : 'Mr.Lee'
};
console.log(obj[myName]);
真动态
//使用[myName]可计算属性名
//实现了真正的动态计算
let myName = 'name';
let obj = {
[myName] : 'Mr.Lee'
};
console.log(obj[myName]);
let obj = {['f' + 'n']() {return 'fn';}
};
console.log(obj.fn());
学习要点:
1.新增方法
本节课我们来开始学习 ES6 新增的对象的扩展和改进功能。
//这两个理解起来没什么问题
console.log(Object.is(100 ,'100')); //false
console.log(Object.is({}, {})); //false,指向不同console.log(+0===-0);//true
console.log(Object.is(+0, -0)); //es6 falseconsole.log(NaN === NaN); //false
console.log(Object.is(NaN, NaN)); //es6 true
let obj1 = {name: 'Mr.Lu',age: 100
}
let obj2 = {name: 'Mr.Wu',age: 100
}
let obj3 = {gender: '男'
}console.log(Object.assign(obj1,obj2,obj3))
(1).如果属性有相同,后面的源对象内容会覆盖之前的属性值;
(2).如果直接传非对象内容,会转换为对象;
(3).如果传入的是 undefined 和 null 会报错;
let obj = {fn() {return 'fn';}
};
let obj2 = {fn() {return 'fn2';}
};//以 obj 对象为原型
// let f = Object.create(obj);//fn
let f = Object.create(obj2);//fn2console.log(f.fn());
/检测是 obj 是否 f 的原型对象
let obj = {fn() {return 'fn';}
};
let obj2 = {fn() {return 'fn2';}
};//以 obj 对象为原型
// let f = Object.create(obj);//fn
let f = Object.create(obj2);//fn2console.log(f.fn());console.log(Object.getPrototypeOf(f) === obj2);//true
console.log(Object.getPrototypeOf(f) === obj);//false
let obj = {fn() {return 'fn';}
};
let obj2 = {fn() {return 'fn2';}
};//以 obj 对象为原型
// let f = Object.create(obj);//fn
let f = Object.create(obj2);//fn2console.log(f.fn());console.log(Object.getPrototypeOf(f) === obj2);//true
console.log(Object.getPrototypeOf(f) === obj);//false//设置原型对象
Object.setPrototypeOf(f,obj);
console.log(f.fn());//fn
let obj = {
fn() {
return 'fn';
}
};
let f = {
fn() {
return super.fn() + ', extend!';
}
};
//设置 obj 是 f 的原型
Object.setPrototypeOf(f, obj);
console.log(f.fn());
//可以再设置以 f 为原型
let h = Object.create(f);
console.log(h.fn());
学习要点:
1.Symbol 类型
2.Symbol 属性
本节课我们来开始学习 ES6 新增的 Symbol 类型和作为属性的方法
//注意,不支持 new Symbol()
let s = Symbol();
console.log(s); //输出 Symbol()
console.log(typeof s); //输出 symbol 类型
let s1 = Symbol(),s2 = Symbol();
console.log(s1 === s2);
let s1 = Symbol('s1'),s2 = Symbol('s2');console.log(s1);
console.log(s2);
console.log(s1 === s2);
let s1 = Symbol('s1');
console.log(s1+'a')
支持显示转换
console.log(s1.toString() + '变量');
console.log(String(s1) + '变量');
console.log(!s1); //布尔值
//重名的属性名不报错,被覆盖
let obj = {name : 'Mr.Lee',//被下面的覆盖了name : 'Mr.Wang'
};
console.log(obj);
连拼装的动态属性名,也会有这个问题
//拼装的属性名,也被覆盖
let x = 'Name',y = 'Name';
let obj = {['user' + x] : 'Mr.Lee',['user' + y] : 'Mr.Wang'
};
console.log(obj);
let x = Symbol('name');
let y = Symbol('name');
let obj = {
[x] : 'Mr.Lee',
[y] : 'Mr.Wang'
};
//结果:{ [Symbol(name)]: 'Mr.Lee', [Symbol(name)]: 'Mr.Wang' }
console.log(obj)
调用
let fn = Symbol('fn');
let obj = {[fn]() {return 'fn';}
};
console.log(obj);
console.log(obj[fn]());