变量声明

var 特点:
1.可以重复声明
2.不能定义常量
3.不支持块级作用域
复制代码
  • let
//1.不存在预解释 变量提升
//2.暂时性死区
//3.具备块级,同一块内不能重复声明;let a ={name:'xiaoming'}if(true){let a = 'xiaohong';//不同块,可以声明相同名;}console.log(a) //{name:'xiaoming'}if(true){let v= '20130401'}console.log(v)   //报错:v is not definedfor(var i=0;i<3;i++){//i是全局的//闭包(function(i){setTimeout(function(){console.log(i)})})(i)}//用letfor(let i = 0;i<3;i++){//i是块级的setTimeout(function(){console.log(i)},1000)}
复制代码
  • const
//不存在预解释、变量提升
//不能重复定义声明
//不能更改他的值。
//具备块级const str = 123;
str = 3445;//报错:常量不能重新赋值const = obj = {name:'xiaoming'}
obj.name= 'xiaohong';//可以修改;const限制的是不能给变量重新赋值,给变量的属性修改,实际并未修改内存地址。复制代码

解构

解构就是分解一个对象的解构,可以用一种类似数组的方式定义n个变量,可以将一个数组中的值按照规则赋值过去。
解构的时候,等号两边结构类似;左边对象右边就是对象;左边数据右边也得是数组,右边还必须是一个真是存在的值;
复制代码
  • 数组、对象的简单解构赋值
var arr = [1,2,3]
var [a,b,c] = arr; // a=>1 b=>2 c=>3var obj = {a:1,b:2}
var {a,b} = obj; //对象解构,根据key解构,a=>1,b=>2
var {a:a1,b:b1} = obj;// 对象解构,不用key作为变量名,指定变量名;  a1=>1  b1=>2
复制代码
  • 嵌套解构赋值
var arr = [{a:1,b:2},[3,4],5]
var [{a,b},[c,d],e] = arr; //结构一样,a=1 b=2,c=3,d=4,e=5var [obj,ary,n] = arr ; //整合起来赋值,obj= {a:1,b:2} ary=[3,4] n=5复制代码
  • 默认赋值解构;如果能取到值就用取到的,取不到(undefined)时就用默认的值;
