汤姆大叔博客手记

汤姆大叔博客手记

通过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告终。



posted @ 2016-06-01 21:19  上啊比卡丘  阅读(213)  评论(0编辑  收藏  举报