ES6 学习体会
第一部分:
1.初始化项目 npm init -y
2.安装ES6 环境
.babelrc 文件
babel-cli -g
babel-ecmascript2015 babel-cli --save-dev
#######################################################################################################
第二部分:
变量的三种声明方式:
var -- 全局声明(容易产生污染)
let -- 局部声明(只存在于当前作用域)
const -- 变量声明之后,不允许随意更改(也可理解为常量)
#######################################################################################################
第三部分:
1.变量的解构赋值
<< ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。解构赋值在实际开发中可以大量减少我们的代码量,并且让我们的程序结构更清晰。
<< 1.
let a = 0;
let b = 1; =>
let c = 2;
let [a,b,c] = [1,2,3] => var a = 1,b = 2, c = 3;
let [a,[b,c],d] = [1,[2,3],4] => var a = 1,b = 2,c =3 ,d = 4
注:如果等号两边形式不一样,很可能获得undefined或者直接报错。
<< 2.数组的解构:
1>
let [foo=true] = [];
console.log(foo) // true
2>
let [a,b="zcc"] = ['hello']
console.log(a+b) // hellozcc
3>undefined相当于什么都没有,b解构成了null。
let [a,b="zcc"] = ['hello',undefined]
console.log(foo) // hellozcc
4>null 有值,但值为null,b取null。
let [a,b="zcc"] = ['hello', null]
console.log(foo) // hello null
<< 3.对象的解构
注意:对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
1.解构不仅可以用于数组,还可以用于对象。
let foo;
({foo,bar} = {foo : 'zcc',bar : '000'});
console.log(foo+bar) // zcc000
<< 4.字符串的解构
字符串也可以解构,这是因为,此时字符串被转换成了一个类似数组的对象。
const [a,b,c,d]="JFAS";
console.log(a);
console.log(b);
console.log(c);
console.log(d);
#######################################################################################################
第三部分:扩展运算符和rest运算符
<< 1.对象扩展运算符(...):
(主要用于:当我们声明一个变量方法,但不确定参数个数的时候)
function argument(...arg){
console.log(arr[0])
console.log(arr[1])
console.log(arr[2])
console.log(arr[3])
}
argument(1,2,3)
1.eg: 这里的arr2 是对arr1 的映射
let arr1=['www','xiaoming','com'];
let arr2=arr1;
console.log(arr2); // www,xiaoming,com
arr2.push('shengHongYu');
console.log(arr1); // www,xiaoming,com,shengHongYu
2.eg: 这里的arr2 是对arr1 的扩展
let arr1=['www','xiaoming','com'];
let arr2=[...arr1];
console.log(arr2); // www,xiaoming,com
arr2.push('shengHongYu');
console.log(arr2); // www,xiaoming,com,shengHongYu
console.log(arr1); // www,xiaoming,com
<< 2.rest(剩余) 运算符
function argument(first,...arg){
console.log(arg.length)
for(let i = 0;i < arg.length; i++){
console.log(arg[i]) // 1,2,3,4,5,6
}
for(let val of arg){ // ES6 循环更高效率
console.log(val) // 1,2,3,4,5,6
}
}
argument(0,1,2,3,4,5,6) // 6
#######################################################################################################
第五部分:字符串模版
ES6对字符串新增的操作,最重要的就是字符串模版,字符串模版的出现让我们再也不用拼接变量了,而且支持在模板里有简单计算操作。
<< 1. 字符串拼接
let str1 = 'zcc2333';
let str2 = '字符串2'; // let str2 = `${str1}我是一个字符串`;
<< 2.查找字符串
let str = "zcc2333";
let str2 = "zcc2333我是一个字符串";
console.log(str2.indexOf(str1)); //返回索引,没有返回-1;
console.log(str2.includes(str1)); //返回 true 不存在返回false
console.log(str2.startsWith(str1)) //返回 查看开头是否有 true/false
console.log(str2.endsWith(str1)) //返回 查看结尾是否有 true/false
<< 3.字符串复制
document.write('zcc2333|'.repeat(10)) // 第一个参数是要复制的字符串,repeat(num) 要复制的个数
#######################################################################################################
第六部分:ES6数字操作
<< 1.二进制和八进制
1>. 二进制
二进制声明: 二进制的英文单词是Binary,二进制的开始是0(零),然后第二个位置是b(注意这里大小写都可以实现),然后跟上二进制的值就可以了。
let binary = 0B100110;
console.log(binary) // 21
2>. 八进制
八进制声明:八进制的英文单词是Octal,也是以0(零)开始的,然后第二个位置是O(欧),然后跟上八进制的值就可以了。
let octonary = 0O666;
console.log(octonary) // 438
<< 2.数字判断和转换
1>. 数字验证Number.isFinite( xx )
注意:可以使用Number.isFinite( )来进行数字验证,只要是数字,不论是浮点型还是整形都会返回true,其他时候会返回false。
let a = 11/4;
console.log(Number.isFinite(a));//true
console.log(Number.isFinite('xiaoming'));//false
console.log(Number.isFinite(NaN));//false
console.log(Number.isFinite(undefined));//false
3>. NaN验证
NaN是特殊的非数字,可以使用Number.isNaN()来进行验证。下边的代码控制台返回了true。
console.log(Number.isNaN(NaN)); // true
4>. 判断是否为整数Number.isInteger(xx)
let a=123.1;
console.log(Number.isInteger(a)); //false
5>. 整数转换Number.parseInt(xxx)和浮点型转换Number.parseFloat(xxx)
let a='9.18';
console.log(Number.parseInt(a)); // 9
console.log(Number.parseFloat(a)); // 9.18
<< 3.整数取值范围操作
注意:整数的操作是有一个取值范围的,它的取值范围就是2的53次方。我们先用程序来看一下这个数字是什么。
let a = Math.pow(2,53)-1;
console.log(a); //9007199254740991
1>. 最大安全整数
console.log(Aumber.MAX_SAFE_INTEGER(a))
2>. 最小安全整数
console.log(Number.MIN_SAFE_INTEGER(a))
3>. 安全整数判断
let a = Math.pow(2,53) - 1;
console.log(Nuber.isSafeInteger(a)) // fasle
#######################################################################################################
第七部分:ES6中新增的数组知识(1)
<< 1. json 转换数组方法 Array.from()
let json1 = {
"0": "小明",
"1": 18,
'2': "china",
length: 3
}
这就是一个标准的JSON数组格式,跟普通的JSON对比是在最后多了一个length属性。只要是这种特殊的json格式都可以轻松使用ES6的语法转变成数组。在ES6中绝大部分的Array操作都存在于Array对象里。我们就用Array.from(xxx)来进行转换。然后再控制台输出一下:
let arr = Array.from(json)
console.log(arr) // arr = ["小明",18,"china"]
<< 2.Array.of()
它负责把一堆文本或者变量转换成数组。在开发中我们经常拿到了一个类似数组的字符串,需要使用eval来进行转换,我们知道 eval 转换的效率是很低的,它会拖慢我们的程序。这时候我们就可以使用Array.of方法。我们看下边的代码把一堆数字转换成数组并打印在控制台上:
数字转数组:
let arr =Array.of(3,4,5,6);
console.log(arr); // [3,4,5,6]
字符串转数组:
let arr =Array.of('小明','18','china');
console.log(arr); // ['小明','18','china']
<< 3.find( )实例方法:
所谓的实例方法就是并不是以Array对象开始的,而是必须有一个已经存在的数组,然后使用的方法,这就是实例方法。
这里的find方法是从数组中查找。在find方法中我们需要传入一个匿名函数,函数需要传入三个参数:
1> value: 表示当前查找的值。
2> index: 表示当前查找的数组索引。
3> arr: 表示当前数组。
#####################################################################################
第八部分:ES6中新增的数组知识(2)
<< 1.fill( )实例方法:
fill()也是一个实例方法,它的作用是把数组进行填充,它接收三个参数,第一个参数是填充的变量,第二个是开始填充的位置,第三个是填充到的位置。
let arr=[0,1,2,3,4,5,6,7,8,9];
arr.fill('xiaoming',2,5);
console.log(arr);
<< 2.for...of循环:
这种形式比ES5的for循环要简单而且高效。先来看一个最简单的for…of循环。
let arr = ['小明','18','china.'];
1>. 循环数组中的元素
for(let item of arr){
console.log(item)
}
// '小明' '18' 'china.'
2>. 循环数组中的下标 arr.keys() -> es6 中的实例方法
for(let item of arr.keys()){
console.log(item)
}
// 0 1 2
2>. 同时输出数组的内容和索引
for( let [index,val] of arr.entries){
console.log(index+':'+val)
}
// 0 : 小明 1 : 18 2 : china
<< 3.entries( )实例方法:
entries()实例方式生成的是Iterator形式的数组,那这种形式的好处就是可以让我们在需要时用next()手动跳转到下一个值。我们来看下面的代码:
let arr=['小明','18','china']
let list=arr.entries(); // 将数组生成条目行的形式
console.log(list.next().value); // [0, "小明"]
console.log(list.next().value); // [1, "18"]
console.log(list.next().value); // [2, "china"]
#####################################################################################
第九部分:ES6中的箭头函数和扩展
回顾一下ES5中的函数写法。写一个函数,进行一个加法计算:
function add(a,b){
return a+b
}
add(2); // undefined
add(2,3); // 2+3 =5
<< 1.默认值
在ES6中给我们增加了默认值的操作,我们修改上边的代码,可以看到现在只需要传递一个参数也是可以正常运行的。
function add(a,b=1){ // b 的默认值为 1
return a+b
}
add(2); // 2+1 = 3
add(2,3); // 2+3 =5
<< 2.主动抛出错误
在使用Vue的框架中,可以经常看到框架主动抛出一些错误,比如v-for必须有:key值。那尤大神是如何做到的那?
其实很简单,ES6中我们直接用throw new Error( xxxx ),就可以抛出错误。
function add(a,b=1){
if(a == 0){
throw new Error('This is error')
}
return a+b;
}
console.log(add(0));
<< 3.函数中的严谨模式
在ES5中就经常使用严谨模式来进行编程,但是必须写在代码最上边,相当于全局使用。在ES6中我们可以写在函数体中,相当于针对函数来使用。
function add(a,b=1){
'use strict'
if(a == 0){
throw new Error('This is error');
}
return a+b;
}
console.log(add(1)); // 浏览器报错,严谨模式不允许使用默认值
<< 3.获得需要传递的参数个数
使用别人的框架时,不知道别人的函数需要传递几个参数怎么办?ES6为我们提供了得到参数的方法(xxx.length).我们用上边的代码看一下需要传递的参数个数。
function add(a,b){
'use strict'
if(a == 0){
throw new Error('This is error');
}
return a+b;
}
console.log(add.length); // 2
当其中的a 或 b 含有默认值时 这时候 add.length 为1.
当其中的a 和 b 都有默认值时 这时候 add.length 为0.
function add(a,b=1){
'use strict'
if(a == 0){
throw new Error('This is error');
}
return a+b;
}
console.log(add.length); // 2
<< 5.箭头函数
注:箭头函数不允许使用 new 构造函数!
add(a,b=1) => a+b;
console.log(add(1,3)) // 4
add(a,b=1) => {
return a+b
}
console.log(add(3)) // 4
注:箭头函数不允许使用 new 构造函数!!!
第十部分:ES6中的函数和数组补漏
<< 1.对象的函数解构
我们在前后端分离时,后端经常返回来JSON格式的数据,前端的美好愿望是直接把这个JSON格式数据当作参数,传递到函数内部进行处理。ES6就为我们提供了这样的解构赋值。
let json = {
a:'小明',
b:'china'
}
function fn({a,b='xiaoming'}){
console.log(a,b);
}
fn(json); // 小明 china
let arr = ['小明','18','china'];
function fun(a,b,c){
console.log(a,b,c);
}
fun(...arr); // '小明' '18' 'china'
<< 2.in的用法
in是用来判断对象或者数组中是否存在某个值的。
1>. 对象判断
let obj={
a:'xiaoming',
b:'小明'
}
console.log('a' in obj); //true
2>. 数组判断 (数组空位的判断)
先来看一下ES5判断的弊端,以前会使用length属性进行判断,为0表示没有数组元素。但是这并不准确,或者说真实开发中有弊端。
let arr=[,,,,,];
console.log(arr.length); // 5
上边的代码输出了5,但是数组中其实全是空值,这就是一个坑啊。那用ES6的in就可以解决这个问题。
let arr=[,,,,,];
console.log(0 in arr); //false
let arr1=['xiaoming','小明'];
console.log(0 in arr1); // true
注意:这里的0指的是数组下标位置是否为空。
<< 3.数组的遍历方法
1>. forEach
let arr=['小明','18','china'];
arr.forEach((val,index)=>console.log(index,val));
forEach循环的特点是会自动省略为空的数组元素,相当于直接给我们筛空了。但是有时候我们需要这样的空数组,那就会非常尴尬了。
2>. filter
let arr=['小明','18','china'];
arr.filter(x=>console.log(x));
// 小明
// 18
// china
// []
3>. some
let arr=['小明','18','china'];
arr.some(x=>console.log(x));
// 小明
// 18
// china
// false
4>. map
let arr=['小明','18','china'];
console.log(arr.map(x=>'web'));
// ["web", "web", "web"]
// undefined
<< 4.数组转换字符串
1>. join()方法
join()方法就是在数组元素中间,加了一些间隔,开发中很有用处。
let arr=['小明','18','china'];
console.log(arr.join('|'));
// '小明|18|china'
2>. toString()方法
// 转换时是用逗号隔开了。
let arr=['小明','22','china'];
console.log(arr.toString());
第十一部分:ES6中对象
<< 1.
ES6 学习体会的更多相关文章
- TagHelper的一些个人学习体会(发现了微软官方文档的一个错误)
最近一直在学习.net core 上周六开始学习Taghelper的自定义,准备周日写个博客和大家分享一下学习体会,无奈周日去考科四了,回来之后就感冒了,现在还没好.可是我发现了微软官方文档的一个错误 ...
- ES6学习目录
前面的话 ES6是JavaScript语言的下一代标准,已经在 2015 年 6 月正式发布.它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言 为什么要学 ...
- es6学习笔记-class之继承
继承 上一篇学习了class的概念,在es5时,对象的继承有好几种,原型链继承,借用构造函数继承,组合继承,原型式继承,寄生式继承以及寄生组合式继承,都是按照函数的形式去集成的,现在class也有它的 ...
- es6学习笔记-class之一概念
前段时间复习了面向对象这一部分,其中提到在es6之前,Javasript是没有类的概念的,只从es6之后出现了类的概念和继承.于是乎,花时间学习一下class. 简介 JavaScript 语言中,生 ...
- javascript的ES6学习总结(第二部分)
1.数组循环 介绍数组循环之前,先回顾一下ES5数组的循环 (1)数组遍历(代替普通的for):arr.forEach(callback(val,index,arr){todo}) //val是数组的 ...
- javascript的ES6学习总结(第一部分)
ES6(ESNext学习总结——第一部分) ES6, 全称 ECMAScript 6.0 ,是 JavaScript 的下一个版本标准,2015.06 发版. ECMA每年6月份,发布一个版本 201 ...
- ES6学习笔记<五> Module的操作——import、export、as
import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...
- ES6学习笔记<四> default、rest、Multi-line Strings
default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...
- ES6学习笔记<三> 生成器函数与yield
为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...
随机推荐
- 转 IOS7开发错误收集
转自:http://blog.csdn.net/smallsky_keke/article/details/16117653 1. fatal error: file '/Applications/X ...
- C++二维数组动态申请内存
好久没用C++刷题了,今天早上刷了几条题,感觉很陌生了.怪我,大二下实在太颓废了,没啥作为. 今天更新个关于c++二维数组内存申请的问题,当初作为菜鸟初学指针的时候,还是在这方面有点搞不通的.今天用到 ...
- 多任务版udp聊天器
import socket import threading def send_msg(udp_socket): """获取键盘数据,并将其发送给对方"&quo ...
- Guava Cache 工具类 [ GuavaCacheUtil ]
pom.xml <dependency> <groupId>com.google.guava</groupId> <artifactId>guava&l ...
- nuxt.config有关router配置
这里只说明一个属性,其他属性移步官方文档 https://zh.nuxtjs.org/api/configuration-router extendRoutes 官方说明: 你可以通过 exten ...
- PAT (Basic Level) Practice 1006 换个格式输出整数
个人练习 让我们用字母B来表示“百”.字母S表示“十”,用“12...n”来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数.例如234应该被输出为BBSSS1234,因为 ...
- POJ:3061-Subsequence(尺取法模板详解)
Subsequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18795 Accepted: 8043 Descript ...
- KEIL里如何实现仿真 查看输出波形
1首先打开keil软件 ,点击options 我们选择在debug 2 点击debug 红色的按钮 3 进入调试界面后 ,打开logic analysis窗口 4 打开窗口后 进入setup 4 会弹 ...
- 4 Vue.js 核心理念:数据驱动界面
1 style样式放在body里面 <style type="text/css"> .ui.segment.container { width:700px; } p { ...
- Erlang中常用的类型转换[转]
转自: http://blog.sina.com.cn/s/blog_53a5047b01018yqv.html 例子 结果 atom_to_list(hello). "hello" ...