var obj = {a:1}
var {a,b} = obj;
console.log(b)//undefined
var {a,b=2} = obj;
console.log(b)//2var ary = [1,,3]//ary[1] = undefined
var [a = "a", b = "b", c =new Error('C必须指定')] = ary;
console.log(a, b, c);// 1,b,3function ajax(options){var method = options.method || 'get'var data = options.data || {}...}
函数声明形参利用解构赋值+默认赋值
function ajax({method='get',data={}){//函数传参解构赋值,相当于let了这个变量;console.log(method,data)
}
ajax({method:'get',data:{id:1}
})复制代码
  • 省略赋值
var arr = [1,2,3]
var [,,j] = arr;
console.log(j)//3 只想取出数组最后一个
复制代码

模版字符串

  • 1.可以嵌套变量
  • 2.支持换行
  • 3.可带一个标签属性进行描述,因为我们希望有时候在拼接字符串的时候有自己的逻辑
var name = 'xiaoming',age = 9;
var str = `${name}今年${age}岁`
var str1= `${name}
今年${age}岁
`console.log(str)
console.log(str1)//把老数组中的每一个元素应设为新数组中的每一个元素
var users = [{id:1,name:'zfpx1'},{id:2,name:'zfpx2'}]
var newUser = users.map(item=>{return `<li>${item.id}:${item.name}</li>`
})
let str = (`<ul>${newUser}</ul>
`)
console.log(str)//描述
//带标签的模版字符串就像一个函数调用
//参数:第一个参数是文本的数组,剩下的依次是模版字符串中出现的变量值;可以用剩余运算符收拢起来
//strings 文本的数组 指的是 模版字符串被变量分割出来的数组。
function desc(strings,...rest){let result = '';for(let i =0;i<rest.length;i++){result +=(strings[i]+rest[i])}result += strings[strings.length-1] //strings是被变量分割出来的,所以长度比rest多一个;return result;
}
var str = desc`${name}今年{age}岁了`
//str就是desc的返回值面试:模版字符串(ejs等字符串模版通用原理)的原理:正则匹配-分组捕获-替换
var name = 'xiaoming',age = 9;
var tem = "${name}今年${age}岁了";
function replace(tem){return tem.replace(/\$\{(\w+)\}/g,function(...args){//args[0] 匹配到的整个串//args[1] 第一个分组捕获的return eval(args[1]);//替换匹配到的整个串})
}
console.log(replace(tem))复制代码

字符串新增的方法

  • includes 是否包含
  • startsWith 是否以什么开头
  • endsWith 是否以什么结尾
  • repeat 重复多少遍,返回新的字符串
let address1 = 'http://www.baidu.com'
let address2 = 'ftp://www.baidu.com'
if(address1.startsWith('http')){console.log('http网址')
}else  if(address1.endsWidth('http')){console.log('ftp服务')
}
let filename = 'avatar.jpg';
if(filename.endsWith('jpg') || filename.endWith('png')){console.log('图片')
}let str = 'zfpx'
str.includes('z')//true 包含let str2 = str.repeat(3);// zfpxzfpxzfpx 重复三遍,返回新的字符串复制代码

func方法(函数传参、接收参数、剩余运算符、展开运算符)

  • 默认参数:可以指定默认值,没传的话(undefined)就用默认值;指定必传参数,不传报错;解构赋值参数; function ajax(url=new Error('url不能为空'),method='get',dataType='json'){ console.log(url) console.log(method) console.log(dataType) } function ajax1({url=new Error('url不能为空'),method='get',dataType='json'}){ console.log(url) console.log(method) console.log(dataType) }

ajax('/user') ajax1({ url:'/user' })

  • 剩余操作符,函数接收参数时使用,只能作为函数的最后一个接收参数使用;
//求和
function sum(prefix,...rest){let n = rest.reduce((prev,next,nextIndex,origin)=>{return prev+next;})return prefix+n
}
sum('$',1,2,3,4)//求平均值
function fn(...rest){return rest.reduce((prev,next,nextIndex,origin)=>{let sum = prev+next;if(nextIndex == origin.length-1){return sum/origin.length;}else{return sum;}})
}
fn(1,2,3,4)复制代码
  • 展开运算符(浅拷贝、合并对象、函数入参)
//数组
var arr1 = [1,2,3]
var arr2 = [4,5,6]
var arr3 = [...arr1,...arr2]
var arr4 =arr1.concat(arr2)//对象
var obj1 = {a:1,b:2}
var obj2 = {c:3,d:4}
var obj3 = {...obj1,...obj2
}
var obj4 = Object.assign({},obj1,obj2)
//函数入参
function sum(a,b,c){return a+b+c
}
sum(...arr1)Math.max(1,2,3)
Math.max.apply(null,arr1)
Math.max(...arr1)前端面试扩展:
//深拷贝、浅拷贝
浅拷贝:  ...展开运算符、Object.assign
深拷贝:
JSON.parse(JSON.stringify({home:{city:'beijing'}))
function deepClone(origin){let result;if(origin instanceof Array){result = [];for(let i=0;i<origin.length;i++){result.push(deepClone(origin[i]))}}else if(origin instanof Object){result  = {};for(let key in origin){result[key] = deepClone(origin[key])}}else{result = origin}return result;
}//reduce 的原理
//reduce 支持两个参数:第一个参数是函数,第二个参数是初始值(不传的话默认是数组第一项)
//主要原理 就是 上一次的执行结果是下一次的初始值。var arr = [1,2,3,4]arr.reduce((prev,next,nextIndex,origin)=>{return prev +next},10)  //初始值是10,第一次调用prev是10,next是1,nextIndex是0, 最后得到的结果是20 Array.prototype.myReduce = function(cb,initVal){var prev,nextIndex;if(typeof initVal =='undefined'){//没传的话,初始值是数组第一项,next的索引是1prev = this[0];nextIndex = 1;}else{//传了的话,初始值是传入的,next的索引是0prev = initVal;nextIndex = 0;}for(var j = nextIndex;j<this.length;j++){prev = cb(prev,this[j],j,this)//执行结果是下一次的初始值。}return prev;
}复制代码

arrow箭头函数

  • this指向上一级作用域的this
  • 没有arguments
var sum = function(a,b){return a+b;
}
//如果只有返回值,没有函数题代码,则可以省略{}
var sum1 = (a,b)=>a+b;
sum1(1,2)如果有且只有一个参数,可以省略小括号;
var double = num =>num*2
console.log(double(2))//this问题,  箭头函数没有this,他会使用上级作用域的的this;let obj = {name:'zfpx',getName(){console.log(this.name)//this=>obj}}obj.getName()
-------
let obj2 = {name:'zfpx',getName(){//this=>objsetTimeout(function () {console.log(this.name)//this=>window,   undefined},1000)}
}
obj2.getName()---
let obj3 = {name:'zfpx',getName(){//this=>objsetTimeout( ()=> {//箭头函数没有this,他会使用上级作用域的的thisconsole.log(this.name)//this=>obj,  zfpx},1000)}
}
obj3.getName()---
let obj4 = {name:'zfpx',getName:()=>{console.log(this.name,11111) //this =>window,    undefined}
}
obj4.getName()//箭头函数的this是定死的,在定义时就定死了,不管在哪里调,不管谁去调,this都是定义时的外层作用域的this
var obj5 = {name:'zfpx',getName:()=>{console.log(this.name) //this =>window,    undefined}
}
var obj6 = {};
obj6.getName = obj5.getName;
obj6.getName();复制代码

20181210-es6(letconst解构模版字符串原理 展开运算符、剩余运算符运用 深拷贝原理 reduce原理 箭头函数)...相关推荐

  1. es6笔记2之解构赋值,rest和展开运算符

    1.数组解构 var arr=[1,2,3] var [a,b,c]=arr 然后就可以给abc分别赋对应的值 应用场景: 1.1  var [x,y]=[y,x]  变量互换 1.2  字符串解构  ...

  2. ES6常用解构赋值有哪几种?

    ES6常用解构赋值有哪几种? a.数组的解构赋值 //数组解析赋值,模式匹配 {let [a, b, c] = [1, 2, 3];console.log("模式匹配");cons ...

  3. ES6 的解构赋值前每次都创建一个对象吗?会加重 GC 的负担吗?

    本文来源于知乎上的一个提问. 为了程序的易读性,我们会使用 ES6 的解构赋值: function f({a,b}){} f({a:1,b:2}); 这个例子的函数调用中,会真的产生一个对象吗?如果会 ...

  4. ES6语法~解构赋值、箭头函数、class类继承及属性方法、map、set、symbol、rest、new.target、 Object.entries......

    2015年6月17日 ECMAScript 6发布正式版本 前面介绍基本语法,  后面为class用法及属性方法.set.symbol.rest等语法. 一.基本语法:  1.         定义变 ...

  5. ES6中解构赋值深入解读

    ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构 1.数组的解构赋值 let [head, ...tail] = [1, 2, 3, 4]; head // 1 tail ...

  6. ES6语法---解构赋值

    解构赋值概念 按照一定的模式,从数组和对象中提取值,对变量进行赋值,就被称为解构. 目的是为了提高效率,使用起来更加方便. 以下的各个说明,我会类比着ES5去解释,希望能帮到小伙伴们. 数组解构 正常 ...

  7. es6学习 -- 解构赋值

    ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 以前,为变量赋值,只能直接指定值. let a = 1; let b = 2; let c ...

  8. 前端面试不用怕!一分钟带你了解es6的解构赋值

    解构赋值(★★★)!!!!! ES6中允许从数组中提取值,按照对应位置,对变量赋值,对象也可以实现解构 <script>var stus=['李钟硕','刘诗诗','易烊千玺']//访问数 ...

  9. ES6:解构赋值及对象方法

    解构赋值 对象解构 起别名:通过:来进行取名 //对象解构赋值 var obj = { uname: "张三", age: 21, sex: "男" } // ...

最新文章

  1. POJ2594 最小路径覆盖
  2. arcgis api for javascript 距离与面积量算
  3. android training 笔记
  4. HT for Web 3D游戏设计设计--汉诺塔(Towers of Hanoi)
  5. 约吗? 免费领取一大波90后单身女神产品经理(增加5位女神)
  6. Java【全排列 算法 模板】
  7. 计算机网络技术三级做题技巧,三级网络技术——我的经历,我的技巧
  8. 7.9模拟赛T1图的遍历(dfs)
  9. android获取该控件在屏幕,android获取屏幕宽高与获取控件宽高(三种方法)
  10. 常用的linux连接工具
  11. iOS面试题大全2021(附答案)
  12. 8类网线利弊_八类网线你用过吗?与六类、七类等网线有啥区别?
  13. 架构初探 · 快男kafka
  14. 0ops CTF/0CTF writeup
  15. 医院预约挂号mysql_医院预约挂号系统代码 mysql+myeclipse
  16. 医疗险十大常见误区,你中了几个?
  17. fastposter v2.7.0 发布 电商海报编辑器
  18. AIOC快速卸载3dsmax2014
  19. 制作单词记录App(三)
  20. 32位乘法器和除法器

热门文章

  1. 通过Lazada成功打造自主女包品牌,这2个大学生是怎么做到的?
  2. lazada选品怎么做,东南亚母婴玩具类目选品分析
  3. 解读.net垃圾回收和CLR 4.0对垃圾回收所做的改进之一-.Net编程教程
  4. 什么样的鼠标对程序员最有用,超级提高开发效率
  5. Chapter 5 Blood Type——11
  6. js弹出对话框的方法总结
  7. 【Java Web】Myeclipse下运用maven管理项目jar包
  8. - (NSString *)description
  9. HDU 1426 Sudoku Killer
  10. 单行文字不断向上滚动特效