• js类型检测


          大约是三月初吧,在网上看到一道面试题,怎么判断一个变量类型是不是数组。然后从犀牛书以及查阅一些资料得到了答案。

    这里分为四种情况分析:

    1. 通过constructor

      [].constructor === Array; //true

      这种方法比较坑,不推荐,因为constructor是可以自己修改的。

    2. 通过instanceof

      [] instanceof Array; //true

      犀牛书给出的解释是在页面中含多个窗体或者iframe,那么会产生很多执行环境,一个iframe下的数组不是另一个窗体下构造函数的实例。那么如果出现这种极端条件,instanceof也不推荐使用。

    3. 通过Array.isArray

    在新版浏览器,IE9+都已经实现了原生方法

    Array.isArray([1,2]); //true
    
    1. 通过toSting

      Object.prototype.toString.call([]) === '[object Array]'

      在一些博客和犀牛书给出的都是这种方法。
      因为之前对call语法,toString方法的疑惑,导致我只能死记硬背这句代码。最近在回顾继承有关知识,学到了call方法,这段代码意思是对[]调用Object对象原型下的toString方法,不同于数组原型下的toString的方法,之所以疑惑,因为数组下的toString是把一个数组转成字符串。为了屏蔽掉call方法的干扰。

      我做了一个小处理

       Array.prototype.toString = Object.prototype.toString;
       [].toString(); // "[object Array]"
      

      验证出来了call的作用方法,同时也得出Array原型重写了toString方法(原型链关系推出来的)紧接着,我去了MDN查阅Object原型的toString方法,看看这究竟是什么鬼?原来这个返回对象类型字符串。同时像时间对象,正则对象,数学对象等等都能返回出来。

       var toString = Object.prototype.toString;
      
       toString.call(new Date); // [object Date]
       toString.call(new String); // [object String]
       toString.call(Math); // [object Math]
      
       //Since JavaScript 1.8.5
       toString.call(undefined); // [object Undefined]
       toString.call(null); // [object Null]
      

      好强大的样子!不过为什么官方取这个名字,好容易让人疑惑???

  • 相关阅读:
    【flutter学习】基础知识(一)
    【软件测试学习】 敏捷开发(二)
    【软件测试学习】 软件测试初步认识(一)
    【hugo】- hugo 监听浏览器切换title
    【hugo】- hugo 博客 添加鼠标单击特效
    春风十里
    一眼就能看懂的C#委托、多播委托和事件的区别与联系。
    js控制的DataGrid的URL参数不能动态刷新表格的问题
    [报错解决].net web api测试页面ajax 报错400 的问题
    [MVC]使用jquery.form.js 异步上传文件
  • 原文地址:https://www.cnblogs.com/Aralic/p/4470643.html
Copyright © 2020-2023  润新知