微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

前端ES6 简单特性学习记录

变量定义的新方式: letconst

let 特性:

  1. 不允许重复声明

  2. 没有变量提升(预解析)

  3. 块级作用域(一对 {} 包括的区域称为一个代码块, let 声明的变量只在该代码块起作用)

例子1 :简单的打印数据

使用 var:

这里还是要推荐下小编的web前端学习 群 : 569146385,不管你是小白还是大牛,小编我都欢迎,不定期分享干货,包括 小编自己整理的一份最新的web前端资料和0基础入门教程,欢迎初学和进 阶中的小伙伴。在不忙的时间我会给大家解惑。
  1. for(var i = 0; i<10 ; i++ ){

  2.    setTimeout(()=>console.log(i)) // 执行10次,全都打印 10

  3. }

使用 let:


 
  1. for(let i = 0; i<10 ; i++ ){

  2.    setTimeout(()=>console.log(i)) // 执行10次,打印 0 - 9

  3. }

之前我们要实现这样的打印,必须使用闭包:


 
  1. for(var i = 0; i<10;i++){

  2.    (function(j){

  3.        setTimeout(()=>console.log(j)) // 执行10次,打印 0 - 9

  4.    })(i)

  5. }

例子二:在网页中常常会有切换 tab ,展示对应的信息的需求,我们使用 var 来处理时,常常使用的自定义属性,来保存点击的索引。 btns[i].index=i。用于找到对应的元素。:

html模板:


 
  1. <style type="text/css">

  2.    div{display:none}

  3.    .show{display:block;}

  4.    .active{background:red;}

  5. </style>

  6. <button class="active">1</button>

  7. <button>2</button>

  8. <button>3</button>

  9. <div class="show">11111</div>

  10. <div >22223</div>

  11. <div >33333</div>

js:


 
  1. var btns = document.querySelectorAll('button')

  2. var divs = document.querySelectorAll('div')

  3. for (var i=0 ;i<btns.length;i++){

  4.    btns[i].index=i

  5.    btns[i].onclick=function(){

  6.        for(var j=0 ;j<btns.length;j++){

  7.            btns[j].className=''

  8.            divs[j].className=''

  9.        }

  10.        this.className='active'

  11.        divs[this.index].className='show'

  12.    }

  13. }

使用 let


 
  1. var btns = document.querySelectorAll('button')

  2. var divs = document.querySelectorAll('div')

  3. for (let i=0 ;i<btns.length;i++){

  4.    /*可以看到这里少了保存的索引的操作*/

  5.    btns[i].onclick=function(){

  6.        for(let j=0 ;j<btns.length;j++){

  7.            btns[j].className=''

  8.            divs[j].className=''

  9.        }

  10.        this.className='active'

  11.        divs[i].className='show'

  12.    }

  13. }

const 除了具备上述 let 的特性外,还有自己的一个特性:定义之后的值,是固定不变不能被修改

值得注意的是下面这两种情况是不会报错的:


 
  1. {

  2.    const a = {value:1}

  3.    a.value = 2

  4.    console.log(a) // {value:2}

  5.  

  6.    const b = [1,2,3]

  7.    b.push(4)

  8.    console.log(b) // [1,2,3,4]

  9. }

解构赋值

ES6 允许按照一定的模式,从数组和对象中提取值,这样就称为解构

数组:按照对应的顺序解构


 
  1. {

  2.    var arr = [[1,2,3],[4,5,6],[7,8,9]]

  3.    var [a,b,c] = arr

  4.    // a : [1,2,3]

  5.    // b : [4,5,6]

  6.    // c : [7,8,9]

  7.    // 用法1

  8.    var x = 1;

  9.    var y = 2;

  10.    [y,x] = [x,y]

  11.    console.log(x,y) // 2 1

  12. }

对象按照对应的名称一一对应进行解析:


 
  1. {

  2.    var obj={

  3.        get:function(){

  4.            return 'get'

  5.        },

  6.        value:1,

  7.        data:[1,2,3],

  8.        str:'string'

  9.    }

  10.    var {str,get,data} = obj

  11.    console.log(str) // string

  12.    console.log(get()) //get

  13.    console.log(data) // [1,2,3]

  14. }

模板字符串

