ES5/6/7

ES几个重要版本

  • ES5: 09年
  • ES6: 15年发布, 也称为ECMA2015
  • ES7: 16年发布, 也称为ECMA2016

ES5的几个概念

  • 严格模式

ES5有两种运行模式, 一种为正常模式(混杂模式), 另一种运行模式: 严格模式(strict mode), 这种模式使得JavaScript在更严格的语法条件下运行
1.目的: 消除js语法的一些不合理,不严谨之处,减少一些怪异行为,消除代码运行的一些不安全之处, 为代码的安全运行保驾护航, 为未来的新版本做好铺垫
2.使用: 在全局或函数的第一行定义"use strict"
3.作用: 必须使用var声明变量,
  禁止自定义函数的this只想window,
  创建eval作用域,
  对象不能有重名的属性

  • json方法
    1. JSON.stringify(obj/arr) js对象(数组)转换为json对象(数组)
    2. JSON.parse(json) json对象(数组)转换为js对象(数组)
var obj = {
    name: 'yuyin',
    age: 18
}
obj = JSON.stringify(obj)
console.log(typeof obj) //string
obj = JSON.parse(obj)
console.log(typeof obj) //object
  • Object扩展的方法, 常用的2个
    1. Object.create(prototype, {descriptors})
    作用: 一指定的对象为原型, 创建新的对象, 可以为新的对象添加新的属性, 并对属性进行描述
    - value: 指定的值
    - writable: 标识当前属性值是否是可修改的, 默认为false
    - configurable: 标识当前属性是否可以被删除, 默认为false
    - enumerable: 标识当前属性是否能用for in 枚举, 默认为false
    
var obj = {
   name: 'yuyin',
   age: 18
}
var newObj = Object.create(obj, {
   sex:{
       value: '男',
       writable: true,
       configurable: true,
       enumerable: true
   }
})
newObj.sex = '女'  //如果要修改属性, 必须配置writable: true
delete newObj.sex //如果要删除属性, 必须配置configurable: true
console.log(newObj) //newObj的原型上有obj的属性方法可以直接调用
for(var i in newObj){
   console.log(i) //for in 遍历原型上的属性方法, 配置enumerable: true 可以遍历添加的属性方法
}
   2. Object.defineProperties(object, descriptors)
 作用: 为指定对象定义扩展多个属性, 使用get拿到的值只能通过set修改
  - get: 用来获取当前属性值的回调函数
  - set: 修改当前属性值触发的回调函数, 实参就是修改的值
var obj = {
    fristName: 'yu',
    lastName: 'yin'
}
Object.defineProperties(obj, {
    fullName: {
        get: function () { //获取扩展属性的值自动调用
            console.log('get调用了')
            return this.fristName + ' ' + this.lastName
        },
        set: function (data) { //监听扩展属性值, 如果值改变会自动调用, 参数为修改的值
            console.log('set调用了')
            console.log(data)
            var names = data.split(' ')
            this.fristName = names[0]
            this.lastName = names[1]
        }
    }
})
// console.log(obj.fullName)
obj.fullName = 'ha ha'
console.log(obj.fullName)
  • 数组方法

    Array.prototype.indexOf(value) 值在数组中第一个下标的位置
    Array.prototype.lastIndexOf(value) 值在数组中最后一个下标的位置
    Array.prototype.forEach((item,index)=>{}) 遍历数组
    Array.prototype.map((item,index)=>{}) 遍历数组,返回新数组, 返回加工后的值
    Array.prototype.filter((item,index)=>{}) 遍历过滤数组, 返回新数组, 返回条件为true的值

    注意: map/filter方法都是返回新数组, 在考虑使用哪个方法时可以先考虑返回值

let arr = [1, 'a', 3, 6, 'c']
let newArr = arr.map((ele, index) => ele + 10)
let newArr1 = arr.filter((ele,index) => index > 3)
console.log(newArr,newArr1)
  • 函数绑定this指向
    call/apply 绑定this后, 函数立即执行, 不传参时使用方式一样, 传参apply必须是数组
var obj = {
    name: 'yuyin',
    age: 18
}
function foo(a, b) {
    console.log(this, a, b)
}
foo.call(obj, 18, 20) 
foo.apply(obj, [18, 20]) 

bind 绑定完this不会立即调用当前函数, 将函数返回, 传参与call一样, 通常在回调函数中使用

foo.bind(obj, 18, 20)()

ES6常用知识

变量声明

  • var

    变量声明提升, 可重复定义, 全局变量挂载到window上

  • let

    变量声明不会提升, 不可以重复定义, 不会挂载到window上, 加强了对作用域的控制配合{}使用产生块级作用域, 变量只能在{}中使用, 在for循环中使用可以解决闭包问题

console.log(a) //报错
 let a = 10;
 let a = 20; //报错
 a = 20;
console.log(window.a) //报错
if(true){
  let a = 10;
  console.log(a);  //10
}
console.log(a)  //报错
//解决闭包
var arr = [];
for(let i = 0; i < 10; i++){
  arr[i] = function (){
    console.log(i);
  }
}
arr[0]();  //0
arr[2](); //2
  • const
    跟let用法一样, 但它是声明常量的, 声明必须赋值,否则会报错, 并且赋值后不能再改变
    可以声明引用值数据类型, 比如对象/数组, 然后可以对对象或数组增删改
