ES5新特性:
1.object
所有对象操作中,如果o不是object类型,将会抛出TypeError异常
Object.getPrototypeOf(o)(获取给对象的prototype对象)
Object.getOwnPropertyDescriptor(o,p)获取对象描述
Object.getOwnPropertyNames(o)获取自有属性名列表
Object.create(o,p)以给丁对象o为prototype创建新对象并返回
Object.defineProperty(o,p,attrs)根据规则attars定义对象o上,属性名为p的属性
Object.defineProperties(o,props)根据对象描述props来定义对象o,通常props包含多个属性定义
2.Array
Array.isArray(a)判断a是否为真正的Array
Array.prototype.indexOf(e,i)使用严格等来判断元素e在数组中的索引号。一个可选的搜索起点i
Array.prototype.lastIndexOf(e,i)获取数组元素e在数组最后出现的位置
Array.prototype.every(t,c)测试数组中的每个元素都满足测试t。
Array.prototype.some(t,c)测试数组中是否有元素满足测试t
Array.prototype.forEach(f,c)使用函数f遍历每个数组元素
Array.prototype.map(f,c)使用函数f修改每个数组的每个元素,并返回数组
Array.prototype.filter(f,c)收集通过测试f的数组元素
Array.prototype.reduce(r,v)从左向右,使用函数r聚集数组的每个元素。
3.String
String.prototype.trim去掉字符串两头的空白符和换行符
4.function
Function.prototype.bind(thisTarget,arg1,...argn)
为了指定当前函数的上下文对象和运行参数,该函数创建一个新的函数,保留给定的this对象和运行参数
5.JSON
JSON.parse(text)
JSON.stringify(obj)将指定的对象obj序列化为JSON文本
6.Date
Date.now
Date.prototype.tolSOString
根据ISO8601生成时间字符串
ES6特性:
迭代器和for-of循环:
#for-of循环
1这是最简洁、直接的遍历数组元素语法
2这个方法避开了for-in循环的所有缺陷
3与forEach()不同的是,其可以正确的响应break、continue和return
for-in循环用来遍历对象属性
for-of循环用来遍历数据
for(var value of myArray){
console.log(value);
}
#迭代器对象
for-of循环首先调用集合的Symbol.iterator方法,紧接着返回一个新的迭代器的对象。迭代器对象可以是任意具有.next()方法的对象;for-of循环将重复调用这个方法,每次循环调用一次。
var zeroesForeverIterator={
[Symbol.iterator]:function(){
return this;
},
next:function(){
return{done:false,value:0};
}
};
#生成器(Generators)
生成器就是迭代器
通过实现Symbol.iterator和.next()两个方法就可以创建自定义迭代器
生成器函数与普通函数的最大区别是,生成器函数可以自暂停
function* quips(name){
yield"hello" + name+"!";
if(name.startsWith("X")){
yield"你的名字"+name+"首字母是x很酷!";
}
}
#模板占位符
var meeage=
SaferHTML'<p>${bonk.sender}向你示好</p>';
var message=
SaferHTML(templateDate,bonk.sender);
#默认参数和不定参数
不定参数
(方法就可以接受任意数量的字符串参 不定参数)
containsAll("banana","b","nan")返回true
默认参数
函数调用者不需要传递所有可能存在的参数,没有被传递的参数可由感知到的默认参数进行填充
#迭代器的解构
var[var1,var2...]=array;
var[head,....tail]=[1,2,3,4]
数组解构赋值的模式同样适用于任意的迭代器
#箭头函数:(箭头函数的没有自己的this值,该值继承自外围作用域)
//ES5
var selected=allJobs.filter(function (job){
return job.isSlected();
});
//ES6
var selected=allJobs.filter(job=>job.isSelected());
#Symbols(弱封装机制,当前作用域有效)
symbol不能自动转换为字符串,这和语言中其他类型不同。尝试拼接字符串和symbol会得到
TypeError错误。
获取symbol的方法:
1.调用symbol 2.调用Symbol.for(String)(共享型的) 3.使用标准定义的symbol
(Symbol.iterator)
var mySymbol=Symbol();
var isMoving=Symbol("isMoving");
if(element[isMoving]){
smoothAnimations(element);
}
element[isMoving]=true;
#集合(键值集合:Set Map WeakSet WeakMap)
set是一群值的集合:1.(和数组的不同,set不会包含相同的元素)
map一个Map对象是由若干键值对组成:
(WeakSet的值和WeakMap的键必须是对象)
#代理Proxies
代理Proxy(接收两个参数)目标对象(target)句柄对象(handler)
代理句柄(句柄对象)
句柄对象的方法可以覆写任意代理的内部方法
var target={},handler={};
var proxy=new Proxy(target,handler);
类class
obj.prop=method的新方法 (computed)预计算属性
let和const
let具有更好的作用域原则
1.let声明的变量拥有块级作用域
2.let声明仍然保留了提升的特性,但不会盲目提升。
3.let声明的全局变量不是全局对象的属性
4.形如for(let x..)的循环在每次迭代时都为X创建新的绑定(适用于for-of/for-in/c循环)
5.let声明的变量直到控制流到达该变量定义的代码时才会被装载,所以在到达之前使用该变量
会触发该函数。
6.用let重定义变量会抛出一个语法错误(SyntaxError)
const const声明的变量只可以在声明时赋值,不可以随便修改,否则会导致SyntaxError语法
错误
#子类Subclassing
javascript继承:
解决静态属性Static
super属性:
#模块Modules
export{detectCats,kittydar};
import{detectcats}from “kittydar.js”;