1.减少全局变量污染
定义全局变量的三种方式
a.在任何函数外面直接执行var语句。
b.直接添加一个属性到 全局对象上。 window.f="value":
c.直接使用未经声明的变量。 f="value";
避免全局变量的两种方式
a.在应用程序中创建全局变量做位变量容器,将多个全局变量追加再次容器中。
例:
var MySpace={};
MySpace.name={
firstName:"zhang",
lastName:"san"
};
MySpace.work={
number:134998768679
};
b.使用闭包将信息隐藏。
var foo=function(){
var a=1,b=2;
var bar=function(){
var b=3,c=4;
a+=b+c;
}
bar();
}
2.注意javaScript数据类型的特殊性
防止浮点数溢出
二进制的浮点数不能正确处理十进制的小数,因此js 计算结果
例 0.1+0.2=0.30000000000000004 23.87/1000=0.023870000000000002
解决方法 1.按精度取值 2.先转换为整数后进行计算然后,再还原小数位。
慎用JavaScript类型自动转换
在JavaScript中能够自动转换变量的数据类型,这种转换是一种隐性行为。
JavaScript一般遵循:某个类型的值被用于需要其他类型的值的环境中,js
就会自动将这个值转换成所需要的类型。
数据类型自动转换
值(value) | 字符串操作环境 | 数字运算环境 | 逻辑运算环境 | 对象操作环境 |
undefined | ”undefined“ | NaN | false | Error |
null | “null” | 0 | false | Error |
非空字符串 | 不转换 | 字符串对应的数字值 | false | String |
NaN | "NaN" | 不转换 | false | Number |
空字符串 | 不转换 | 0 | false | String |
0 | "0" | 不转换 | false | Number |
Infinity | "Infinity" | 不转换 | true | Number |
Number | "infinity" | 不转换 | true | Number |
true | "true" | 1 | 不转换 | Boolean |
false | “false” | 0 | 不转换 | Boolean |
对象 | toString() | valueOf()或toString()或NaN | true | 不转换 |
a.如果把非空对象用在逻辑运算环境中,则对象被转换未true.此时的对象包括
所有类型的对象,即使是职位false的包装对象也被转换为true。
b.如果把对象用在数值运算环境中,则对象会被自动转化那位数字,如果转化
失败,则返回值为NaN.
c.当数组被用在数值运算环境中时,数组将根据包含的元素来决定转换的值。
如果数组为空数组,则被转换为数值0.如果数组仅包含一个数字元素,则被
转换 为该数字的数值。如果数组包含多个元素,或者仅包含一个非数字元素,
则返回NaN。
d. 当对象用于字符串环境中时,JavaScript能够调用toString()方法把对象转化
为字符串再进行相关计算。当对象与数值进行加号运算是,则会尝试将对象
转换为数值,然后参与求和运算。如果不能将对象转换为有效值,则执行字
符串连接操作。
e. 在进行逻辑运算环境中切记0的值也为false。
正确检测数据类型
数据类型检测
值(value) | typeof value(表达式返回值) | value.constructor()构造函数的属性值 |
var value=1 | “number” | Number |
var value ="a" | "string" | String |
var value =true | "boolean" | Boolean |
var value={} | "object" | Object |
var value=new Object() | "object" | Object |
var value=[] | "object" | Array |
var value =new Array() | "object" | Array |
var value=function(){} | "function" | Function |
function className(){} | "object" | className |
不幸的是,在typeof检测null值时,返回的时“object”,而不是“null”。
更好的检测null的方式是先判断是否为null,然后做检测
function type(o){
return (o===null)?"null":(typeof o)
}
undefined和null特殊值,就不能使用constructor属性,因为使用JavaScript
解释器会抛出异常。此时可以先把值转换为布尔值,如果为true,则说明不是
undefined和null值,然后再调用constructor属性
var value = undefined;
alert(typeof value); //"undefined"
alert(value && value.constructor); //undefined
var value =null;
alert(typeof value); //"object"
alert(value && value.construtcor); //null
对于数值直接量,也不能使用constructor属性,需要加上一个小括号,这是
因为小括号运算符能把数值转换为对象,
alert((10).constructor);
使用toString()方法检测对象类型是最安全、最准确的。调用toString()方法把
对象转换为字符串,然后通过检测字符串中是否包含数组所特有的标识符可以
确定对象的类型。
function typeOf(0){
var _toString = Object.prototype.toString;
var _type ={
"undefined" : "undefined",
"number" : "number",
"boolean" : "boolean",
"string" : "string",
"[object Function]" : "function",
"[object RegExp]" : "regexp",
"[object Array]" : "array",
"[object Date]" : "date",
"[object Error]" :“error”
}
retutn _type[typeof o] || _type[_toString.call(o)] ||
(o?"object": "null");
}
上述方法适用于JavaScript基本数据类型和内置对象,而对于自定义对象是
无效的。这是因为自定义对象被转换为字符串后,返回的值是没有规律的,
因此,要检测非内置对象,只能够使用constructor属性和instaceof运算符
来实现。
避免使用parseInt
a. parseInt会先看位置0处的字符,如果不是有效数字,则将返回NaN,不再
深入分析。如果位置0处的字符是数字,则看下一位,直到发现非数字字符
为止,此时parseInt()函数将把前面分析合法的数字字符转换为数值并返回
parseInt("123abc"); //123
parseInt("1.73"); //1
parseInt(".123"); //NaN
b. 对于以0开头的数字字符串,parseInt()函数会把它做位八进制数字处理,
先把它转换为数值,然后再转换为十进制数字返回。对于0x开头的数字
字符串,parseInt()函数会把它做位十六进制数字处理,然后转为十进制
返回。
parseInt("010"); //8 八进制
parseInt("0x10"); //16 十六进制
通过在parseInt中提供技术参数,可以把二进制、八进制、十六进制等
转换。
parseInt("10",2);
parseInt("10",8);
parseInt("10",10);
3.防止JavaScript自动插入分号
JavaScript语言有一个机制:在解析时,能够在一句话后面自动插入一个
分号,用来修改语句末尾一楼的分号分隔符。然而,由于这个自动插入的
分号与JavaScript语言的另一个机制发生了冲突,即所有空格符都被忽略,
因此程序可以利用空格格式化代码。
4.正确使用JavaScript特殊值
a.NaN
1) 判断一个值是否可用作数字的最佳方法是使用isFinite函数,因为他会
筛除掉NaN和Infinity(表示无穷大)。不幸的是isFinite会试图把他的运
算数转换为一个数字。因此,如果值不是一个数字,可自定义函数实
现检测数字。
var isNumber=function isNumber(value){
return typeof value==='number' && isFinite(value);
}
b.null和undefined
null == undefined,null !== undefined;
可以用typeof运算符来检测某个变量是否为undefined。
c.使用假值
0、NaN、''、false、null、undefined、布尔值都是false。
5.小心保留字误用