const a = 10;
const b; //报错
a = 20;  //报错
//声明引用值, 可以对值修改
const obj = {
     name: 'yuyin'
};
obj.name = 'aaa';
obj.age = 18
console.log(obj) //{name: "aaa", age: 18}

解构赋值

从对象或数组中提取数据, 并赋值给变量

let obj = {
    name: 'yuyin',
    age: 18,
    abc: 'abc'
}
 // var name = obj.name
let {name, age} = obj   //只写需要的属性

let arr = [1, 'a', 2, 'b', 3]
let [a, b, c, d, e] = arr
console.log(a, b, c, d, e) //1 "a" 2 "b" 3
let [aa,,,,bb] = arr
console.log(aa,bb) //1 3

// 函数参数使用
function foo(obj){
    console.log(obj.name,obj.age)
}
function foo1({name,age}){
    console.log(name,age)
}
foo(obj)
foo1(obj)

模板字符串(简化字符串的拼接)

  • 定义字符串必须用``包含
  • 变化的部分使用${xxx}
let obj = {
    name: 'yuyin',
    age: 18
}
let { name, age } = obj
// let str = '我的名字叫' + name + ',今年' + age + '岁'
let str = `我的名字叫${name},今年${age}岁`
console.log(str)

对象简写方式

  • 对象属性名于属性值的变量一样时可以只写属性名
  • 方法可以直接写方法名,省略function
let name = 'yuyin'
let age = 19
let obj = {
    name,
    age,
    // 方法简写
    getName(){
        console.log(this.name)
    }
}
console.log(obj)

箭头函数

多用来定义回调函数

  • 箭头函数的几种形式
// 没有形参
let fun = () => console.log('我是箭头函数')
fun()
// 只有一个形参, 可以省略()
let fun1 = a => console.log(a)
fun1(1)
// 两个及更多的参数
let fun2 = (x, y) => console.log(x, y)
fun2(1, 2)
// 函数体只有一条语句或者是表达式的时候{}可以省略,会自动返回语句执行的结果或者是表达式的结果
let fun3 = (x, y) => x + y
console.log(fun3(2, 3))
//加{}, 必须return结果
let fun4 = (x, y) => { return x + y }
console.log(fun4(2, 3))
// 函数体是多条语句,必须使用{}
let fun5 = (x, y) => {
    x += 1;
    y--;
    console.log(x - y)
    return x + y
}
fun5(10, 8)
  • 箭头函数特点
    没有自己的this, 箭头函数的this不是调用的时候决定的, 是在定义的时候处在的对象就是它的this
    其实就是看外层是否有函数, 如果有外层函数的this就是内部箭头函数的this, 如果没有this指向window
btn1.onclick = function () {
    console.log(this)//  btn1
}

btn2.onclick = () => {
    console.log(this)// window
}

let obj = {
    name: '箭头函数',
    getName() {
        btn3.onclick = () => {
            console.log(this) // obj
        }
    }
}
obj.getName()

let obj1 = {
    name: '箭头函数',
    getName: () => {
        btn4.onclick = () => {
            console.log(this) // window
        }
    }
}
obj1.getName()

运算符...(简化书写长度, 提升开发效率)

作用: spreed展开, rest收集功能, 可以从读和写两个角度考虑

  • 写:(收集,比如函数的参数), 解决参数不固定的问题,相当于arguments(类数组),但它是数组,可以直接使用数组的方法
function sum(...arg) {
    console.log(arg);  //[1, 2, 3]
    let sumNumber = 0;
    arg.forEach(function(ele){
        sumNumber += ele;
    })
    return sumNumber;
}
console.log(sum(1, 2, 3));

可以指定前面的参数, ...arg必须作为最后的参数

function test(a, b, ...arg) {
    console.log(a, b, arg); //1 2 [3, 4, 5]
}
test(1, 2, 3, 4, 5)
  • 读:(展开数组,es7可以展开对象) ,可以用于数组合并
let arr = [1, 2, 'a', 'b'];
console.log(...arr)  //1 2 "a" "b"
let arr2 = ['abc'];
let newArr = [...arr, ...arr2];
console.log(newArr); //[1, 2, "a", "b", "abc"]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容

  • ES5 1.ECMAScript理解 它是一种由ECMA组织(前身为欧洲计算机制造商协会)制定和发布的脚本语言规范...
    风中丶凌乱阅读 552评论 0 0
  • 一、ECMAScript 1、它是一种由ECMA组织(前身为欧洲计算机制造商协会)制定和发布的脚本语言规范2、我们...
    瘦不下去了阅读 839评论 0 1
  • ECMAScript 简介 它是一种由ECMA组织(前身为欧洲计算机制造商协会)制定和发布的脚本语言规范 而我们学...
    冬来Angus阅读 1,040评论 0 0
  • ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,European Computer Manu...
    fastwe阅读 1,232评论 0 2
  • ES5 的严格模式 use strict 严格语法的声明 声明变量必须使用var 禁止自定义的函数中的this指...
    陈_066c阅读 192评论 0 0