这是我参与「第四届青训营 」笔记创作活动的的第16天
ES5-ES2022历代新特性
前言
ES5发布于2009,ES6于2015,从2015开始使用年份命名,ES6 即是 ECMAScript 2015,目前绝大部分浏览器都已经支持ES6了,除了IE。
本人统计了一下从ES5开始支持的一些JS新语法新特性,并汇总整理一下。
ES5中的新增方法
ES5 中给我们新增了一些方法,可以很方便的操作数组或者字符串,这些方法主要包括:
- 数组方法
- 字符串方法
- 对象方法
- 函数方法
数组方法
迭代器(遍历)方法
Array.prototype.forEach(function(currentValue, index, arr))
- currentValue:数组当前项的值
- index:数组当前项的索引
- arr:数组对象本身
Array.prototype.filter(function(currentValue, index, arr))
filter()方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素,用return返回。主要用于筛选数组- 注意它直接返回一个新数组
- currentValue: 数组当前项的值
- index:数组当前项的索引
- arr:数组对象本身
Array.prototype.some(function(currentValue, index, arr))
some()方法用于检测数组中的元素是否满足指定条件. 通俗点讲,就是查找数组中是否有满足条件的元素- 注意它返回值是布尔值, 如果查找到这个元素, 就返回true , 如果查找不到就返回false.
- 如果找到第一个满足条件的元素, 则终止循环. 不在继续查找.
- currentValue: 数组当前项的值
- index:数组当前项的索引
- arr:数组对象本身
Array.prototype.every(function(currentValue, index, arr))
every()方法是将数组中每一个元素传入到一个函数中, 该函数返回true / false.- 如果函数中每一个元素都返回true, 那么结果为true, 有一个为false, 那么结果为false
forEach和some区别
forEach(filter)遇到return true后不会终止迭代,some遇到return后会直接终止迭代,效率更高
some和every区别
some()方法一旦有一次函数返回了true, 那么迭代就会结束. 并且结果为true;every()方法返回值全真才真,一假即假
Array.prototype.map(function(currentValue, index, arr))
- 遍历数组返回一个
新数组 - 新数组的每个元素为函数加工后的值
Array.prototype.reduce(callback[, initialValue])
- callback(一个在数组中每一项上调用的函数,接受四个函数:)
- previousValue(上一次调用回调函数时的返回值,或者初始值)
- currentValue(当前正在处理的数组元素)
- currentIndex(当前正在处理的数组元素下标)
- array(调用reduce()方法的数组)
- initialValue(可选的初始值。作为第一次调用回调函数时传给previousValue的值)
Array.prototype.reduceRight()
- 同上,只是从最后一个数据开始计算
其他常用方法
Array.isArray(arr)
Array.isArray(arr) // 检查arr是否为数组类型
- 参数为任意类型
- 返回值为布尔类型。若参数为数组类型,返回为true;反之,则为false
Array.prototype.indexOf(searchElement, fromIndex?)
- 查找指定元素是否存在,如果存在,返回下标,如果不存在返回-1;
- searchElement:待查询元素
- fromIndex:可选,查找的起始坐标
Array.prototype.lastIndexOf(value)
- 同上,只是从最后开始检索
字符串方法
String.prototype.trim()
trim() // 方法会从一个字符串的两端删除空白字符。
trim() 方法并不影响原字符串本身,它返回的是一个新的字符串。
对象方法
Object.keys(obj)
Object.keys(obj) // 用于获取对象obj自身所有的属性。
- 效果类似 for…in
- 返回一个由属性名组成的数组
Object.defineProperty(obj, prop, descriptor)
Object.defineProperty() // 定义对象中新属性或修改原有的属性(**响应式数据的基本布局**)
- obj:必需。目标对象
- prop:必需。需定义或修改的属性的名字
- descriptor:必需。目标属性所拥有的特性
Object.defineProperty() 第三个参数 descriptor 说明: 以对象形式 { } 书写
- value: 设置属性的值 默认为undefined
- writable: 值是否可以重写。true | false 默认为false
- enumerable: 目标属性是否可以被枚举。true | false 默认为 false
- configurable: 目标属性是否可以被删除或是否可以再次修改第三个参数里面的特性 true | false 默认为false
注意:
-
在使用Object.defineProperty、Object.defineProperties 或 Object.create 函数的情况下添加数据属性,writable、enumerable和configurable默认值为false。
-
使用对象直接量创建的属性,writable、enumerable和configurable特性默认为true。
-
思考一下,为什么Object的一些方法不放在原型链上,而是存在于Object构造函数中?因为你可以通过给object实例对象添加一个keys之类的属性,这样会覆盖原型链上的同名方法。
函数方法
Function.prototype.call()
fun.call(thisArg, arg1, arg2, ...)
- thisArg:在 fun 函数运行时指定的 this 值
- arg1,arg2:传递的其他参数
- 返回值就是函数的返回值,因为它就是调用函数
- 因此当我们想改变 this 指向,同时想调用这个函数的时候,可以使用 call,比如继承
Function.prototype.apply()
fun.apply(thisArg, [argsArray])
- thisArg:在fun函数运行时指定的 this 值
- argsArray:传递的值,必须包含在数组里面
- 返回值就是函数的返回值,因为它就是调用函数
- 因此 apply 主要跟数组有关系,比如使用 Math.max() 求数组的最大值
Function.prototype.bind()
fun.bind(thisArg, arg1, arg2, ...)
- bind() 方法不会调用函数。但是能改变函数内部this 指向
- thisArg:在 fun 函数运行时指定的 this 值
- arg1,arg2:传递的其他参数
- 返回由指定的 this 值和初始化参数改造的原函数拷贝
- 因此当我们只是想改变 this 指向,并且不想调用这个函数的时候,可以使用 bind
严格模式
this指向问题:
- 以前在全局作用域函数中的 this 指向 window 对象。
- 严格模式下全局作用域中函数中的 this 是 undefined。
- 以前构造函数时不加 new也可以 调用,当普通函数,this 指向全局对象
- 严格模式下,如果 构造函数不加new调用, this 指向的是undefined 如果给他赋值则 会报错
- new 实例化的构造函数指向创建的对象实例。
- 定时器 this 还是指向 window 。
- 事件、对象还是指向调用者。
函数变化:
- 函数不能有重名的参数。
- 函数必须声明在顶层.新版本的 JavaScript 会引入“块级作用域”( ES6 中已引入)。为了与新版本接轨,不允许在非函数的代码块内声明函数。