在说es6之前,先说说es5的一些东西,因为我的web是跟着尚硅谷学习的,这个博客完全就是记录我自己学的东西,所以想学web也可去看看尚硅谷的视频。
1.ES5
(1)严格模式
使用:如果要使用严格模式,首先要在js全局函数的第一行写上 "use strict";
作用:首先是规范js的书写,减少代码的怪异行为,其次是为了未来js版本做铺垫。
语法改变:所有变量必须要用var声明
禁止自定义的函数的this指向window
创建eval作用域
对象中不能有重名的属性
<script type="text/javascript">
"use strict"
var a = 5;//严格模式,必须用var声明变量
function fun() {
console.log(this);
console.log(this.a);
}
fun();//因为没有对象调用该方法,所以调用的对象为window,但是在严格模式会报错。因为普通函数的this为调用者。
eval('var i = 233; alert(i)');//eval函数可以计算或者执行一段字符串中的js代码
alert(i); // ,但是这样其实是很危险的,所以严格模式下,eval有单独的作用域
var obj = {
a:"1",
a:"2"
} //严格模式不可重名,虽然控制台不会报错
</script>
(2)JSON对象
json,是一种数据交换语言,比如我前台要用ajax向后台请求数据,后台给前台的就是一段json
json对象,可以是字符串和数组,没有单纯的json字符串一说。
'{"name":"12","age":12}'
'[{"name":1},{"age":"1"}]'
这两种都是json对象,好像最外边必须是单引号
json方法:JSON.stringify() //将js对象转换为json对象(数组)
JSON.parse() //将json对象转换为(数组)
(3)Object扩展方法
es5给Object扩展的两个方法
1.Object.create(目标方法,扩展)//此方法是用来以一个对象为原型,创建一个新的方法的。
var obj = {
name:"小明",
age:15
}
var obj2 = Object.create(obj,{
aihao:{
value:"打篮球",
writable:true,
configurable:true,
enumerable:true,
}
})
//Objcet.create()的两个参数分别是一个对象,一个描述,第二个参数是可选的。
//这个方法的返回值将是一个以第一个对象为原型的新的对象,即 obj2.__proto__ == obj
//而第二个参数则是可以给新对象一个描述,第二个参数其实也是 Object.defineproperties()的第二个参数
/*{
aihao:{ //属性名
value:"打篮球", //属性值,即value的值
writable:true, //该属性是否可以被修改,默认为false
configurable:true, //该属性是否可以被删除,默认为false
enumerable:true, //该属性是否可以被枚举(for in),默认为false
}
}*/
2.Object.defineProperties(对象,描述)//直接在一个对象上定义新的属性或修改现有属性,并返回该对象。
var shen = 130
Object.defineProperties(obj,{ //第二个参数
shengao:{ //首先是要扩展的属性名
get:function () { //这个get方法,该方法的返回值就是这个属性的值
// ,该方法将在调用到该属性时自动调用
return shen;
},
set:function (data) { //这是set方法,在设置该属性值的时候,将调用,设置的值,将作为参数data传入该放方法
shen = data //再进行设置
}
},
})
//普通的对象也有这两个方法
var obj3 = {
name:"xiaoming",
age:15,
get shengao(){
return shen
},
set shengao(data){
shen = data
}
}
(4)数组的扩展方法
数组的扩展方法比较简单
Array.prototype.indexOf(value)//返回数组中value所在的第一个位置的下标
Array.prototype.lastIndexOf(value)//返回数组中value所在的最后一个位置的下标
Array.prototype.forEach(function(item,index){})//遍历数组 item:值 index:下标
Array.prototype.map(function(item,index){})//加工数组中的每一项值,并且返回一个新数组
Array.prototype.indexOf(function(item,index){})//遍历数组中的每一个数据,并且返回判断条件为true的值
var arr1 = [1,2,3,4,5,6,5,4,3,2,1];
console.log(arr1.indexOf(2));
console.log(arr1.lastIndexOf(2));
arr1.forEach(function (item,index) {
console.info(item,index);
})
var arr = arr1.map(function (item,index) {
if(item<5){
return item+"我小于5"
}else{
return item
}
})
console.log(arr);
arr = arr1.filter(function (item,index) {
return item>5
})
console.log(arr);
map与filter的区别在于map总是会返回数据,没有规定返回内容的话,返回的是undefined
(5)call apply与bind的区别
首先,call apply bind都是将函数的this绑定为这些方法中的参数
用处,bind主要用在回调函数中,因为回调函数不需要立即执行,而用call或者apply的话,就会立即执行,违背了回调函数的本质
var obj = {
name:"a"
}
function fun(age) {
this.age = age;
console.log(this.name,this.age);
}
fun.call(obj,"1");//a 1
fun.apply(obj,["2"]);//a 2
var f = fun.bind(obj,"3");
f();//a 3
call 与 apply的区别仅仅在于填写参数的方式不同,call(目标对象,方法参数1,方法参数2,,,),apply(目标对象,[方法参数1,方法参数2]),这两个方法绑定完this之后会立即执行调用他们的函数
而bind绑定完this之后,会把函数返回,而不会执行。bind传入参数的方法和call一样