ES5
严格模式:'use strict'
1、定义变量必须加var或let //let 定义变量必须赋值 var定义变量不赋值为undefined
2、禁止自定义的函数中的this指向window
3、创建eval作用域
4、对象不能有重名的属性
json对象:
JSON.stringify()将js对象(数组 对象)转为json字符串对象
JSON.parse()将json字符串对象转为js对象(数组 对象)
Object对象扩展:
var obj={
name:'aa11'
}
var obj1=Object.create(obj,{
age:{
value:13,
writable:true,//是否允许修改属性的值
configurable:true//是否允许删除属性
}
})
var obj2=Object.defineProperties(obj,{
sex:{
get:function(){
return this.value
},
set:function(dd){
this.value=dd
}
}
})
数组扩展:
var arr1=[1,2,3,4,5,6]
var arr2=arr1.map((item) => {
return item+1
})
var arr3=arr2.filter((item) => {
return item%2==0//返回值为true
})
arr3.forEach((item,index) => {
console.log(item,index)
})
call apply bind区别
var obj={name:'howhy'}
function foo(data){console.log(this,data)}//结果window
foo.call(obj,3)//结果obj对象{name:'howhy'} 3
foo.apply(obj,[3])//结果obj对象{name:'howhy'} 3//传数组
var bind_foo=foo.bind(obj,23)
bind_foo() //结果obj对象{name:'howhy'} 23
setTimeout(function(){console.log(this}.bind(obj),1000) //结果obj对象{name:'howhy'}
ES6
1、let var const
let obj={name:"aaa",age:12}
let {name,age}=obj //name: aaa age :12
let [,,a,b]=[12,23,5,6] //a 5 b 6
function(obj){console.log(obj.name,obj,age)}相当于function({name,age}){console.log(name,age)}
let name='aaaa'
let ss=`my name is ${name}` // my name is aaaa
let username="howhy"
let age=12
let obj={
username,
age,
getUsername(){
return this.username;
}
}
console.log(obj)//{username:"howhy",age:12}
传统函数this是调用时决定的 哪个对象调用 this就是这个调用的对象
箭头函数没有this不是调用时决定的 而是定义时所处的对象就是this(箭头函数的this看外层是否有函数,如果有,外层函数的this就是箭头函数的this 如果没有则this是window)
let fun=(...arg) => {
console.log("fun "+arg)
}
let arr=[1,3,4,5]
let arr1=[0,...arr,6]
fun(arr)//fun 1 3 4 5
console.log(arr1) //0 1 3 4 5 6
let promise=new Promise((resolve,reject)=>{
setTimeout(() => {
console.log(2222);//异步任务
resolve('ok');//异步任务成功 'ok'
reject()//异步任务失败
},1000)
})
promise.then((data) => {//成功回调 data是ok
console.log(data,'exec success')
},() => {//失败回调
console.log('error')
})
iterator//array string map arguments map set
function MyIterator(arg){
let index=0;
return {
next:function(){
if(index<arg.length){
return {value:arg[index++],done:true}
}
}
}
}
let myiter=MyIterator(arr1)
console.log(myiter.next())
console.log(myiter.next())
console.log(myiter.next())
console.log(myiter.next())
console.log(myiter.next())
let arr1=[1,2,3,4]
for(let v of arr1){
console.log(v)
}
let ss="aaaaaccc"
for(let s of ss){
console.log(s)
}
class Person{
constructor(name,age){
this.name=name,
this.age=age
}
getName(){
console.log(this.name)
}
}
let person=new Person("aaa",23)
person.getName()
class Man extends Person{
constructor(name,age){
super(name,age)
this.gender='man'
}
}
let man=new Man('aabb',23)
man.getName()
console.log(man)
Array.from(v)//将伪数组(arguments document.getElememtsByTagName('inpu'))转为可以forEach