2020-05-11 JavaScript基础-变量和类型

变量

变量是对”值“的具名引用,说直白点儿就是为”值“赋个名字,然后引用它,变量的名字就是变量名

变量有变量提升和区块作用域的概念,变量名的命名(标识符)是区分大小写的,还有一些不合法的标识符以及保留字不能作为命名,var 声明的作用域是全局的,letconst后面会补充

类型

javascript中的数据类型分为两大类:原始类型、对象类型以及特殊类型(ES6新加Symbol

原始数据类型

分为3种:number,string,boolean(数值、字符串和布尔值)

对象数据类型

分为3种:object,array,function(狭义的对象、数组和函数)

特殊数据类型

分为2种:nullundefined

判断值类型

三种方法:

  • typeof运算符
  • instanceof运算符
  • Object.prototype.toString()方法

1、typeof运算符可以返回一个值的数据类型

  • 数值、字符串、布尔值分别返回numberstringboolean
  • 函数返回function
  • undefined返回undefined
  • 对象返回object:数组[]返回objectinstanceof运算符可以进一步判断数组类型是Array,后面会补充
  • null返回object:这是由于历史原因造成的

2、instanceof运算符返回一个布尔值,表示对象是否为某个构造函数的实例,instanceof运算符的左边是实例对象,右边是构造函数。它会检查右边构建函数的原型对象(prototype),是否在左边对象的原型链上

  • 由于任意对象(除了null)都是Object的实例,所以instanceof运算符可以判断一个值是否为非null的对象

  • instanceof运算符只能用于对象,不适用原始类型的值

  • 对于undefinednullinstanceof运算符总是返回false

  • 利用instanceof运算符,还可以巧妙地解决,调用构造函数时,忘了加new命令的问题

    function Fubar (foo, bar) {
      if (this instanceof Fubar) {
        this._foo = foo;
        this._bar = bar;
      } else {
        return new Fubar(foo, bar);
      }
    }
    

3、Object.prototype.toString()方法的作用是返回一个对象的字符串形式,默认情况下返回类型字符串

  • 数组、字符串、函数、Date 对象都分别部署了自定义的toString方法,覆盖了Object.prototype.toString方法,最好直接使用Object.prototype.toString.call(value)方法

  • 不同数据类型的值返回结果如下:
    - 数值:返回[object Number]
    - 字符串:返回[object String]
    - 布尔值:返回[object Boolean]
    - undefined:返回[object Undefined]
    - null:返回[object Null]
    - 数组:返回[object Array]
    - arguments 对象:返回[object Arguments]
    - 函数:返回[object Function]
    - Error 对象:返回[object Error]
    - Date 对象:返回[object Date]
    - RegExp 对象:返回[object RegExp]
    - 其他对象:返回[object Object]
    - 等等…

  • 利用这个特性,可以写出一个比typeof运算符更准确的类型判断函数

    var type = function (o){
      var s = Object.prototype.toString.call(o);
      return s.match(/\[object (.*?)\]/)[1].toLowerCase();
    };
    
    type({}); // "object"
    type([]); // "array"
    type(5); // "number"
    type(null); // "null"
    type(); // "undefined"
    type(/abcd/); // "regex"
    type(new Date()); // "date"
    
  • 在上面这个type函数的基础上,还可以加上专门判断某种类型数据的方法

    var type = function (o){
      var s = Object.prototype.toString.call(o);
      return s.match(/\[object (.*?)\]/)[1].toLowerCase();
    };
    
    ['Null',
     'Undefined',
     'Object',
     'Array',
     'String',
     'Number',
     'Boolean',
     'Function',
     'RegExp'
    ].forEach(function (t) {
      type['is' + t] = function (o) {
        return type(o) === t.toLowerCase();
      };
    });
    
    type.isObject({}) // true
    type.isNumber(NaN) // true
    type.isRegExp(/abc/) // true
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值