闭包与内存泄露:JavaScript闭包函数中,内层函数的生命周期会比外层函数长,而如果内层函数拥有访问外层函数中变量的权限,那么这个变量就不会随着外层函数的生命周期结束而销毁。
函数化模式构造constructor:
var constructor=function(spec,my){
var that;
var my=my||{};
that=新对象;
给that添加特权方法;
return that;
}
给that添加特权方法时,可以先定义函数:var func=function(){}; 然后再赋值给that:that.func=func;
这样做不仅方便了其他方法调用func时可以直接调用,而且如果that.func被篡改或替换,调用func的其他函数是不会有影响的。
*P54 看不懂!!!
如果用函数化的方法创建一个对象,并且该对象的所有方法都不实用this或是that,那么该对象就是持久性的(durable)
一个持久性对象就是一个简单功能函数的几个,不会被入侵,访问它时,除非有方法授权,否则攻击者无法访问对象的内部状态
JavaScript数组:并不是严格意义上的数组,更类似于对象,特性在于以整数作为该对象的属性名。
每一个数组都会有一个length属性,JavaScript数组的length是没有上界的,length属性的值是这个数组的最大整数属性名+1。
它不一定等于数组里的属性的个数
myArray[100000]=true;
myArray.length=100001;
设置更大的length不会给数组分配更多的空间,但设置更小的length会使大于这个length的属性被删除
由于JavaScript的数组其实就是对象,所以delete运算可以用来从数组中移除元素:delete number[2];
但是这样会在数组中留下一个空洞
替代方法:splice();
eval() setTimeout() setInterval() 这三个函数具有访问到JavaScript编译器的能力 用时慎重(避免使用字符串参数的形式)
eval()函数传递一个字符串给JavaScript编译器,并且执行其结果。这样很危险
JavaScript的对象永远不会是空对象,因为它们可以从原型链中取得成员属性。
typeof运算符不能识别数组和对象,要进一步识别一个值是否为数组,还需要奸恶它的constructor属性:
if(my_value&& typeof my_value==='object' && my_value.constructor===Array)){};
undefined 是缺失的成员属性的值,判定时用‘null’测试是不好使滴
二进制的浮点数不能正确的处理十进制的小数,因此0.1+0.2不等于0.3. 这是JavaScript种最经常报告的bug。
解决方案:浮点数中的整数运算是精确的,所以小数表现出来的错误可以通过制定精度来避免。
比如乘以100,运算 再除回去blablabla.....
NaN:
NaN是IEEE754中定义的一个特殊的数量值。它表示的不是一个数字,但在JavaScript中时数字类型。
typeof NaN===‘number’ //true
该值可能会在试图把非数字形式的字符串转换为数字时产生。eg:
+’0‘ //0
+'oops' //NaN
NaN===NaN //false
NaN!==NaN //true (对此我表示很无语。。。)