this的讲解和其他习题
习题
1 var f = ( 2 function f(){return '1'}, 3 function g(){return 2} 4 )() 5 typeof f //number (括号操作符会返回逗号后面的东西)
var x = 1; if(function f(){}){ x+=typeof f } //x 1undefined 函数变成表达式就会立即执行,执行之后再也找不到了
判断一个数字是不是数字
1 function isNaN(num){ 2 var ret = Number(num); 3 ret +=''; 4 if(ret =='NaN'){ 5 return true; 6 }else{ 7 return false; 8 } 9 }
对象是引用值,引用值比对的是地址,而这个是属于两个房间,地址不一样
this
1、函数预编译过程this->window
1 function test(){ 2 console.log(this);//this指向window 3 } 4 test();
2、全局作用域里this ->window
3、call/apply 可以改变函数运行时this指向
4、obj.func(); func()里面的this指向obj(谁调用函数,这个this就指向谁)
this习题
1 var name = '222'; 2 var a = { 3 name:'111', 4 say:function(){ 5 console.log(this.name); 6 } 7 } 8 9 var fun = a.say; 10 fun();//222 11 a.say();//111 12 var b = { 13 name:'333', 14 say:function(fun){ 15 fun(); 16 } 17 } 18 b.say(a.say);//222 19 b.say = a.say; 20 b.say();//333
1 var length = 10; 2 function fn(){ 3 console.log(this.length) 4 } 5 var obj = { 6 length:5, 7 method:function(fn){ 8 fn();//10 9 arguments[0]();//2 10 } 11 } 12 obj.method(fn,1)
arguments.callee(相当于函数自身引用)
1 var num = (function (n){ 2 if(n==1){ 3 return 1; 4 } 5 return n*arguments.callee(n-1); 6 }(100))
深克隆(改变现在的属性,不会更改原来的属性)
遍历对象for(var prop in obj)
判断是不是原始值 typeof() object
判断是数组还是对象
建立相应的数组或对象
1 function deepCopy(origin, target) { 2 var target = target || {} 3 for (var i in origin) {//遍历数组 4 if (typeof origin[i] === 'object') {//判断是不是原始值 5 //要考虑深复制问题了 6 if (origin[i].constructor === Array) {//判断是数组还是对象 7 //这是数组 8 target[i] = [] 9 } else { 10 //这是对象 11 target[i] = {} 12 } 13 deepCopy(origin[i], target[i])//建立相应的数组或对象 14 } else { 15 target[i] = origin[i] 16 } 17 } 18 return target 19 } 20 var obj = { 21 name:'fan', 22 abc:{ 23 grade:190, 24 arr:[{a:123}] 25 } 26 } 27 var obj1 ={} 28 deepCopy(obj,obj1) 29 console.log(obj1) 30 obj1.name = 'you'
1 function deepCopy(origin,target){ 2 var target = target || {} 3 toStr = Object.prototype.toString, 4 arrStr = "[object Array]"; 5 for(var prop in origin){ 6 if(origin.hasOwnProperty(prop)){ 7 if(origin[prop] !=='null' && typeof(origin[prop]) == 'object'){ 8 if(toStr.call(origin[prop]) === arrStr){ 9 target[prop] = [] 10 }else{ 11 target[prop] = {} 12 } 13 deepCopy(origin[prop], target[prop]) 14 }else{ 15 target[prop] = origin[prop] 16 } 17 } 18 } 19 return target; 20 } 21 var obj = { 22 name:'fan', 23 abc:{ 24 grade:190, 25 arr:[{a:123}] 26 } 27 } 28 var obj1 ={} 29 deepCopy(obj,obj1) 30 // console.log(obj1) 31 obj1.name = 'you'
成大事不在于力量的大小,而在于能坚持多久。