zoukankan      html  css  js  c++  java
  • 你不知道的javascript读书笔记3

    概述

    这是我看《你不知道的JavaScript(中卷)》中关于类型检查的笔记,供以后开发时参考,相信对其他人也有用。

    typeof

    我们知道js中有七种内置类型:undefined, null, string, boolean, object, number, symbol。

    我们分别用typeof对它们一一进行检查:

    typeof void(0)      //输出'undefined'
    typeof null         //输出'object'
    typeof 'haha'       //输出'string'
    typeof true         //输出'boolean'
    typeof {}           //输出'object'
    typeof 3            //输出'number'
    typeof (Symbol(2))  //输出'symbol'
    

    可以看到,除了null值会被检查为object之外,其它的都显示正常。

    那么怎么检查null值呢,方法是利用所有的对象都是真值但是null是假值这一特性:

    var a = null;
    !a && typeof a === 'object'; //true
    

    函数

    虽然函数并不是内置类型,但是它的typeof值与上面的任何一个都不同:

    typeof function() {} //输出'function'
    

    所以,当我们判断是否为对象的时候,仅仅用typeof的值为object是不行的,还要加上typeof值为function的情况。

    值得一提的是,函数也有“长度”,它的length值是它的参数个数:

    function haha() {
        return;
    }
    
    function jaja(a) {
        return;
    }
    
    function yaya(...args) {
        return args;
    }
    
    haha.length; //0
    jaja.length; //1
    yaya.length; //0
    

    数组

    数组也是一个特殊的对象,它和函数一样不是内置类型,但是和函数一样非常常用。那怎么判断一个值是否是数组呢?

    最简单的方法是利用Array.isArray()方法:

    Array.isArray([2, 3]); //true
    Array.isArray({}); //false
    

    但是isArray在有些浏览器里面不兼容,所以要写一个polyfill代码

    function isArray(obj) {
        return Object.prototype.toString.call(obj) === '[object Array]';
    }
    

    Object.prototype.toString.call

    正如上面的例子所示,Object.prototype.toString.call是另一个判断类型的好办法。比如判断boolean:

    function isBoolean(obj) {
        return Object.prototype.toString.call(obj) === '[object Boolean]';
    }
    

    typeof的防范机制

    我们经常会先判断一个变量存不存在,然后再来使用这个变量:

    if(debug) {
        console.log('Debugging is starting!');
    }
    

    但是如果debug这个变量没有声明的话,上面的语句就会报语法错误:Uncaught ReferenceError: debug is not defined。

    怎么办呢?冒昧的去声明一个变量并不是一个很好的解决方法。这个时候就可以利用typeof的防范机制:如果一个变量a未声明,那么typeof a不会报语法错误,而是会返回undefined

    typeof hahahhhh; //'undefined'
    

    所以一般把上面的代码改成下面的形式:

    if(typeof debug !== 'undefined') {
        console.log('Debugging is starting!');
    }
    
  • 相关阅读:
    linux系统——机制与策略(三)
    linux系统——机制与策略(二)
    Linux系统——机制策略(一)
    RTSP会话基本流程
    linux编程学习
    编码风格——linux内核开发的coding style
    编程风格——整洁代码的4个提示
    编程风格——五种应该避免的代码注释
    十条不错的编程观点
    代码优化概要
  • 原文地址:https://www.cnblogs.com/yangzhou33/p/9114286.html
Copyright © 2011-2022 走看看