ES6
箭头函数、this指向问题
function foo(a,b){
return a+b;
}
console.log(3,2);
//用箭头函数简写
let foo = (a,b) => a + b;
console.log(foo(13,2));
箭头函数就是用来承接一堆代码的
箭头函数更加轻量级,性能会更好
-
箭头函数特性
不支持arguments关键字
this指向生而固定
箭头函数在哪声明,this就指向哪里
let obj = { fn : () => { console.log(this,"外部函数指向window"); //Window "外部函数指向window" let foo = () => { console.log(this,"内部函数指向window"); //Window "内函数指向window" } foo(); }, //这里如果改成以下形式会对外部和内部函数的this指向造成影响 //第二种 // fn : function(){ // console.log(this) // //{fn: ƒ, fnn: ƒ}fn: ƒ ()fnn: ƒ ()__proto__: Object // let foo = () => { // console.log(this) // //{fn: ƒ, fnn: ƒ}fn: ƒ ()fnn: ƒ ()__proto__: Object // } // } //第三种 // fn : function(){ // console.log(this) // //{fn: ƒ, fnn: ƒ}fn: ƒ ()fnn: ƒ ()__proto__: Object // let foo = function(){ // console.log(this) // //Window // } // } fnn : function(){ console.log(this); }.bind(this) //bind()方法创建一个新的函数,在调用时设置this关键字为提供的值。 } obj.fn(); obj.fnn();
分析:
第一种情况下的this指向箭头函数声明处
fn : () =>{}
fn是全局变量,所以this指向window,而第二个this则跟第一个this指向相同。第二种情况下
fn : function(){}
此时没有了箭头函数,所以第一个this指向调用其所在函数的对象fn,第二个this则也指向fn。第三种情况下第一个this指向fn,第二个this指向window。
箭头函数的this指向是声明箭头函数时的this指向
this指向调用其所在函数的对象,而且是离谁近就是指向谁;构造函数下,this与被创建的新对象绑定;DOM事件,this指向触发事件的元素;内联事件分两种情况,bind绑定,call & apply 方法等
构造函数
function foo(){
console.log("helllo");
}
var value = foo(); //函数
var obj = new foo(); //构造函数
console.log(value,obj)
函数返回值 => return 关键字返回的内容
0
构造函数返回值 => 根据构造函数构造的对象
foo()
注意 箭头函数不能当作构造函数
some( )方法
var arr = [1,23,4,5,3,2,42];
var res = arr.some(item => >6);
console.log(res);
//true
some( )方法测试是否至少有一个元素通过有提供的函数实现的测试。
注意 对于放在空数组的任何条件,此方法返回false。
ES6中的字符串拼接
//es6中字符串拼接用${变量名}的方式引用变量
//``里的`要用\`转义
var value = "hello world";
var html = `<ul>
<li>${value}</li>
<li>\`</li>
<li>hello</li>
<li>hello</li>
<li>hello</li>
<li>hello</li>
<li>hello</li>
<li>hello</li>
<li>hello</li>
<li>hello</li>
</ul>`
//ES6中``内的所有东西都被解析为字符串,相对于ES5的字符串拼接来说更为方便
模板引擎
数据驱动思想
目标:只更改数据,可以得到不同的页面渲染。
维护的内容:1.html,js,css => json数据
<script type="text/html"> 的作用是存储字符串模板
//如何获取模板字符串
//1.放在script => text / html 之中的字符串
//2.定义语法规则(artTemplate / ejs)
//2.1 JS代码放在哪里?
//2.2 输出的变量放在哪里?
//3.区分正则
//3.1 输出语句正则 => /<%=(.+?)%>/g
//3.2 JS语句的正则 => /<%([\s\S]+?)%>/g
//[\s\S] => 可以匹配 \n \r 特殊字符的写法
//4.拼接
//设:x,y x => 输出语句; y => js语句;
//4.1 echo函数 => 字符串拼接函数;
var html= "";
function echo(arg){
html += arg;
}
<ul>
y
<li> x </li>
y
</ul>
//x => <li>`) \n echo( x ); \n echo(`</li>
// y => `); \n y \n echo ('
//5. eval => 用eval将处理好的代码进行执行、拼接字符串得到的结果
ES6中的新工具
数组、对象的扩展
Array.from()
方法从一个类似数组或可迭代对象中创建一个新的数组实例。
console.log(Array.from('foo'));
//Array ["f", "o", "o"]
console.log(Array.from([1, 2, 3], x => x + x));
//Array [2, 4, 6]
Object.assign :一个向前合并对象的方法:
Object.assign()
方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象,Object.assign
方法的第一个参数是目标对象,后面的参数都是源对象。
var obj1 = {a : 1,b : 2,c : 3}
var obj2 = {d : 1,e : 2,f : 3}
var obj3 = Object.assign(obj1,obj2);
//将obj2复制到obj1后面,obj1成为一个新的对象数组,obj2不变
console.log(obj3 , obj1)
Object.keys(obj)
ES2017 引入了跟Object.keys
配套的Object.values
和Object.entries
,作为遍历一个对象的补充手段,供for...of
循环使用。
let {keys, values, entries} = Object;
let obj = { a: 1, b: 2, c: 3 };
for (let key of keys(obj)) {
console.log(key);
// 'a', 'b', 'c'
}
for (let value of values(obj)) {
console.log(value);
// 1, 2, 3
}
for (let [key, value] of entries(obj)) {
console.log([key, value]);
// ['a', 1], ['b', 2], ['c', 3]
}
Array.prototype.flat()
用于将嵌套的数组“拉平”,变成一维的数组。该方法返回一个新数组,对原数据没有影响。
[1, 2, [3, 4]].flat()
// [1, 2, 3, 4]
//flat()默认只会“拉平”一层,如果想要“拉平”多层的嵌套数组,可以将flat()方法的参数写成一个整数,表示想要拉平的层数,默认为1。若参数为Infinity,则无论多少嵌套都会被拉伸为一维数组
[1, 2, [3, [4, 5]]].flat()
// [1, 2, 3, [4, 5]]
[1, 2, [3, [4, 5]]].flat(2)
// [1, 2, 3, 4, 5]
Symbol(name)
的作用是在key值相同的情况下使用assign方法不会导致前面的被覆盖掉
var obj1={
[Symbol("name")]:"111";
}
var obj2={
[Symbol("name")]:"222";
}
Object.assign(obj1,obj2);
console.log(obj1);
//{Symbol(name): "111", Symbol(name): "222"}
//如果不用Symbol方法,结果输出是 {Symbol(name): "222"}
//作为字典量存在切不会导致key值重复;
const size = {
XS : Symbol("XS"),
S : Symbol("S")
}
let close = {
[size.XS] : 1
}
console.log(close);
//{Symbol(XS): 1}
console.log(close[size.XS]);
//1
Set、Map的作用
//Set自动去重
var set = new Set([1,2,3,4,5,5,6,7,8]); // key值 和 value值一样;
console.log(set);
var set = new Set([1,2,3,4,5,5,6,7,8]);
// 增删改查;
set.add(123);
console.log(set);
//Set(9) {1, 2, 3, 4, 5, 6, 7, 8, 123}
//Set可以用for...of循环进行遍历,唯一的区别是keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历。
for(let value of set.entries()){
console.log(value);
//[1, 1][2, 2][3, 3][4, 4][5, 5][6, 6][7, 7][8, 8][123, 123]
}
set.delete(3);//删除key为3的元素
set.clear();//情空数组
var map = new Map();
map.set("key","value");
console.log(map.keys());
console.log(map.values());
//Map可以将key和value独立的取出