严格模式
'use strict'; //在全局或函数内第一行书写
//1.变量必须使用var 定义 否则报错
str="xxx";
//2.函数内的this指向不再是window
function Person(name,age) {
console.log(this);//undefined
this.name=name;//相当于设置undefined.name =name 报错
this.age=age;
}
//3.让eval有自己的作用域
var str =123;
eval('var str=456;alert(str)');//456
alert(str);//123
//4.对象不能用重名属性
var obj ={
username:'kobe',
username:'zs'
}
console.log(obj);//运行时没有报错,不过编辑器内有提示 最好别这么写就是了
//5.不能使用arguments.callee
function factorial(num){
if(num<=1) renturn 1;
return num*arguments.callee(num-1);
}
//使用var声明的有名函数 fn不能在外面使用,只能在函数内部使用 ,这里可以解决callee不能使用的问题
var factorial = function fn(num){
if(num<=1) renturn 1;
return num*fn(num-1);
}
Object扩展
//ES5给Object扩展了一些静态方法, 常用的2个:
//1. Object.create(prototype, [descriptors])
// *prototype 作用: 以指定对象为原型创建新的对象
// *descriptors 为新的对象指定新的属性, 并对属性进行描述
// - value : 指定值
// - writable : 标识当前属性值是否是可修改的, 默认为false
// - configurable: 标识当前属性是否可以被删除 默认为false
// - enumerable: 标识当前属性是否能用for in 枚举 默认为false
var obj = {name : 'curry', age : 29}
var obj1 = {};
obj1 = Object.create(obj, {
sex : {
value : '男',
writable : true,
configurable:true,
enumerable:true
}
});
obj1.sex = '女';
delete obj1.sex;
console.log(obj1);
for(var i in obj1){
console.log(i);
}
//2. Object.defineProperties(object, descriptors)
// * 作用: 为指定对象定义扩展多个属性
// * get :用来获取当前属性值得回调函数
// * set :修改当前属性值得触发的回调函数,并且实参即为修改后的值
// * 存取器属性:setter,getter一个用来存值,一个用来取值
var obj2 = {
firstName : 'curry',
lastName : 'stephen'
};
Object.defineProperties(obj2, {
fullName : {
get : function () {
return this.firstName + '-' + this.lastName
},
set : function (data) {
var names = data.split('-');
this.firstName = names[0];
this.lastName = names[1];
}
}
});
console.log(obj2.fullName);//curry-stephen
obj2.fullName = 'kobe-bryant';
console.log(obj2.fullName);//kobe-bryant
//3.对象本身的两个方法
// * get propertyName(){} 用来得到当前属性值的回调函数
// * set propertyName(){} 用来监视当前属性值变化的回调函数
var obj = {
firstName : 'kobe',
lastName : 'bryant',
get fullName(){
return this.firstName + ' ' + this.lastName
},
set fullName(data){
var names = data.split(' ');
this.firstName = names[0];
this.lastName = names[1];
}
};
console.log(obj.fullName);//kobe bryant
obj.fullName = 'curry stephen';
console.log(obj.fullName);//curry stephen
call apply bind
fn.call(obj,a,b)
fn.apply(obj,[a,b])
call 和apply是立即调用函数
var fn2= fn.bind(obj,a,b)是将函数返回,传参跟call一样, 通常用于指定回调函数的this
网友评论