首页 > 代码库 > Javascript Garden

Javascript Garden

一  对象

 

1—

console.log(false.toString()); //falseconsole.log([1,2,3].toString()); //1,2,3function Foo(){ }Foo.bar=1;console.log(Foo.bar);//1//console.log(2..toString());//报错console.log(2..toString());//2console.log(2 .toString());//2console.log((2).toString());//2//变通方法可以让数字的字面量看起来像对象

 

 

2—

var foo={name: ‘kitten‘} console.log(foo.name);//kitten console.log(foo[‘name‘]);//kitten  var get=‘name‘; console.log(foo[get]);//kitten  //console.log(foo.1234);//报错console.log(foo[‘1234‘]);//undefined

 

3—

var obj={     bar:1,     foo:2,     baz:3 }; obj.bar=undefined; obj.foo=null; delete obj.baz;  for(var i in obj){     if(obj.hasOwnProperty(i)){         console.log(i, ‘‘+obj[i]);     } } //输出: //bar undefined //foo null

 

4—hasOwnProperty函数

   为了判断一个对象是否包含自定义属性而不是原型链上的属性,可以使用继承自Objeect.prototype的hasOwnProperty方法。其是JavaScript中唯一一个处理属性但是不查找原型链的函数。

 

5—for in 循环

   在查找对象属性时遍历原型链上的所有属性。

Object.prototype.bar=1; var foo= {moo:2}; for(var i in foo){     console.log(i); //moo bar } 
for(var i in foo) { if (foo.hasOwnProperty(i)) { console.log(i);//moo } }

 

二  函数
1— this
Foo.method = function() {     function test() {         // this 将会被设置为全局对象(译者注:浏览器环境中也就是 window 对象)     }     test(); }  
Foo.method = function() { var that = this; //为了在 test 中获取对 Foo 对象的引用,我们需要在 method 函数内部创建一个局部变量指向 Foo 对象。 function test() { // 使用 that 来指向 Foo 对象 } test(); }

 

2--循环中的闭包
for(var i = 0; i < 10; i++) {     setTimeout(function() {         console.log(i);//输出10 十次     }, 1000); } //ps:当 console.log 被调用的时候,匿名函数保持对外部变量 i 的引用,此时 for循环已经结束, i 的值被修改成了 10.    for(var i = 0; i < 10; i++) {     (function(e) {         setTimeout(function() {             console.log(e);         }, 1000);//输出0到9     })(i); } //ps:自执行匿名函数。外部的匿名函数会立即执行,并把 i 作为它的参数,此时函数内 e 变量就拥有了 i 的一个拷贝。 // 当传递给 setTimeout 的匿名函数执行时,它就拥有了对 e 的引用,而这个值是不会被循环改变的。


for(var i = 0; i < 10; i++) { setTimeout((function(e) { //从匿名函数返回一个函数 return function() { console.log(e); } })(i), 1000) }

 

4— arguments对象

函数中的参数列表,实际上是一个对象。

转换为数组方法:

  Array.prototype.slice.call(arguments); (性能欠佳)

//(1)下面是将参数从一个函数传递到另一个函数的推荐做法。function foo() { bar.apply(null, arguments); } function bar(a, b, c) { // 干活
}


//(2)另一个技巧是同时使用 call 和 apply,创建一个快速的解绑定包装器。function Foo() {} Foo.prototype.method = function(a, b, c) { console.log(this, a, b, c); }; // 创建一个解绑定的 "method" // 输入参数为: this, arg1, arg2...argN Foo.method = function() { // 结果: Foo.prototype.method.call(this, arg1, arg2... argN) Function.call.apply(Foo.prototype.method, arguments); }; / Foo.method = function() { var args = Array.prototype.slice.call(arguments); Foo.prototype.method.apply(args[0], args.slice(1)); };

 

 

 

 

 

 未完待续:

参考 & 学习 & 感谢 http://bonsaiden.github.io/JavaScript-Garden/zh/#function.constructors

 

Javascript Garden