书是这本,挺不错的,有兴趣可以看看 JavaScript:The Good Parts
数据类型和运算符
- 只有一种数字类型,内部表示为64位浮点数
- NaN 不等于任何值,包括它自己
- 被当作逻辑假的值:
false
null
undefined
''
0
NaN
- 未指定return值时将会返回
undefined
/
运算符有可能会产生一个非整数结果,即使两个运算数都是整数
减少全局变量污染方法
在应用中只创建一个全局变量:
var MYAPP = {};
该全局变量此时成了应用的容器,可以如下方式使用:MYAPP.value1 = {...}; MYAPP.value2 = {...}; ...
- 使用闭包(Closure)
函数
当函数被调用时,会得到一个“免费”的参数,即
arguments
“数组”,通过该”数组”可访问所有函数被调用时传入的参数,无论该参数是否在该函数定义时被指定为形参function() { for(var i = 0; i < arguments.length; i++) { console.log(arguments[i]); } }
由于语言的一个设计错误,
arguments
并非是一个真正的数组,而是一个“类似数组”(array-like)的对象,它有一个length
属性,但缺少所有数组的方法
prototype 原型链
- 每个对象都连接到一个原型对象,并且它可以从中继承属性
- 所有通过对象字面量创建的对象都连接到
Object.prototype
这个标准对象 - 原型链在更新时无效,仅在检索属性值的时候起效
当尝试获取某个对象的属性值,且对象本身无此属性,那么将会去该对象的原型中寻找,如果找不到则继续从原型的原型中寻找,直到到达终点Object.prototype
对象为止,如果最终仍未找到属性,则返回undefined
。该过程被称为委托 hasOwnProperty
只会检查对象自己属性,不会检查原型链
删除
delete obj.val
将删除对象obj本身的val属性,且不会影响原型链
递归
- JavaScript 没有提供“尾递归优化”
变量作用域
JavaScript 不支持块级作用域,这意味着所有定义在函数任何地方的参数和变量在函数内部任何地方都可见
因此,尽管很多支持块级作用域的语言推荐尽可能迟地声明变量,而在 JavaScript 中却应该在函数体的顶部声明函数中用到的所有变量
闭包(Closure)
var myVar = function() {
var innerVal = 0;
return {
getInnerVal() {
return innerVar;
}
}
}
//myVar.getInnerVal()才能取得innerVal的值
(伪)数组(array-like)
JavaScript 中没有真正的数组,它把数组的下标转换为字符串,用其作为属性
数组是一段线性分配的内存,它通过计算指针偏移量去访问元素,数组是很快的数据结构
“数组”中可同时包含不同类型的元素
- “数组”拥有一个诡异的
length
属性
坑,及避免方法
parseInt
方法- 遇到非数字时停止解析,所以
parseInt("123")
和parseInt("123abc")
的结果是一样的 - 若字符串首位为 0,如 “013”,则会按照八进制进行转换。好在可以提供基数,如
parseInt("013", 10)
,最好始终使用这种写法
- 遇到非数字时停止解析,所以
+
运算符- 两个运算数都是数字则返回两数之和
- 一个运算数是空字符串,则会将另一个运算数转换为字符串并返回
- 其余情况均为拼接字符串
浮点数运算不精确,
0.1 + 0.2
不等于0.3
。可以通过整数化来解决,如0.1 + 0.2
等于(0.1 * 10 + 0.2 * 10) / 10
写 JS 代码好习惯
(function($){
//在此处使用 $
}(jQuery));
原因:
- 闭包避免了全局污染
- 将 jQuery 对象传进闭包后再使用 $
可以避免与其他也使用了 $
的框架冲突
- $(document).ready(function() {});
与 $(function() {});
等价
on、bind、live、delegate() 区别
http://www.cnblogs.com/moonreplace/archive/2012/10/09/2717136.html