Javascript中的for-in循环和hasOwnProperty

转自: http://www.csser.com/board/4f3f516e38a5ebc9780004f8

avascript中的for-in循环和hasOwnProperty

与in操作符相比,for in 在循环对象的属性时也会遍历原型链,for in 不会读取不可枚举属性,如数组的length属性。 小结 当检测某个对象是否拥有某个属性时,hasOwnProperty 是唯一可以完成这一任务的方法,在 for in 循环时,建议增加 hasOwnProperty 进行判断,可以有效避免扩展本地原型而引起的错误。

 使用hasOwnProperty进行过滤

与in操作符相比,for in 在循环对象的属性时也会遍历原型链,for in 不会读取不可枚举属性,如数组的length属性。

我们不可能改变 for in 循环的行为,当需要对循环体内某些属性进行过滤时,可以利用Object.prototype的hasOwnProperty方法来完成。

提示:因为 for in 循环总是遍历整个原型链,所以当遍历多继承的对象时效率较低。

使用 hasOwnProperty 进行过滤

例子中因为使用了hasOwnProperty,最终输出moo;如果忽略 hasOwnProperty ,代码将会输出非预期结果,因为本地原型(如Object.prototype)已经被扩展了。

Prototype框架就是扩展Javascript原始对象的一个类库,并被广泛使用,其缺点也很明显,当框架引入后,如果不使用 hasOwnProperty 进行过滤判断,输出结果保证不是你想要的。

最佳实践

推荐在 for in 时,总是使用 hasOwnProperty 进行判断,没人可以保证运行的代码环境是否被污染过。

hasOwnProperty

为了检查某个对象是否拥有不在原型链上的自定义属性,就有必要用到 hasOwnProperty 方法,任何一个对象都具有该方法,它继承自 Object.prototype。

提示:我们无法完全检测某个属性是否是undefined,因为属性有可能存在,但其值为undefined。hasOwnProperty 是Javascript中唯一一个可以处理对象属性而不遍历原型链的方法。

只有 hasOwnProperty 给出了正确的预期结果,当遍历对象的属性时这是很有必要的,没有其它办法来排除定义在对象原型链上的属性。

hasOwnProperty 作为属性

Javascript 并没有保护 hasOwnProperty 为关键字或保留字,因此,如果某个对象拥有同名的属性,就有必要利用扩展的 hasOwnProperty 来获取正确结果。

小结

当检测某个对象是否拥有某个属性时,hasOwnProperty 是唯一可以完成这一任务的方法,在 for in 循环时,建议增加 hasOwnProperty 进行判断,可以有效避免扩展本地原型而引起的错误。

go 安装第三方包

参考: https://code.google.com/p/go-wiki/wiki/GoGetTools

Installing Version Control Tools for go get

The go get fetching of source code is done by using one of the following tools expected to be found on your system:

Refer GoGetProxyConfig for setting proxies for these tools.

 

如: 安装 code.google.com/p/goprotobuf/proto :

go get code.google.com/p/goprotobuf/proto

但是,这里需要hg这个命令,可以使用yum安装:

yum install *mercurial*

而对于github上的go包,需要先安装git,然后使用go get, 例如:

go get github.com/golang/groupcache

代码会自动安装在GOPATH 下的src目录中

补充说明:(其实这个写在前面更好)

go get是可以自动管理依赖的,比如,上面的groupcache以来proto,如果先安装hg这个命令的话,直接安装groupcache时,是可以自动安装proto的; 不过如果不太幸运的话,有些包会安装失败的,下图就是一个例子:

 

GO语言目录结构

 

参考文档: http://blog.studygolang.com/tag/directory/

  1. gopath 下三个目录
    • bin目录需要通过 $GOBIN 环境变量指定后使用
    • src目录是源文件目录
    • pkg目录是编译后的 .a 文件,不是放源文件的
  2. 关于包目录、包名、文件名的含义: 对于 phpor/test/first.go  ,其中:
    • phpor是包的目录名,import时,需要使用 import “phpor/test”
    • test 是包名, 如果first.go中有function hello(); 则,调用方式为: test.hello()
      • test目录中可以包含子目录和second.go
      • 对于test目录下的所有的 *.go 在编译后,会在pkg/phpor目录生成 test.a
      • 如果test目录中有一个目录 xxx, 则,xxx 下面的文件编译后会生成 pkg/phpor/test/xxx.a
    • first.go 可以随便命名,只是第一行必须为: package test

 

GO语言最佳实践: http://blog.jobbole.com/44608/

视频资料: http://vimeo.com/69237265