ES6学习笔记

虚树磷火
• 阅读 1754

http://es6.ruanyifeng.com/?se...

一、作用域

let

//i作用域在全局,每次循环i都被重新赋值了而覆盖了之前的值
var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 10

//for循环还有一个特别之处,就是循环语句部分是一个父作用域,
//而循环体内部是一个单独的子作用域
//所以循环体内的i每次的作用域都不一样而互不影响
var a = [];
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 6

const

const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了

二、解构

数组解构

1.如果解构不成功,变量值===undefined

let [a, b, c] = [1, 2, 3]; //模式匹配

2.默认值
注意,ES6 内部使用严格相等运算符(===),判断一个位置是否有值。所以,如果一个数组成员不严格等于undefined,默认值是不会生效的

let [foo = true] = [];
foo // true

let [x, y = 'b'] = ['a']; // x='a', y='b'
let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'

let [x = 1] = [undefined];
x // 1

let [x = 1] = [null];
x // null 因为null不严格等于undefined

对象解构

对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。

let { bar, foo } = { foo: "aaa", bar: "bbb" };
foo // "aaa"
bar // "bbb"

let { baz } = { foo: "aaa", bar: "bbb" };
baz // undefined

var { foo: baz } = { foo: 'aaa', bar: 'bbb' };
baz // "aaa"

三、字符串模板

1.普通模板${}反斜杠设置和识别,大括号内部可以放入任意的JavaScript表达式,可以进行运算,以及引用对象属性,会保留空格和换行,可嵌套使用

   $('#result').append(`
      There are <b>${basket.count}</b> items
       in your basket, <em>${basket.onSale}</em>
      are on sale!
    `);

2.标签模板的一个重要应用就是过滤HTML字符串,防止用户输入恶意内容。

带标签的字符串模板

tag标签实际是一个处理字符串模板的一个函数,会依次接收到多个参数,string表示普通字符串,values表示字符串模板(...表示可以匹配多个值)

tag函数所有参数的实际值如下:
第一个参数:['今天 ', ' 昨天 ', '']
第二个参数: '11'
第三个参数:'22'

let dessert = '11',
    drink = '22';

let breakfast = tag`今天 \n ${dessert} 昨天 ${drink} !`;

function tag(strings, ...values) {
  // console.log(strings)
  // console.log(values)
  let result = ''
  for (var i = 0; i < values.length; i++) {
    result += strings[i]
    result += values[i]
  }

  return result
}
console.log(breakfast) //今天 11 昨天 22

函数

默认参数

function breakfast (yesterday = '11', today = '22') {
  return `${yesterday} ${today}`
}
console.log(breakfast() //11 22
console.log(breakfast('33','44')) //33 44

展开操作符 ...

let fruits = ['apple', 'banana'],
    foods = ['cake', ...fruits];

console.log(fruits)  //['apple', 'banana']
console.log(...fruits) //apple banana 把数组里面的内容展开
console.log(foods) //['cake', apple', 'banana']

剩余操作符 Rest相当于...

function breakfast(apple, banana, ...foods) {
  console.log(apple, drink, ...foods)
}
breakfast('apple', 'banana', 'orange', 'cake') //apple banana orange cake

解构参数

function breakfast(apple, banana, {location, restaurant} = {}) {
  console.log(apple, banana, location, restaurant)
}
breakfast('apple', 'banana', {location: 'shenzhen', restaurant: 'lucha'}) //apple banana shenzhen lucha

函数名字 name

superBreakfast(函数声明)优先级高于breakfast(变量)

let breakfast = function superBreakfast (argument){

}
console.log(breakfast.name) //superBreakfast

箭头函数 箭头函数

let breakfast = (dessert, drink) => { //es6
  return dessert + drink;
};

var breakfast = function breakfast(dessert) { //es5
  return dessert + drink;
}

function foo() {
  setTimeout(function () {
    console.log(this === window);
  }, 100);
}

foo()//true

//1.this
//setTimeout的参数是一个箭头函数,这个箭头函数的定义生效是在foo函数生成时,
//而它的真正执行要等到100毫秒后,箭头函数导致this总是指向函数定义生效时所在的
//对象,这里的this===undefined
function foo() {
  setTimeout(() =>{
    console.log(this === window);
  }, 100);
}
foo() //false


this的动态切换虽然为js创造了巨大的灵活性,也使编程变得困难和模糊。利用call、apply、bind这三个方法,可以改变this的指向,使它指向我们期望的对象

call、apply、bind原理

call()和apply() 原理

他们的作用是可以改变其this的指向,调用方式略有不同

bind() 原理

该方法会创建一个新函数,当这个新函数被调用时,bind()第一个参数将作为它运行时的this,之后的序列参数将会在传递的实参数前传入作为它的参数,返回由指定的this值和初始化参数改造的原函数拷贝

this.x = 9;
var module = {
  x: 81,
  getX: function() {
    return this.x;
  }
}

module.getX() //81

var retrieveX = module.getX
retrieveX() //9

var boundGetX = retrieveX.bind(module);
boundGetX() //81

对象

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Karen110 Karen110
4年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
PPDB:今晚老齐直播
【今晚老齐直播】今晚(本周三晚)20:0021:00小白开始“用”飞桨(https://www.oschina.net/action/visit/ad?id1185)由PPDE(飞桨(https://www.oschina.net/action/visit/ad?id1185)开发者专家计划)成员老齐,为深度学习小白指点迷津。
Stella981 Stella981
3年前
AndroidStudio封装SDK的那些事
<divclass"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,2.55,5z"id"raphael
Wesley13 Wesley13
3年前
ES6学习笔记(3)
参考书《ECMAScript6入门》http://es6.ruanyifeng.com/字符串的扩展ES6之前只能识别\\u0000\\uFFFF之间的字符,超过此范围,识别会出错;ES6弥补了这个错误ES6扩展的新方法codePointAt"𠮷".CodePointAt(0)//返回超过\\u00
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
3年前
35岁是技术人的天花板吗?
35岁是技术人的天花板吗?我非常不认同“35岁现象”,人类没有那么脆弱,人类的智力不会说是35岁之后就停止发展,更不是说35岁之后就没有机会了。马云35岁还在教书,任正非35岁还在工厂上班。为什么技术人员到35岁就应该退役了呢?所以35岁根本就不是一个问题,我今年已经37岁了,我发现我才刚刚找到自己的节奏,刚刚上路。
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这