JS ES6
变量 let
- 块级作用域内有效
 - 不能重复声明
 - 不会预处理,不存在提升
 
var btns = document.getElementsByTagName('button');
for (let i = 0; i < btns.length; i++) {
	var btn = btns[i];
	btn.onclick = function(){
		alert(i)
	}
}
// for (var i = 0; i < btns.length; i++) {
// 	var btn = btns[i];
// 	(function(i){
// 		btn.onclick = function(){
// 			alert(i)
// 		}
// 	})(i)
// }
常量 const const key = 'Kevin'
解构赋值
//解构对象
let obj = {username: 'Tom', age: 20}
let {username, age} = obj;
console.log(username, age); //Tom 20
//解构数组
let arr = [20, 'ab', 'Tom']
let [,a,b] = arr;
console.log(a, b); //ab Tom
//多形参解构
function person({username, age}){
	console.log(username, age);
}
var p1 = {username: 'Kevin', age:28}
person(p1); //Kevin 28
模板字符串
let name = 'Kevin';
let str = `Hello Es6 String, I am ${name}.`;
console.log(str); //Hello Es6 String, I am Kevin.
对象简写
let username = 'Kevin';
let age = 28;
//省略同名属性
//省略方法function
let person = {
	username,
	age,
	getUserName() {
		return this.username;
	}
}
console.log(person); //{username: 'Kevin', age: 28, getUserName: f..}
console.log(person.getUserName()); //Kevin
箭头函数
//作用:定义匿名函数
let fun1 = () => console.log('fun1');
//一个形参时可省略括号;函数体无大括号时自动return结果
let fun2 = x => x*2;
//多个形参;函数体有大括号时不自动返回结果
let fun3 = (x, y) => x + y;
let fun4 = (x, y) => {
	console.log(x, y);
	return x + y;
}
//箭头函数没有自己的this,不是调用时候决定的,而是定义时候的所处对象
//技巧: 看this外层是否有函数
//1. 有:外层函数的this就是内部箭头函数的this
//2. 无:this指向window
let user = {
	name: 'Kevin',
	getUser: function(){
		console.log(this); //{name: "Kevin", getUser: ƒ}
	}
}
user.getUser(); //Kevin
let user2 = {
	name: 'Tom',
	getUser: () => {
		console.log(this);
	}
}
user2.getUser(); //window
三点运算符
//可变参数
function fun1(...values){
	console.log(arguments); //["a", "b", "c", callee: (...), Symbol(Symbol.iterator): ƒ]
	console.log(...arguments); //a b c
	console.log(values); //["a", "b", "c"]
	let args = Array.prototype.slice.call(arguments);
	console.log(args); //["a", "b", "c"]
}
fun1('a', 'b', 'c'); 
//扩展运算
let arr1 = [3,4,5];
let arr2 = [1,2,...arr1,6];
console.log(arr2); //[1, 2, 3, 4, 5, 6]
形参默认值
function Point(x = 0, y = 0){
	this.x = x;
	this.y = y;
}
let point = new Point();
console.log(point.x, point.y); // 0 0
Promise
let promise = new Promise((resolve, reject) => {
	setTimeout(() => {
		resolve('yes');
		// reject('no');
	}, 1000)
})
promise
	.then((data) => {
		console.log(data); //yes
	}, (error) => {
		console.log(error); //no
	})
 //定义一个Get请求的方法
function sendGetAjax(url){
	//创建一个promise对象
	let promise = new Promise((resolve, reject) => {
		//初始化promise状态为pending
		//启动异步任务
		let request = new XMLHttpRequest();
		request.onreadystatechange = function () {
			if(request.readyState === 4){
				if(request.status === 200){
					let data = request.response;
					resolve(data);
				}else{
					reject('error');
				}
			}
		};
		request.responseType = 'json';//设置返回的数据类型
		request.open("GET", url);//规定请求的方法,创建链接
		request.send();//发送
	})
	return promise;
}
Iterator
- iterator是一种接口机制,为各种不同的数据结构提供统一的访问机制
 
//迭代器原理
function mockInterator(arr){
	var nextIndex = 0;
	return {
		next: function(){
			return (nextIndex < arr.length) ? {value: arr[nextIndex++], done: false} : {value: undefined, done:true}
		}
	}
}
let arr = [1,2,3,'abc'];
let obj = mockInterator(arr)
console.log(obj.next()); //{value: 1, done: false}
console.log(obj.next()); //{value: 2, done: false}
console.log(obj.next()); //{value: 3, done: false}
console.log(obj.next()); //{value: "abc", done: false}
console.log(obj.next()); //{value: undefined, done: true}
console.log(obj.next()); //{value: undefined, done: true}
// 原生具备iterator接口的数据(可用for of遍历)
//   1、Array
let arr3 = [1, 2, 'kobe', true];
for(let i of arr3){
  console.log(i);
}
//   2、arguments
//   3、set容器
//   4、map容器
//   5、String
let str = 'abcdefg';
for(let item of str){
  console.log(item);
}
Generator
- ES6提供的解决异步编程的方案之一
 
