JS类型检测主要有四种

  • 1、typeof Obj
  • 2、L instanceof R
  • 3、Object.prototype.toString.call/apply();
  • 4、Obj.constructor

    Remark前两种是数据类型检查方式,后两种是构造函数判断

首先了解下显式原型prototype

  • 每一个函数(fn)在创建之后都有一个prototype, 且指向函数的原型对象, 原型对象中的constructor属性又指向fn;
    fun = function () {};
    fun.prototype// 函数包含prototype指向它的原型对象 且 fun.prototype.constructor又指向fun函数

其次了解下隐式原型__proto__

  • JS中任意一个构建的对象都有__proto__, __proto__指向创建这个对象的constructor函数的prototype;

    • Array.proto => undefined;
    • Object.proto => null;
    // 1、字面量方式创建star
    let testObj = {a: 1};
    // 实际进行了以下步骤
    let textObj = new Object();
    textObj.a = 1;// 此时textObj有了__proto__,且__proto__指向Object.prototype
    // 同理 字面量创建一个数组
    let testArr = [];
    testArr = new Array();
    // 1、字面量方式创建end
    // 2、通过Object.create()构造 star
    const Obj = {a: 1};
    const copyObj = Object.create(Obj);
    // 内部是这样的
    function create(o) {
    function copy() {};
    copy.prototype = o; // **Remark此时Object.create创建的对象copyObj.__proto__直接指向Obj而不是Obj.prototype**
    return new copy(); // create也是new一个
    }
    // 2、通过Object.create()构造 end
    • 都是new一个实例对象

    显式原型prototype的作用

    • 用来实现基于原型的继承和属性共享

    隐式原形的作用

    • 构成原型链, 同样用于基于原型的继承, example: 当我们访问obj.a属性时, 如果obj找不到,那么会沿着__proto__依次寻找;(敲黑板: 重点是依次寻找);
    • 重写__proto__
    const arr = [];
    arr.__proto__.unPush = obj => console.log(obj);
    arr.push(1); // arr本身没有push(),但是它会从隐形原型上__proto__依次查找, 找到Array.prototype上有该方法所以可以使用
    arr.unPush(2); // 2

typeof

  • 缺陷有两点
  • 只能判断基本数据类型除了null,不能判断引用数据类型(判断都为Object);
  • typeof 1 => 'Number';
  • typeof {} => 'Object';
  • typeof null => 'Object';
  • typeof undefined => 'undefined'

L instanceof R 判断变量是否在某一个instanceof上("实例"上)

  • 判断左边的隐式原型是否在右边的显式原型上, 不是的话依次往上找直到为null为止; (new 操作符的反向查找)
function instance_of(L, R) {
L.__proto__ === R.prototype ? true : instance_of(L.__proto__, R);
// 一直从隐式原型链上查找
}
  • 只能判断引用数据类型
  • 右边只能是构造函数或者对象, 不然会抛出TypeError错误

Object.prototype.toString.call/apply();最完美的检测方法, 检测所有类型

  • 实现过程????!!!

constructor

  • Obj.constructor === Number/Array/Object/Function/String/Boolean
  • 字面量或者构造函数都能检测example: new Number()
  • 不能判断null和undefined

isArray(); isNaN();

//原文链接 https://blog.csdn.net/sunshine940326/article/details/77944768

