vue随笔之二类型判断一

若有不足,敬请指出。

打开vue.js,开始就是类型判断,总所周知,vue是一门弱类型语言,所以加上类型判断势在必行。

/**
* 判断是否为undefined或者null
*/ 
function isDef(v){
    return v === undefined || v === null;
}
/**
* 判断是否不为undefined或者null
*/
function isDef(v){
    return v !== undefined || v !== null;
}
/**
* 判断是否为true
*/
function isTrue(v){
    return v === true;
}
/**
* 判断是否为false
*/
function isFalse(v){
    return v === false;
}
/**
* 判断是否为原始类型:字符串、数字或者布尔类型,以及es6新出的symbol类型
*/
function isObject(obj){
    return typeof obj  === 'string' ||
            typeof obj === 'number' ||
            typeof obj === 'symbol' ||
            typeof obj === 'boolean'
}

以上类型比较简单,下面将介绍以下几种类型:

var _toString = Object.prototype.toString;
function toRawType(value){
    return _toString.call(value).slice(8,-1)
}

首先,定义私有属性_toString为Object原型上的方法toString。_toString.call(value).slice(8,-1)可以分为两步:

    1、var str =_toString.call(value);

     2、str.slice(8,-1);

类型判断在 web 开发中有非常广泛的应用,简单的有判断数字还是字符串,进阶一点的有判断数组还是对象,再进阶一点的有判断日期、正则、错误类型,再再进阶一点还有比如判断 plainObject、空对象、Window 对象等等。

在这里,我们不仅有个疑问,为什么不用typeof呢,typeof能检测六种基本类型和function(symbol是es6新出的,这里不做介绍,有兴趣的可以底下搜集资料),可以typeof null为object,typeof new Date()等new出来的对象都为 object类型。可谓漏洞百出。而Object.prototype.toString就是更好的方法。

当 toString 方法被调用的时候,下面的步骤会被执行:

     1、如果 this 值是 undefined,就返回 [object Undefined]

     2、如果 this 的值是 null,就返回 [object Null]

     3、让 O 成为 ToObject(this) 的结果

     4、让 class 成为 O 的内部属性 [[Class]] 的值

     5、最后返回由 "[object " 和 class 和 "]" 三个部分组成的字符串

通过规范,我们至少知道了调用 Object.prototype.toString 会返回一个由 "[object " 和 class 和 "]" 组成的字符串,而 class 是要判断的对象的内部属性。正是因为这种特性,我们可以用 Object.prototype.toString 方法识别出14种类型;

var num = 1;          // [object Number]
var str = '123';      // [object String]
var flag = true;      // [object Boolean]
var def = undefined;     // [object Undefined]
var null = null;          // [object Null]
var obj = {a: 1}         // [object Object]
var arr = [1, 2, 3];   // [object Array]
var date = new Date();   // [object Date]
var err = new Error(); // [object Error]
var reg = /a/g;          // [object RegExp]
var fn = function a(){}; // [object Function]
console.log(Object.prototype.toString.call(Math)); // [object Math]
console.log(Object.prototype.toString.call(JSON)); // [object JSON]
function func() {
    console.log(Object.prototype.toString.call(arguments)); // [object Arguments]
}
func();

现在再来看我们的第一步_toString.call(value),也就是转化为类似[object Object],而第二步就是把[object Object]slice成Object,String,Date等

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值