function* sendXml() {
  // url为next传参进来的数据
  let url = yield getNews('http://localhost:3000/news?newsId=2');
  yield getNews(url);
}
function getNews(url) {
  $.get(url, function (data) {
	console.log(data);
	let commentsUrl = data.commentsUrl;
	let url = 'http://localhost:3000' + commentsUrl;
	// 当获取新闻内容成功,发送请求获取对应的评论内容
	// 调用next传参会作为上次暂停是yield的返回值
	sx.next(url);
  })
}
let sx = sendXml();
// 发送请求获取新闻内容
sx.next();
Async
async function sendXML(url) {
	return new Promise((resolve, reject) => {
		$.ajax({
			method: 'GET',
			url,
			success: data => resolve(data),
			error: error => reject(error)
		})
	})
}
async function getNews(url){
	let result = await sendXML(url);
	console.log('->', result);
	result = await sendXML(url + result.commentId);
	console.log('->', result);
}
getNews('http://localhost:30001/news?id=9');
Class
class Person {
	//调用类的构造方法
	constructor(name, age){
		this.name = name;
		this.age = age;
	}
	//定义一般的方法
	showName(){
		console.log(this.name, this.age);
	}
}
let person = new Person('kobe', 39);
console.log(person, person.showName());
//定义一个子类
class StrPerson extends Person{
	constructor(name, age, salary){
		super(name, age);//调用父类的构造方法
		this.salary = salary;
	}
	showName(){//在子类自身定义方法
		console.log(this.name, this.age, this.salary);
	}
}
let str = new StrPerson('weide', 38, 1000000000);
console.log(str);
str.showName();
扩展
字符串扩展
- includes(str) : 判断是否包含指定的字符串
 - startsWith(str) : 判断是否以指定字符串开头
 - endsWith(str) : 判断是否以指定字符串结尾
 - repeat(count) : 重复指定次数
 
let str = "Asjodifjasoid";
console.log(str.includes("a")); //true
console.log(str.startsWith("b")); //false
console.log(str.endsWith("d")); //true
let str2 = str.repeat(2);
console.log(str2); //AsjodifjasoidAsjodifjasoid
数值拓展
- 二进制与八进制数值表示法: 二进制用0b, 八进制用0o
 - Number.isFinite(i) : 判断是否是有限大的数
 - Number.isNaN(i) : 判断是否是NaN
 - Number.isInteger(i) : 判断是否是整数
 - Number.parseInt(str) : 将字符串转换为对应的数值
 - Math.trunc(i) : 直接去除小数部分
 
console.log(0b1000); //8
console.log(Number.isFinite(5)); //true
console.log(Number.isNaN(NaN)); //true
console.log(Number.isInteger(1.1)); //false
console.log(Number.parseInt('123abc')); //123
console.log(Math.trunc(11.123)); //11
数组拓展
    //Array.from(v) : 将伪数组对象或可遍历对象转换为真数组
    let btns = document.getElementsByTagName('button');
    console.log(btns.length);//3
    Array.from(btns).forEach(function (item, index) {
        console.log(item, index);
    });
    //Array.of(v1, v2, v3) : 将一系列值转换成数组
    let arr = Array.of(1, 'abc', true);
    console.log(arr);
    //find(function(value, index, arr){return true}) : 找出第一个满足条件返回true的元素
    let arr1 = [1,3,5,2,6,7,3];
    let result = arr1.find(function (item, index) {
        return item >3
    });
    console.log(result);//5
    //findIndex(function(value, index, arr){return true}) : 找出第一个满足条件返回true的元素下标
    let result1 = arr1.findIndex(function (item, index) {
        return item >3
    });
    console.log(result1);//2
对象扩展
    console.log(Object.is('abc', 'abc'));//true
    console.log(NaN == NaN);//false
    console.log(Object.is(NaN, NaN));//true
    console.log(0 == -0);//true
    console.log(Object.is(0, -0));//false
    //Object.assign(target, source1, source2..) 浅拷贝
    let obj = {name : 'kobe', age : 39, c: {d: 2}};
    let obj1 = {};
    Object.assign(obj1, obj);
    console.log(obj1, obj1.name);
    //直接操作 __proto__ 属性
    let obj3 = {name : 'anverson', age : 41};
    let obj4 = {};
    obj4.__proto__ = obj3;
    console.log(obj4, obj4.name, obj4.age);
深度克隆
function objDeepCopy(obj) {
	var result = Array.isArray(obj) ? [] : {};
	for (var key in obj) {
		if (obj.hasOwnProperty(key)) {
			if (typeof obj[key] === 'object') {
				result[key] = objDeepCopy(obj[key]); // 递归复制
			} else {
				result[key] = obj[key];
			}
		}
	}
	return result;
}
												
											JS ES6的更多相关文章
