写在前面:这一篇主要讲ES6新增的一部分内容,也包含移动this指向、对象的简写语法的一些问题;有问题欢迎各位提出。
this指向
每一个函数内部都有一个关键字 this ,this的值只和函数调用有关,和函数的书写无关。
1,一个普通的全局函数,在正常调用下,this指向为 window;
function fn() {
console.log(this) ;
}
fn( ); //this指向window
2,将函数放置到对象中,通过对象语法去获取调用,那么this 指向该对象;
var obj = {
a: 1,
b: '我是对象obj的属性B',
c: fn
}
obj.c() ; //this指向调用的对象 obj
3,将函数作为事件处理函数,触发时内部的this指向 事件源;
var box = document.getElementById('box')
box.onclick = fn ;//this指向事件源 div
4,将函数作为定时器执行时的函数,触发时内部this指向全局对象window;
setTimeout(fn, 0) // this 指向 window
setInterval(fn, 1000) // this 指向 window
改变this指向方法
准备一个对象,一个函数;
var obj = {
a: 1,
b: 2,
c: '我是对象obj的属性c'
}
function fn(x, y) {
console.log(this, x, y);
}
fn(100, 200);
1,call( ); 函数.call(this指向谁,参数1,参数2,参数3……);第二个位置的参数会传递到函数中;
fn.call(obj, 300, 400);
2,apply( ); 函数.apply(this指向谁,[参数1,参数2,参数3]); 第二个位置的数组内数据会传递到函数内部;
fn.apply(obj, [500, 600]);
3,bind( ); 函数.bind(this指向谁,参数1,参数2,参数3……); 第二个位置的参数开始会传递到函数中;bind方法不会立即执行函数,他返回一个内部this修改完毕的新函数。
var newFn = fn.bind(obj, 700, 800)
newFn();
ES6部分知识
是JS发展过程中的某一个新版本,为了方便记忆,把ES6以后的版本统称为ES6+;
新增两种变量声明:let 和const;
let /const声明和var的差异:
1,let/const 声明的变量不允许出现重复的;使用var声明变量时可以,后一个值会覆盖前一个值;
var a = 1;
var a = 2;
console.log(a);
let b = 1;
let b = 2;
console.log(b);
const c = 1;
const c = 2;
console.log(c);
运行结果显示let/const声明变量不允许重复
2,let/const 声明的变量没有变量提升;var声明的变量有变量提升,值位undefined;
console.log(a);
console.log(b);
console.log(c);
var a = 1;
let b = 100;
const c = 1000;
代码验证let/const声明的b,c没有变量提升。
3,let/const 声明的变量会受限于所有的{ },也就是let/const 声明的变量是块级作用域;var声明的变量只受限于函数内部;
if (true) {
var a = 1;
let b = 2;
const c = 3;
}
for (var i = 0; i <= 1; i++) {
var a = 1;
let b = 2;
const c = 3;
}
console.log(a);
console.log(b);
console.log(c);
可以看到let声明的变量显示未定义;
let与const的差异:
1,let声明的叫做变量(后续可以修改内部的值);const声明的叫做常量(后续不可以修改内部的值,也不能修改内部的引用地址);
let a = 1;
a = 10;
console.log(a);
const b = 200;
b = 2000;
console.log(b);
//运行结果 b 会报错
2,因为let后续可以修改变量的值,所以他首次定义时,可以不赋值;但是const声明的常量后续不能重新修改他的值,所以首次定义时,必须赋值。
let a;
a = 100;
console.log(a);
const b;
//b报错
新增箭头函数:(书写形参)=> {书写函数调用时执行的代码};是对ES5普通函数的写法上的优化
const fn2 = () => {
console.log('我是 fn2 箭头函数');
}
箭头函数的优化:
1,箭头函数如果只有一个形参的时候,可以不写前面的小括号(除此之外,必写);
const fn3 = a => {
console.log(a);
}
2,如果箭头函数的函数体只有一行代码,那么可以省略,大括号(并且会默认将这行代码return);
const fn5 = (a, b) => a + b;
箭头函数与普通函数的区别:
1,箭头函数内部木有this;所以他的this取决于书写的时候;
const fn = () => {
console.log(this);
}
fn();
var obj = {
a: 1,
b: '我是对象obj',
fn: function () {
console.log(this);
},
// console.log(this) window
fn1: () => {
console.log('我是箭头函数的 this', this);
}
}
obj.fn(); // this === obj
obj.fn1();
2,箭头函数内部没有arguments对象;
const fn1 = () => {
// 箭头函数内部没有 arguments 所以这里打印会报错
console.log(arguments);
}
fn1(999, 123, 456);
ES6新增解构赋值
快速从数组或对象中取出成员的一种语法;
1,解构数组,赋值号左边必须写中括号,代表是数组的解构赋值;
var arr = [1, 2];
let [num1, num2, num3] = arr
2,解构对象时,赋值号左边必须写大括号,代表对象的解构赋值;大括号内部必须书写对象的key。
var obj = {
a: 11,
b: 21,
c: 31
}
let { a, b, c } = obj
console.log(a, b, c);
ES6新增展开运算符
语法:...数组(或对象); 作用:展开数组或者对象,相当于把数组两侧包裹的中括号去掉;
1,展开数组
var arr = [1, 2, 3];
console.log(arr);
console.log(...arr);
2,展开对象
var obj1 = {
...obj,
c: 3,
d: 4
}
console.log(obj1);//得到展开的obj
console.log(...obj1);//JS不支持这种写法
ES6新增两种数据结构:Set 和 Map。
1,set数据结构, 类似于数组的一种数据结构,内部按照索引排序(但是不能通过索引获取值);语法:let s = new Set([数据1,数据2,数据3]),特点:天生不支持重复数据。
let s = new Set([3, 4, 5, 5, 5, 4, 4, 3]);
//实际存储的值是[3,4,5]
包含的方法:
1),size方法(类似数组的length);作用,获取当前数据结构中的数据量;
console.log(s.size);
2),add方法 作用,向当前数据结构中 新增数据;
s.add(100);//向数据结构中新增一个100;
3),has方法 作用,查询当前数据结构中是否拥有该数据;找到了返回true,否则返回false;
console.log(s.has(100));
4),delete(数据) 作用,将当前数据结构中的这个数据删除;
s.delete(5);
5),clear( ) 作用,清空当前数据结构;
s.clear();
6),forEach 作用,遍历数据结构,拿到数据结构的每一项;
s.forEach(function(item,key,origin) {
console.log(item,key,origin);//set数据结构是没有key所以item和key打印出来的值都一样
})
2,Map数据结构, 和set一样也不支持重复数据,类似于对象的一种数据结构,但是map的key可以是任意类型的值;实际开发中,使用map的场景一般为 想要将对象的key用于字符串之外的数据使用。
var m = new Map([[[500], [600]], [arr, arr1], ['arr123', arr1]]);
map数据结构的常用方法:
1),size ,作用:返回当前数据结构的数据长度(多少个);
m.size;
2),set( ), 作用,向当前数据结构中,新增数据;第一个参数为key,第二个参数为value;
m.set('newKey', [1, 2, 3, 4, 5]);
3),get(key), 作用,获取到指定key 对应的value;
m.get(arr);
m.get('newKey');
4),has(key) ,作用,查询数据结构中是否存在当前key;存在返回true,不存在返回false;
console.log(m.has('newKey'));
5),delete, 作用,删除当前数据结构对应的key;
m.delete('newKey');
6)clear, 作用,清空当前数据结构;
m.clear();
7)forEach ,遍历数据结构;
m.forEach(function (item, key, origin) {
/**
* item: 对应的 value
* key: 对应的 key
* origin: 对应的原始数据结构
*/
console.log(item, key, origin);
})
对象语法的简写:
当key 和 value 拼写一样,并且value写的是一个变量时,可以少写其中一个;
const obj = {
name: name,
age: 18,
}
//可以简写为:
const obj = {
name,
age: 18,
}