JS类型判断&原型链的更多相关文章

  1. js 类型系统的核心:元类型、原型链与内省机制

    js 类型系统的核心:元类型.原型链与内省机制 二.JS数据类型 下面就来看看JS中的数据类型,在js中定义了如下几种数据类型:大方向上分为 基本数据类型(简单数据类型) 和 引用数据类型(复杂数据类 ...

  2. JS对象、原型链

    忘记在哪里看到过,有人说鉴别一个人是否 js 入门的标准就是看他有没有理解 js 原型,所以第一篇总结就从这里出发. 对象 JavaScript 是一种基于对象的编程语言,但它与一般面向对象的编程语言 ...

  3. JS面向对象之原型链

      对象的原型链 只要是对象就有原型 原型也是对象 只要是对象就有原型, 并且原型也是对象, 因此只要定义了一个对象, 那么就可以找到他的原型, 如此反复, 就可以构成一个对象的序列, 这个结构就被成 ...

  4. 类型和原生函数及类型转换(二:终结js类型判断)

    typeof instanceof isArray() Object.prototype.toString.call() DOM对象与DOM集合对象的类型判断 一.typeof typeof是一个一元 ...

  5. 深入理解JS对象和原型链

    函数在整个js中是最复杂也是最重要的知识 一个函数中存在多面性: 1.它本身就是一个普通的函数,执行的时候形成的私有作用域(闭包),形参赋值,预解释,代码执行,执行完 成后栈内存销毁/不销毁. 2.& ...

  6. JS类型判断typeof PK {}.toString.call(obj)

    参考链接:https://www.talkingcoder.com/article/6333557442705696719 先看typeof <!doctype html> <htm ...

  7. js类型判断:typeof与instanceof

    typeof用以获取一个变量或者表达式的类型,typeof一般只能返回如下几个结果: number,boolean,string,function(函数),object(NULL,数组,对象),und ...

  8. js类型判断及鸭式辨型

    目录 instanceof constructor 构造函数名字 鸭式辨型 三种检测对象的类方式: instanceof.constructor .构造函数名字 用法如下: 1)instanceof ...

  9. JS中的原型链和原型的认识

    这篇文章主要是学习一下JavaScript中的难点------原型和原型链 自定义一个对象 我们学习一门编程语言,必然要使用它完成一些特定的功能,而面向对象的语言因为符合人类的认知规律,在这方面做得很 ...

随机推荐

  1. js静态成员和实例成员

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. AttributeText创建多彩文字Label --- hl

    一般用富文本实现多种花样的Label文字,下图是利用UILabel分类快速创建的多彩多样lable文字,快速简单,自定义性强,更重要的是无代码污染,特别适合轻量级使用 https://github.c ...

  3. Python--列表简介

    Python--列表简介 目录 Python--列表简介 一.列表 1. 访问列表元素 2. 索引从0而不是1开始 3. 使用列表中的各个值 二.修改.添加和删除元素 1. 修改列表元素 2. 在列表 ...

  4. 关于spring data redis repository @RedisHash注解的对象上有DateTime属性字段的问题

    当你save保存的时候你会发现出现StackOverflow Exception,很明显出现了无限循环,可是仅仅是一个save操作,哪里来的无限循环呢? 最终发现就是DateTime导致的,因为将对象 ...

  5. SpringMVC 解析(三) Controller 注解

    我在前面的文章中介绍了Spring MVC最核心的组件DispatcherServlet,DispatcherServlet把Servlet容器(如Tomcat)中的请求和Spring中的组件联系到一 ...

  6. 磁盘分区 & Linux 三剑客之 awk

    今日内容 磁盘分区 Linux 三剑客之 awk 内容详细 一.磁盘分区 磁盘分区 --> 挂载 步骤 1.关机 2.添加硬盘 3.创建分区 fdisk /dev/sdb or gdisk /d ...

  7. ☆☆如何学习MATLAB☆☆

    大多数朋友第一次接触MATLAB一般都是在大学里面开设的MATLAB课程,第一次真正使用MATLAB是在自己的毕业论文中用到.所以对于MATLAB可以说是既爱又恨.爱,是因为使用MATLAB几乎可以实 ...

  8. Solution -「CF 917D」Stranger Trees

    \(\mathcal{Description}\)   Link.   给定一棵包含 \(n\) 个点的有标号树,求与这棵树重合恰好 \(0,1,\cdots,n-1\) 条边的树的个数,对 \(10 ...

  9. Solution -「FJWC 2020」人生

    \(\mathcal{Description}\)   OurOJ.   有 \(n\) 个结点,一些结点有染有黑色或白色,其余待染色.将 \(n\) 个结点染上颜色并连接有向边,求有多少个不同(结点 ...

  10. 使用java程序完成大量文件目录拷贝工作

    java程序完成目录拷贝工作 背景描述:我目录有140多个,每个目录里面都有一个src目录.我现在想要所有的src目录移动到同一个目录中. package com.util.cp; import ja ...