js 值和类型

javascript中变量没有类型,只有值有类型。变量可以随时持有任何类型的值。

var a = 42;
typeof a;//"number"

a = true;
typeof a;//"boolean"

typeof typeof 45;//"string"
//变量在未持有值的时候为undefined,即typeof 返回 “undefined”。
var a;
typeof a;//"undefined"
typeof b;//"undefined"

a;//undefined
b;//ReferenceError;b is not defined

上面代码中的b为undeclared,没有在作用域中声明过的变量。但是浏览器对他的处理容易让人产生误解,typeof返回“undefined”,值返回is not defined 。这其实因为typeof的一个特殊的安全防范机制。

javascript将undefined和undeclared混为一谈,其实他们是两码事。undefined是值的一种,undeclared表示变量还没有被声明过。但是,有时通过typeof的安全防范机制(阻止报错)来检查全局的undeclared变量也是个不错的办法:

/*DEBUG为全局变量,“调试模式”的开关。在输出调试信息到控制台之前,会检测DEBUG变量是否已被声明 
  顶层的全局变量声明var DEBUG = true只在debug.js文件中有,只在开发及测试时加载到浏览器      
*/
if(DEBUG){//抛错
    console.log("Debugger is begin");
}
if(typeof DEBUG !== "undefined"){//安全
    console.log("Debugger is begin");
}
//对内建API也有作用
if(typeof atob === "undefined"){
    atob = function(){/*contenrt*/};
}

此外也可用判断全局变量是否是全局对象的属性检查:


/*DEBUG为全局变量,“调试模式”的开关。在输出调试信息到控制台之前,会检测DEBUG变量是否已被声明 
  顶层的全局变量声明var DEBUG = true只在debug.js文件中有,只在开发及测试时加载到浏览器      
*/
//检查全局变量是否是全局对象的属性,浏览器全局对象是window
if(window.DEBUG){//安全
    console.log("Debugger is begin");
}
if(!window.atob){//安全
    // ..
}
//缺点是全局变量也可以使服务端 node.js


typeof同时也可用于非全局变量的检查以及另外的变量检查方法供参考:
//typeof在非全局变量的应用      
function doSomethingCool(){
    var helper = 
        (typeof FeatureA !== "undefined") ?
        FeatureA :
        function(){/* .. default feature.. */}
    var val = helper();
}
/*其他模块和程序引入doSomethingCool()时。此函数会检测变量FeatureA是否已经在宿主
    程序中定义过;是,就用现成的,否则自己定义
*/

//一个立即执行函数表达式(LIFE)
(function(){
    function FeatureA(){/*.. my A feature..*/}
    //包含doSomethingCool(..)
    function doSomethingCool(){
         var helper = 
            (typeof FeatureA !== "undefined") ?
            FeatureA :
            function(){/* .. default feature.. */}
        var val = helper();
    }
    doSomethingCool();
})();
/*这里FeatureA并不是全局变量,但是还是可以用typeof安全防范机制做检查,因为这里没有全局对象可用
    下面是另一种方法:“依赖注入”设计模式
*/
function doSomethingCool(FeatureA){
    var helper = FeatureA ||
        function(){/*default feature*/}
    var val = helper();
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值