// 大学里最痛苦的事情莫过于做毕业设计,目前正处于这个时期。 // :( :( // // 首先记录下的是 Function 的一个问题 Function.prototype.method = function( name, func){ if( ! this.prototype[ name]){ this.prototype[ name ] = func; } } // 给 函数原型增加方法 // // 给函数原型增加的方法在 String 中可以调用 String.method( 'trim', function(){ return ( this || '').replace( /^/s*|/s*$/g, ''); }) // 之前一直不理解为什么给 Function 对象的原型增加的方法,可以在 String 和 Array 中获取。 // 现在终于明白了。 说明见下面: // 1, 在 js 中 函数 是对象( 虽然 typeof 结果为 'function' )。所有函数都是链接到 Function.prototype 的, // 而 Function.prototype 本身是连接到 Object.prototype 的 // 2, 函数有 4 中声明方式,见 http://blog.youkuaiyun.com/phpandjava/archive/2010/03/19/5395528.aspx, // 其中一种是 var me = new User();在这里 User 是一个函数,只不过调用方式是 Constructor 的方式, // User 在其他面向对象语言中相当于 class,当然这里也可以理解为 类。这个 User 链接到 Function.prototype。 // 同样 String 也一个函数(也可以理解为对象,因为 js 中函数是对象),他也是通过 new String() 来调用的,因此, // 给 Funciton 原型增加的方法可以在 String 中获取 // // // 《JavaScript: The Good Parts》是本好书,好书读一遍应该是不能理解透彻的,至少我没有。 // 下面记录下 书中 附录提到的 awful parts, bad parts // 1, 避免使用全局变量,全局变量定义的方式有以下几种 // a, var foo = 'bar'; // 在所有函数外定义 // b, window.foo = 'bar'; // 给预定义的全局变量增加属性 // c, foo = 'bar'; // 不用 var 声明直接使用的变量。important! // 2,自动加分号。 // js 会试图通过增加 分号 来纠正错误,比如 // var foo = function(){ // return // 在这里会增加 分号,因此函数返回 undefined,而不是 对象 // { // name: 'myhere' // } // } // 3,js 的 typeof 只产生 6 个值( 字符串 类型的): 'object', 'function', 'number', 'string', 'boolean', 'undefined' // 数组经 typeof 运算结果为 'object'; // typeof null = 'undefined' // typeof NaN = 'number' // 4,parseInt() 函数 // 如果参数的第一个字符是 0 的话,函数会试图解析为 八进制,因此 parseInt( '09'),结果为 0(因为 8 在 8 进制中不存) // 使用的最佳方式是: parseInt( digitString, 10), 或者 '08' - 0 // 5,不要进行浮点数的关系运算。(浮点数在计算机中的精度的问题) // 0.1 + 0.2 == 0.3 // false // 先将浮点数转化为 整数后再比较 // 6,js 中是 false 的值 // false, null, 0, undefined, NaN, '' // 7,js 中对象和数组不会是空的,因为他们会链接到原型。 // if( {} ){ // alert( 'empty') // 永远不会 alert // } // 这里说一点: // js 中每个函数的 prototype 属性是一个对象,这个对象有一个 constructor 属性,而这个属性是这个函数本身。 // 这个过程是在定义函数的时候产生的。( 和 var add = new Function( 'a', 'b', 'return a + b' ) 一样) // 8,避免使用 == 和 !=,使用 === 和 !== // 因为 // '' == '0' // false // '0' == 0 // true // 0 == '' // true // // 不具有传递性 // 9,不要用 with(){} // 语义不明确,使 js 解析器的解析速度很慢 // 10, 避免使用 eval() // setTimeout() 和 setInterval() 的第一个参数为字符串的时候等同于先调用 eval() // 11,js 不善于 位操作运算 // &, |, ^,~, >>, >>>, << // 不善于并不等于不能,我见过用 js 写的 base64 和 sha 的加密函数 // 12,避免使用 new,因为如果调用不是通过 constructor 调用的函数会导致 this 绑定到 global 对象上,也就是 window // 通过 constructor 调用的函数一般首字母大写 // 13,声明对象,数组 // var obj = {}, arr = []; // 14,避免使用 void 操作符 //