zoukankan      html  css  js  c++  java
  • 使用 typeof bar === "object" 来确定 bar 是否是对象的潜在陷阱是什么?

    使用typeof首先要明白 typeof 可以检测什么。 typeof 主要用于检测基本数据类型。typeof尽量不要用来检测复杂数据类型。

    typeof 检测null 和 数组 的时候 结果也是objcet。所以 使用 typeof bar === "object" 来确定 bar 是否是对象是不准确的。

    除非这样使用 (bar !== null) && (typeof bar === "object") && (toString.call(bar) !== "[object Array]")

    因为 isNaN()函数调用返回的结果是boolean值所以 是boolean类型。

    尽管 typeof bar === "object" 是检查 bar 是否对象的可靠方法,令人惊讶的是在JavaScript中 null 也被认为是对象!

    因此,令大多数开发人员惊讶的是,下面的代码将输出 true (而不是false) 到控制台:

    var bar = null;console.log(typeof bar === "object"); // logs true!
    只要清楚这一点,同时检查 bar 是否为 null,就可以很容易地避免问题:

    console.log((bar !== null) && (typeof bar === "object")); // logs false
    要答全问题,还有其他两件事情值得注意:

    首先,上述解决方案将返回 false,当 bar 是一个函数的时候。在大多数情况下,这是期望行为,但当你也想对函数返回 true 的话,你可以修改上面的解决方案为:

    console.log((bar !== null) && ((typeof bar === "object") || (typeof bar === "function")));
    第二,上述解决方案将返回 true,当 bar 是一个数组(例如,当 var bar = [];)的时候。在大多数情况下,这是期望行为,因为数组是真正的对象,但当你也想对数组返回 false 时,你可以修改上面的解决方案为:

    console.log((bar !== null) && (typeof bar === "object") && (toString.call(bar) !== "[object Array]"));
    或者,如果你使用jQuery的话:

    console.log((bar !== null) && (typeof bar === "object") && (! $.isArray(bar)));

  • 相关阅读:
    springboot 踩坑之表单验证
    爬虫学习研究
    selenium+chrome知识
    每天学一点linux命令
    Javascript禁止子元素继承父元素的事件
    sass编译css(转自阮一峰)
    php配置虚拟主机的配置步骤(hosts、httpd.conf、vhosts.conf)1.配置本地的dns文件2.配置apache的主配置文件3.配置Apache的虚拟主机
    修改原代码定制bootstrap
    网页在线进行标准验证
    浏览器兼容性判定写法格式(ie)
  • 原文地址:https://www.cnblogs.com/dillonmei/p/12578682.html
Copyright © 2011-2022 走看看