汤姆大叔博客手记
通过var创建的全局变量(任何函数之外的程序中创建)是不能被删除的。无var创建的隐式全局变量(无视是否在函数中创建)是能被删除的。这表明,在技术上,隐式全局变量并不是真正的全局变量,但它们是全局对象的属性。属性是可以通过delete操作符删除的,而变量是不能的。
// 定义三个全局变量
var global_var = 1;
global_novar = 2; // 反面教材
(function () {
global_fromfunc = 3; // 反面教材
}());
// 试图删除
delete global_var; // false
delete global_novar; // true
delete global_fromfunc; // true
// 测试该删除
typeof global_var; // "number"
typeof global_novar; // "undefined"
typeof global_fromfunc; // "undefined"
hoisting(变量提升)
//反例
myname = "global"; // 全局变量
function func() {
alert(myname); // "undefined"
var myname = "local";
alert(myname); // "local"
}
func();
parseInt
var month = "06",
year = "09";
month = parseInt(month, 10);
year = parseInt(year, 10);
此例中,如果你忽略了基数参数,如parseInt(year),返回的值将是0,因为“09”被当做8进制(好比执行 parseInt( year, 8 )),而09在8进制中不是个有效数字。
这是原文中汤姆大叔的解释,但是按照现在的规范这个解释是错误的。看看这个栗子:
//ECMAScript 3 认为是56(八进制),ECMAScript 5 认为是70(十进制)
var num = parseInt("070");
引用高级程序设计:
在ECMAScript 3 JavaScript 引擎中,"070"被当成八进制字面量,因此转换后的值是十进制的56。而在ECMAScript 5 JavaScript 引擎中,parseInt()已经不具有解析八进制值的能力,因此前导的零会
被认为无效,从而将这个值当成"70",结果就得到十进制的70。在ECMAScript 5 中,即使是在非严格模式下也会如此。
为了消除在使用parseInt()函数时可能导致的上述困惑,可以为这个函数提供第二个参数:转换时使用的基数(即多少进制)
所以对于上面汤姆大叔举的例子,假设parseInt(09),那么输出的正确值应该是9,因为ES5已经不再解析前导,而是直接当作10进制进行解析了。
接着引用的内容,我们parseInt()的第二个参数指的就是把数字按照几进制进行解析,所以有:
parseInt(1111,2)
//15
parseInt(3333,2)
//NaN
说完这些我们再接回原来大叔的原文
替换方法是将字符串转换成数字,包括:
+"08" // 结果是 8
Number("08") // 8
这些通常快于parseInt(),因为parseInt()方法,顾名思意,不是简单地解析与转换。但是,如果你想输入例如“08 hello”,parseInt()将返回数字,而其它以NaN告终。