- js es6 map 与 原生对象区别
		
区别 object和Map存储的都是键值对组合.但是: object的键的类型是 字符串: map的键的类型是 可以是任意类型: 另外注意,object获取键值使用Object.keys(返回数组): ...
 - js ES6 多行字符串 连接字符串
		
1. 以前,js多行字符串用\n写起来比较费事,所以最新的ES6标准新增了一种多行字符串的表示方法,用` ... `表示: 旧版写法 alert("你好,\n 我叫\n Olive" ...
 - js ES6  Set和Map数据结构详解
		
这篇文章主要介绍了ES6学习笔记之Set和Map数据结构,结合实例形式详细分析了ECMAScript中基本数据结构Set和Map的常用属性与方法的功能.用法及相关注意事项,需要的朋友可以参考下 本 ...
 - 2019.7月-前端面试总结(H5+C3+JS+ES6+Vue+浏览器)
		
第二次面试 HTML HTML5中的新标签,举例一下 canvas绘画,本地离线存储localStorage,sessionStorage,video和audio元素,语义化元素,表单类型(date, ...
 - JS&ES6学习笔记(持续更新)
		
ES6学习笔记(2019.7.29) 目录 ES6学习笔记(2019.7.29) let和const let let 基本用法 let 不存在变量提升 暂时性死区 不允许重复声明 块级作用域 级作用域 ...
 - js/es6 元素拖动
		
元素事件:鼠标按下事件/鼠标移动事件/鼠标松开事件 元素样式:让元素脱离文档流,采用绝对定位的方式. 一.鼠标按下事件 当鼠标在元素上面按下时,保存元素的初始偏移量和鼠标按下时的坐标,然后在状态变量里 ...
 - JS ES6中的箭头函数(Arrow Functions)使用
		
转载这篇ES6的箭头函数方便自己查阅. ES6可以使用“箭头”(=>)定义函数,注意是函数,不要使用这种方式定义类(构造器). 一.语法 基础语法 (参数1, 参数2, …, 参数N) => ...
 - [js]es6语法: 字符串和数组的方法
		
s的方法 根据index取value: 取首尾项,arr[0], arr[arr.length-1] 根据value取index(判断是否包含子字符串): s.indexOf 栗子: 'maotai' ...
 - JS  ES6 -- let命令
		
1.ES6新增了块级作用域的let和const 这新特性let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. for循环的计数器,就很合适使用let命令 ...
 - js es6 Object.freeze
		
将对象冻结,使用Object.freeze方法 const foo = Object.freeze({}); // 常规模式时,下面一行不起作用: // 严格模式时,该行会报错 foo.prop = ...
 
随机推荐
- mysql安装到启动遇见的问题
			
一.有时候安装mysql后使用mysql命令时报错 Can't connect to MySQL server on localhost (10061),或者用net start mysql 时报服务 ...
 - c++自定义数组越异常 ArrayIndexOutOfBoundsException  (学习)
			
#include <iostream> using namespace std; const int DefaultSize = 10; class Array{public: Array ...
 - openpose关节图
 - Anaconda3详细安装使用教程及问题总结
			
1.Anaconda是什么? 简单来说,Anaconda是Python的包管理器和环境管理器. 先来解决一个初学者都会问的问题:我已经安装了Python,那么为什么还需要Anaconda呢?原因有以下 ...
 - 每次开机后需要重新连接wifi才能上网
			
这几天打开电脑后,每次都要重新连接wifi才能上网, 网上查到如下解决方法: 打开网络和共享中心->右键无线网络->配置->电源管理->允许计算机关闭此设备以节约电源(勾选去掉 ...
 - PyTorch载入图片后ToTensor解读(含PIL和OpenCV读取图片对比)
			
概述 PyTorch在做一般的深度学习图像处理任务时,先使用dataset类和dataloader类读入图片,在读入的时候需要做transform变换,其中transform一般都需要ToTensor ...
 - Vue input 控件: 通过自定义指令(directive)使用正则表达式限制input控件的输入
			
前言: 网站中的input输入框使用非常广泛,因业务场景不同需要对输入框做合法性校验或限制输入,比如电话号码.邮件.区号.身份证号等.input框的不合法内容主要有两种方式处理:1.用户输入内容后,通 ...
 - Unity爬坑记录-Sprite 相关功能Editor、打包器等无法使用
			
找了好久的问题,同一个Unity,但是不同项目,一个没问题,一个出现上面情况.
 - flask不得不知的基础
			
python与flask不得不说的小秘密 常识引入 什么是装饰器? 在不改变源码的前提下,对函数之前前后进行功能定制. 开放封闭原则:不改变函数内部代码,在函数外部进行修改. 基本写法 import ...
 - Docker二
			
Docker生成镜像的两种方式 有时候从Docker镜像仓库中下载的镜像不能满足要求,我们可以基于一个基础镜像构建一个自己的镜像 两种方式: 更新镜像:使用docker commit命令 构建镜像:使 ...