javascript var和typeof用法理解

今天遇到了一个js面试题,如下

var a=null;
alert(typeof a);
var b;
alert(typeof b);
alert(c);

运行结果为:①object   ②underfine 

如果alert里面没有typeof,结果就不一样了   ① null   ②underfine 


这里首先要介绍一下typeof

typeof 运算符
返回一个用来表示表达式的数据类型的字符串。(注:这里注意返回值是字符串,返回结果进行比较请给加上引号,例如:typeof(a)=="undefined"

typeof的运算数未定义,返回的就是 "undefined".

运算数为数字 typeof(x) = "number"

字符串 typeof(x) = "string"

布尔值 typeof(x) = "boolean"

对象,数组和null typeof(x) = "object"

函数 typeof(x) = "function


typeof是一个一元运算符,它返回的结果始终是一个字符串,对不同的操作数,它返回不同的结果。
具体的规则如下:
一、对于数字类型的操作数而言, typeof 返回的值是 number。比如说:typeof(1),返回的值就是number。
上面是举的常规数字,对于非常规的数字类型而言,其结果返回的也是number。比如typeof(NaN),NaN在
JavaScript中代表的是特殊非数字值,虽然它本身是一个数字类型。
在JavaScript中,特殊的数字类型还有几种:
Infinity 表示无穷大特殊值
NaN            特殊的非数字值
Number.MAX_VALUE     可表示的最大数字
Number.MIN_VALUE     可表示的最小数字(与零最接近)
Number.NaN        特殊的非数字值
Number.POSITIVE_INFINITY 表示正无穷大的特殊值
Number.NEGATIVE_INFINITY 表示负无穷大的特殊值

以上特殊类型,在用typeof进行运算进,其结果都将是number。

二、对于字符串类型, typeof 返回的值是 string。比如typeof("123")返回的值是string。 
三、对于布尔类型, typeof 返回的值是 boolean 。比如typeof(true)返回的值是boolean。
四、对于对象、数组、null 返回的值是 object 。比如typeof(window),typeof(document),typeof(null)返回的值都是object。
五、对于函数类型,返回的值是 function。比如:typeof(eval),typeof(Date)返回的值都是function。
六、如果运算数是没有定义的(比如说不存在的变量、函数或者undefined),将返回undefined。比如:typeof(sss)、typeof(undefined)都返回undefined。


不知道大家通过上述介绍对于前两个alert的结果是否已经理解了


对于第三个alert结果需要介绍一下var

var是用来声明变量的并不算做定义,读取一个未声明的变量值,js会产生一个错误。所以,如果在开头先alert(c);就会开头报错,后面的js也不执行了




--------------------------------------------------------------------------------------------------------------

接下来顺便多看看查阅资料看到的js变量相关的知识

链接地址:http://www.cnblogs.com/shuaisam/archive/2012/04/06/2433390.html

js 变量

  • 变量的声明

    1.使用var多次声明同一个变量,是合法的,不会因此语法的错误;重复的声明并初始化变量值,只是相当于普通的赋值语句。

    2.读取一个未声明的变量值,js会产生一个错误。

    3.尝试给一个未经var 声明的变量赋值,js会隐式声明该变量,隐式声明的变量被创建为全局变量。

    4.无论是全局变量还是局部变量,最好都使用var进行声明。

 var i = 12;
        var i = 13;    //相当于赋值语句 i = 13
        alert(i);
        k = 34;        //隐式声明为一个全局变量
         alert(k);
        alert(j);        //产生一个错误
  • 变量的作用域

  全局(global)变量的作用域是全局的,即在js代码中处处有定义。

  局部(local)变量的作用域是局部性的,只在特定的范围内,比如函数内部定义的变量,函数的参数变量,这些变量的作用范围是局限在函数的内部的。

  1.声明全局变量可以不适用var 关键字,局部变量则必须使用var关键字来声明,为了避免不必要的麻烦,养成所有的变量都使用var关键字来声明。

  2.变量的定义没有块级作用域

    在函数中声明的所有的变量,无论是在哪里声明的(只要是在函数内部),在整个的函数中都是有声明的


function f(){
            for (var i=0;i<10;i++){                    //此处i在for循环中的变量
                    if(i==5){
                     var k = 5;                       //此处k在if块中定义 
                        break;
                 }
            }
            alert("i=" + i + "----k =" + k);//只要是在函数内部的变量我们都可以使用它
        
        }

引发思考的例子

var scope = "global";
        function f2(){
            alert(scope);            //提示undefined
            var scope = "local";
            alert(scope);            //提示local
                
            }

解析:第一次alert提示scope undefined ,而我们又定义了全局变量scope?????

     由于变量的定义没有块级作用域这个规则的限制,局部变量在整个函数内部都是有定义的,这就意味着整个函数体中都隐藏了同名的全局变量,

    第一次alert, 局部变量scope是已经被声明了,但是没有初始化值,所以提示undefined;

    而第二次的alert,是在scope = "local" 之后的,也就是局部变量scope完成了初始化,所以提示为local。

    该例子中的代码相当于

var scope = "global";
        function f2(){
            var scope;    //声明局部变量scope,未初始化
            alert(scope);            
          scope = "local";//初始化scope
            alert(scope);            
                
        }

  • 未定义的变量和未赋值的变量

  未定义的变量:指没有声明并且没有初始化的变量,尝试读取这种变量会产生一个错误。

       注: 这里要区分开没有声明但初始化了的变量,这种变量不会引起错误,程序会在全局变量中隐式的声明该类变量。

  未赋值的变量:指已经声明但没有初始化的变量,尝试读取该类变量将得到一个默认值undefined.


-------------------------------------------------------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值