模板字符串 是增强版的字符串,使用反引号(```)作为标识 。可以当做普通字符串使用,也可以用来定义多行字符串(会保留换行)。或者在字符串中嵌入变量。

在模板字符串,需要引用变量使用 ${变量名} 的形式。在 {}可以进行运算,也可以引用对象属性


 
  1. {

  2.    var name = 'xiaoming'

  3.    var age = 19

  4.    var str = `my name is ${name} ,my age is ${age}`

  5.    console.log(str) //"my name is xiaoming ,my age is 19"

  6. }

扩展

Array.from(arrayLike[,mapFn[,thisArg]])

  • arrayLike : 想要转换成真实数组的类数组对象或可遍历对象。

  • mapFn : 可选参数,如果指定了该参数,则最后生成的数组会经过该函数的加工处理后再返回。

  • thisArg : 可选参数,执行 mapFn 函数时 this 的值。方法用于将两类对象转为真正的数组:类似数组的对象和可遍历的对象(包括 ES6 新增的数据结构 Set 和 Map )


 
  1. {

  2.    // NodeList对象

  3.    let ps = document.querySelectorAll('p');

  4.    Array.from(ps);

  5.    // 将可迭代对象(Set 对象)转换成数组

  6.    Array.from(new Set(["foo", window]));       // ["foo", window]

  7.    // 使用 map 函数转换数组元素

  8.    Array.from([1, 2, 3], x => x + x);      // [2, 4, 6]

  9.    // 将类数组对象(arguments)转换成数组

  10.    (function () {

  11.        var args = Array.from(arguments);

  12.        return args;

  13.    })(1, 2, 3);                            // [1, 2, 3]

  14. }

在这之前,我们要转类数组对象,只能用这样的形式: [].slice.call(ps)

当然或许你根本不需要转,因为我们有 forof 了,只要有遍历接口的类型,它就可以进行遍历 ( Set, String, Array, NodeList等等)


 
  1. {    

  2.    // NodeList对象

  3.    let ps = document.querySelectorAll('p');

  4.    for (let v of ps){

  5.        console.log(v)

  6.    }

  7.    //当然你可能同样需要下标: `arr.keys()`,`arr.values()`,`arr.entries()`

  8.    for (let [i,item] of ps.entries()){

  9.        console.log(i,item)

  10.    }

  11. }

object.assign():拷贝源对象自身的可枚举的属性到目标对象身上


 
  1. {

  2.    var obj = { a: 1 };

  3.    var copy = Object.assign({}, obj);

  4.    console.log(copy); // { a: 1 }

  5. }

值得注意的是, object.assign()执行的是浅拷贝。假如源对象的属性值是一个指向对象的引用,它也只拷贝那个引用值。


 
  1. {

  2.    let a = { b: {c:4} , d: { e: {f:1}} }

  3.    let g = Object.assign({},a)

  4.    g.d.e = 32 // 设置 g.d.e 为 32

  5.    console.log(g) // {"b":{"c":4},"d":{"e":32}}

  6.    console.log(a) // {"b":{"c":4},"d":{"e":32}}

  7. }

如果你需要的不是合并,而只是普通 json对象的复制,建议使用 JSON.parse(JSON.stringify(a)),这样不会有上面的副作用产生。

函数参数认值。定义认值得参数必须是尾参数,因为函数形参定义认值后该参数可以被忽略


 
  1. {

  2.    function fn(a,b=2){

  3.        return {a,b}

  4.    }

  5.    console.info(fn(1)) //{a: 1, b: 2}

  6. }

rest参数:用于获取获取函数的多余参数。与参数认值一样,必须为尾参数


 
  1. {

  2.    function foo(a,b,...args){

  3.        console.info(args)

  4.    }

  5.    foo(1,2,3,4,5,6) // [3, 4, 5, 6]

  6. }

扩展运算符 ...:它好比 rest 参数的逆运算。可以将一个数组转为用逗号分隔的参数序列。


 
  1. {

  2.    // 更好的 apply 方法,例如我们在算最大值的时候:

  3.    var arr = [1,2,3,4,5]

  4.    console.info(Math.max.apply(null,arr))

  5.    console.info(Math.max(...arr)) // 使用扩展运算符

  6.    console.info(Math.max(1,2,3,4,5)) // 最终都会被解析成这样

  7.  

  8.    // 当然还能这样用

  9.    var str = 'string'

  10.    var arr = [...str,4,5] // ["s", "t", "r", "i", "n", "g", 4, 5]

  11.  

  12. }

箭头函数 ArrowFunctions:箭头函数并不是用来替代现有函数而出现的,并且也无法替代。它是用来作为回调函数使用的,主要是为了简化回调函数的写法。 主要有三个特性:

  1. 箭头函数自身没有 this 。函数内的 this 指向箭头函数 定义时所在的对象 ,而不是使用时所在的对象。

  2. 箭头函数内部,不存在 arguments 对象

  3. 不可以当作构造函数,不可以使用 new 指令。

简单用法,简化回调:


 
  1. {

  2.    // 我们都知道数组的 sort 并不是根据数值大小来排序的,需要排序时,要通过回调函数的形式来确定排序方式

  3.    var arr = [7,8,9,10]

  4.    arr.sort() // [10, 7, 8, 9]

  5.    arr.sort(function(a,b){return a-b}) // [7, 8, 9, 10]

  6.    arr.sort((a,b)=> a - b ) // 箭头函数简化。当仅有一条语句时,有一个隐式的 return

  7. }

没有 arguments


 
  1. {

  2.    var foo = (a,b,c)=>{

  3.        console.log(a,b,c)

  4.        console.log(arguments)

  5.    };

  6.    foo(1,2,3)

  7.    // 1 2 3

  8.    // Uncaught ReferenceError: arguments is not defined      

  9. }

不要在对象的方法中使用箭头函数


 
  1. {

  2.    window.name='window';

  3.    var obj = {

  4.        name:'obj',    

  5.        getName: function(){

  6.            console.log(this.name)

  7.        }

  8.    }

  9.    obj.getName() // obj

  10.    var getName = obj.getName

  11.    getName() // window, this 总是指向调用

  12.    //-----------------

  13.    var obj = {

  14.        name:'obj',    

  15.        getName: () =>{

  16.            console.log(this.name)

  17.        }

  18.    }

  19.    obj.getName() // window

  20.    /**

  21.        这里由于对象 a,并不能构成一个作用域。所以会再往上达到全局作用域,所以 this 指向 window..

  22.     */

  23. }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