JS类型-typeof-instanceof-隐式转化

javascript类型判断与等值判断,详解等于操作符== 和 全等操作符 === 以及 typeof instanceof Object.prototype.toString.call()之间的区别 javascript类型判断与等值判断,详解等于操作符== 和 全等操作符 === 以及 typeof instanceof Object.prototype.toString.call()之间的区别与联系 阅读详情
基本类型(原始类型):
  1. String,Number,Boolean,null,undefined,Symbol,BigInt
  2. 是指存放在栈内存中的简单数据段,数据大小确定,内存空间大小可以分配,它们是直接按值存放的,
  所以可以直接按值访问。

引用类型:
  1. Array,Function,Date,RegExp等等
  2. 其“变量名”保存在“栈内存”中,其真实值保存在“堆内存”中 而栈中的值保存的是指向“堆内存”的地址
  也就是“指针”  
typeof:
  1. 针对后面的表达式 取其类型
  2. 除null 其他很容易得到类型的字符串说明
    2.1 typeof 1 // 'number'
    2.2 typeof '1' // 'string'
    2.3 typeof true // 'boolean'
    2.4 typeof undefined // 'undefined'
    2.5 typeof Symbol() // 'symbol'
    2.6 typeof [] // 'object'
    2.7 typeof {} // 'object'
    2.8 typeof console.log // 'function'
    2.9 typeof null // 'object'
  3. 缺点就是不好区分值为'object'的真实类型
  4. 除 Function 外的所有构造函数的类型都是 'object' 如 typeof new String('') // 'object' 
  5. 注意取的值均为“小写的字符串类型”
instanceof:
  1. 用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
  2. object(某个实例对象) instanceof constructor (某个构造函数) 
    2.1 ({}) instanceof Object // true
    2.2 new Date() instanceof Date // true
    2.3 new String('') instanceof String // true
    2.4 console.log instanceof Function // true
    2.5 new Number(0) instanceof Number // true
最直接取类型操作:
    Object.prototype.toString.call(xxx)  &&  Object.prototype.toString.call(xxx).slice(8,-1)
    1. Object.prototype.toString.call('123') -> "[object String]" -> "String"
    2. Object.prototype.toString.call(123) -> "[object Number]" -> 'Number'
    3. Object.prototype.toString.call(true) -> "[object Boolean]" -> 'Boolean'
    4. Object.prototype.toString.call(null) -> "[object Null]" -> 'Null'
    5. Object.prototype.toString.call(undefined) -> "[object Undefined]" -> 'Undefined'
    6. Object.prototype.toString.call(Symbol()) -> "[object Symbol]" -> 'Symbol'
    7. Object.prototype.toString.call(console.log) -> "[object Function]" -> 'Function'
    8. Object.prototype.toString.call({}) -> "[object Object]" -> 'Object'
    9. Object.prototype.toString.call([]) -> "[object Array]" -> 'Array'
    10. Object.prototype.toString.call(new Date()) -> "[object Date]" -> 'Date'
    11. Object.prototype.toString.call(Math) -> "[object Math]" -> 'Math'
    12. Object.prototype.toString.call(Math.abs) -> "[object Function]" -> 'Function'
    13. Object.prototype.toString.call(Math.abs()) -> "[object Number]" -> 'Number'
常见的隐式转化分析:

一. 比较运算符 > < >= <=
1. 两边都是“数字类型” 则直接比较大小
2. 若含有“非数字类型” 则会将“非数字类型”转化成“数字类型”再比较大小
3. 若两则均为“字符串类型” 则不会转化为数字 相反会比较字符的“Unicode编码大小”


二. 其他类型转化为Boolean类型
1. 只有“null”,"undefined","0","false","NaN","空字符串"这6种情况转化布尔值为false
2. 除上面的6种情况 其余均为true

三. 其他类型转化为Number类型
1. null: 转化为0
2. undefined: 转化为NaN
3. Boolean: true转为1,false转为0
4. String: 纯数字字符串转化为对应的数字,空字符串转化为0,其余情况则为NaN;
5. Array: []转化为0;[0]转为0,[2]转为2;['a']转为NaN
6. Object: 首先会调用对象的valueOf()方法若返回原始类型则返回若返回非原始类型则继续调用toString()
           方法,若为原始类型则返回 否则报错;
           {}转为NaN;{x:1}也转化为NaN;{valueOf(){return 1}}转为1

四. 对象转为其他类型(原始类型)
1. 当对象转为其他原始类型时,会先调用对象的valueOf()方法,
   如果valueOf()方法返回的是原始类型,则直接返回这个原始类型;

2. 如果valueOf()方法返回的是不是原始类型或者valueOf()方法不存在,
   则继续调用对象的toString()方法,如果toString()方法返回的是原始类型,
   则直接返回这个原始类型,如果不是原始类型,则直接报错抛出异常。

3. 对于不同类型的对象来说,转为原始类型的规则有所不同,比如Date对象会先调用toString。

五. 宽松相等(==)的隐式转换
1. “字符串”与“数字”类型比较时:(字符串类型转化为数字类型)
  1.1 纯数字字符串 -> 数字类型
  1.2 空字符串 -> 0
  1.3 其余情况则 -> NaN

2. “布尔”与其他类型比较时:(布尔类型转化为数字类型)
  2.1 true -> 1
  2.2 false -> 0

3. null类型与undefined类型与其他类型比较:
  3.1 null == null (true)
  3.2 undefined == undefined (true)
  3.3 null == undefined (true)
  3.4 null === undefined (false)
  3.5 其他类型与null&undefined比较情况均为false

4. 对象与原始类型比较:
  4.1 对象与原始类型相比较时,会把对象按照对象转换规则转换成原始类型,再比较。
  4.2 {} == 0 // false ({}->valueOf()->{}->toString()->"[object,object]"->NaN)
  4.3 {} == "[object,object]" // true
  4.4 [] == false // true ([]->valueOf()->[]->toString()->""->false转0->""转0即相等)
  4.5 [1,2,3] == '1,2,3' // true ([1,2,3]->valueOf()->[1,2,3]->toString()->"1,2,3"即相等)

5. 对象与对象比较:
  5.1 俩个对象指向同一个对象,相等操作符返回true,否则返回false
  5.2 var a = {};var b = {}; a == b; // false
  5.3 var a = {};var b = a; a == b // true
  5.4 var a = [];var b = []; a == b // false
  5.5 [] == ![] // true (![] -> Boolean([]) -> !true -> 即[] == false比较 -> []转化为
      原始类型 -> valueOf() -> [] -> toString() -> "" -> 即"" == false -> "" == 0 -> 0 == 0)
  5.6 {} == !{} // false (!{} -> Boolean({}) -> !true -> 即{} == false -> {}转化为
      原始类型 -> valueOf() -> {} -> toString() -> "[object,object] -> 即
      "[object,object]" == false -> "[object,object]" == 0 -> NaN == 0)   

六. 字符串连接符与加号运算符
1. 看作字符串连接符情况:
  1.1 任意一边为“字符串类型” -> 字符串拼接
  1.2 任意一边为“对象类型” -> 将对象转化为可取得的原始值后进行字符串拼接

2. 看作加号运算符情况:
  2.1 两边均为数字类型 -> 正常加操作
  2.2 Boolean,Number,null,undefined,(除开String)均转化为Number类型后(但是需要注意
  Number(undefined) == NaN 而Number(null) == 0) -> 正常加操作
  2.3 NaN与任何类型相加均为NaN 包括它自己  
  2.4 [] + {} -> ([]转化为原始类型为""空字符串 而{}转化为原始类型为"[object,object]") -> "[object,object]"
  2.5 {} + [] -> (js解释器会将开头的 {} 看作一个代码块 即+[])->  +"" -> +0 -> 0
低功耗 AI 人体存在检测系统:智能照明与安防的高效解决方案 低功耗 AI 人体存在检测系统通过 “ESP32-C3 主控 + HX7110 AI 模块” 的硬件组合,搭配双重检测算法与深度睡眠机制,既解决了传统检测方案的误报问题,又满足了长时间低功耗运行需求。系统接线简单、代码可直接移植,可快速集成到智能照明、安防监控等物联网设备中,具备广泛的应用前景。 阅读详情

相关推荐

汽车车牌识别系统实现(二)--车牌定位+代码实现

汽车车牌识别系统实现(二)-- 车牌定位 前言 本人大四计算机视觉处理方面菜鸟一枚,因个人兴趣和毕设的缘故,故而想学习计算机视觉方面的内容,有不正确的地方还等各位大神批评指正。 图像预处理 照相机获取到汽车车牌图像时,绝大多数情况下,图像里只存在一个车牌的情况是不太现实的,一幅图像里存在建筑物、树、其它汽车等等是很正常的;而且绝大多数都会存在噪声点,这种情况下就会对车牌定位和识别造成极大程度的干扰...

奋斗の博客 1万+

JS之instanceof详解

instanceof 用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。 语法:object instanceof constructor object:某个实例对象 constructor:某个构造函数 用来检测 constructor.prototype 是否存在于参数 object 的原型链上。 示例 // 定义构造函数 function C () {} function D () {} // 实例化一个 o 对象 var o = new C() // tru

wfly blog 12万+

Windows 10下Carla 0.9.15安装避坑指南:从下载到运行的全流程解析

本文详细解析了在Windows 10系统上安装和运行Carla 0.9.15自动驾驶仿真平台的全流程。内容涵盖从系统环境准备、资源下载、Python依赖安装,到首次启动验证及常见错误(如DLL缺失、显卡驱动问题)的深度解决方案,旨在帮助用户快速搭建稳定的开发环境,并运行第一个自动驾驶Python脚本。

alice7model的博客 546

js中的instanceof原理

instanceof是用来检测构造函数的属性是否出现在某个实例对象的原型链上。但是也存在缺陷,就是它不能精确的判断 Object 类的具体数据类型。如何实现instanceof?

分享学习成果,希望可以帮助到你。 3689

CP2102 USB 转 UART 模块 PCB 设计项目

不幸的是,我的笔记本电脑只有 USB 端口,所以我需要在 USB 端口和 UART 接口之间进行转换。PCB 布局将足够小,因此我们不一定需要高速布线 USB 线路,但我们将在此将其作为一个简单的示例来实现,以展示如何在这种类型的电路板上实现它。相反,我们只使用屏幕左侧的电路。在这里,我们利用对之间的间距和到 L1 上的铜灌注的距离将差分阻抗设置为目标值。初始布局分为两个部分:USB 连接器和 USB 线路的 TVS 二极管放置在电路板左侧,带有二极管 D4 和 D5 的引脚接头放置在电路板右侧。

jkh920184196的博客 2401

Camera AF和FF

Camera按对焦功能可以分为FF(Fixed Focus)和AF(Auto Focus),即固定对焦和自动对焦。固定对焦顾名思义就是焦距是固定的,而自动对焦可以通过移动镜头位置来改变焦距从而实现自动对焦。以前摄像的功能机大多是固定对焦,现在的手机都带有自动对焦功能。 FF模组包括镜头(Lens),传感器(Sensor),红外滤色器(IR Filter),电路板(PCB),镜头支撑(Lens Holder),连接器(Connector)。 Fig 1. FF Module AF模组包括FF模组,音圈马达(V

Coppa的博客 1万+

js的各种数据类型判断(typeof、instanceof、Object.prototype.toString.call()、constructor、in、hasOwnProperty)

1.typeof Object.prototype.toString.call() constructor in hasOwnProperty() 基础类型: String、Number、Boolean、null、undefined、Symbol 存储在栈中,赋值变量和比较均为数据本身。 引用类型:Object、Array、Map、Function 存储在堆中,使用new创建,赋值变量和比较均是内存地址。

muzidigbig的博客 1万+

突发E层(Es层):短波通信中的“意外惊喜”与“隐形杀手”全解析

本文深入解析了突发E层(Es层)在短波通信中的双重作用,既可能带来超远距离通信的“意外惊喜”,也可能成为通信链路的“隐形杀手”。通过分析Es层的形成机制、时空分布规律及实战应用技巧,帮助通信爱好者与专业人员更好地利用或应对这一电离层现象,提升短波通信的可靠性与效率。

weixin_30443813的博客 825

详解JS中的instanceof使用及手写instanceof

instanceof 是什么? instanceof 是用来判断左侧对象是否是右侧构造函数的实例化对象,或则说左侧对象能否通过其隐式原型 **[[proto]]**在原型链上一层层向上查找到右侧函数的原型对象,即函数原型对象出现在实例对象的原型链上就返回 true。 通俗的理解: 右侧是不是左侧的爸爸、爷爷、祖宗,只要左侧对象继承自右侧函数就为 true instanceof 使用方式: object instanceof 构造函数,左侧必须为对象类型,右侧必须为函数类型。手撕instanceof, 原理

qq_40868156的博客 1万+

基于STM32F1XX 、HAL库的BH1745NUC-E2环境光传感器驱动应用C语言程序设计

printf("BH1745制造商ID: 0x%02X\r\n", BH1745_ReadManufacturerID(&hbh1745));#define BH1745_ADDR_HIGH 0x39 // ADDR引脚接VDD。#define BH1745_ADDR_LOW 0x38 // ADDR引脚接地。= 0xE0) // BH1745制造商ID为0xE0。// 清除RGBC测量使能位。printf("BH1745初始化失败\r\n");

PP_Cottage的博客 281

解锁PyCharm+Deepseek:本地部署AI编程超能力

在本次探索中,我们成功地在 PyCharm 中实现了 DeepSeek 的本地化部署,这一过程虽然涉及多个步骤,但每一步都为我们开启 AI 编程大门奠定了基础。从安装最新版 PyCharm,确保我们拥有一个功能强大且兼容性良好的开发环境,到注册 DeepSeek 账号并获取 API Key,这是连接我们与强大 AI 能力的关键纽带。接着,在 PyCharm 中安装 Continue 插件并进行精细配置,让 DeepSeek 能够深度融入我们的编程流程。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 5550

JavaScript中的instanceof运算符

JavaScript中的原型,原型链和instanceof运算符详解。

weixin_43263355的博客 6608

Altium Designer应用技巧13: 四层板的拼版方法

本文介绍在Altium Designer中,进行4层板的拼版方法。Altium Designer有多种拼版方法,本文选择最直观的复制、删帖方法来完成,步骤如下: 1、看一下原始文件,如下图所示,我们要对该板进行拼版操作。 2、通过菜单“报告”-“板子信息”得到板子大小,在这里一般切换为mm比较好操作,我们可以使用快捷键"q"。 3、如果是水平拼版,我们需要关心水平长度;如果是垂直拼版...

snmplink的博客 1万+

javascript中的数据类型

javascript跟很多语言相比,它有一个很突出的特点,它是一门弱类型语言。对于变量的声明,它不需要像C,或者java语言那样,要给定类型声明。比如我们定义一个整型变量a,在绝多数的语言都是这样声明的:int a,而在javascript 只需要使用关键字,var 或者let 声明即可:var a,let a。今天,我只要想探讨的是Javascript的数据类型。 1.类型检测 在Javascript中可以使用typeof 和 instanceof 来检测数据是那种类型。 typeof var test

bdh123b的博客 420

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

JS数据类型转换相关

parseInt相比Number,就没那么严格了,parseInt函数逐个解析字符,遇到不能转换的字符就停下来。4.如果其中一方为Object,且另一方为String、Number或者Symbol,会将。除了undefined、null、“”、NaN、0、-0、false之外,全都是true。Number转换的时候是很严格的,只要有一个字符无法转成数值,整个字符串就会被转为NaN。1.null==undefined,与其他类型比较,结果都是false。=、>、<)、if、while需要布尔值地方。

Agoni___的博客 263

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

js中typeof和instanceof详解

类数组对象和对象文章开始先来看一下js中数组对象和类数组对象。在js中数组是一个对象,数组对象继承自Array对象 var arr = []; var arr = new Array();这两句效果是相同的,由于Array.prototype上有大量的方法,因此数组对象可以使用多种方法。那么既然数组是一个对象,那么我们自然会想到用一个普通的对象来模拟数组对象,于是就出现了类数组对象 v

sysuzhyupeng的博客 2305

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

JS数据类型6+1,以及它的类型校验判断typeof instanceof区别

6个基本数据类型 数据类型 转化为false的值 number 0和NAN string 空字符串 Boolean false null null undefined undefined symbol 引申:symbol是ES6引入的一个新的特性,主要是用来解决属性名的冲突,因为传入对象属性时,同样的Symbol不相等; 创建 let a = new symbol(‘a’); let b = Symbol(); 它有下面几个特点: 1、每个Symbol实例都是

cxz 277

JS 数据类型 | 类型确认 | 类型转化 隐式转化规则

fill:#333;color:#333;color:#333;fill:none;12Number基本类型(原始数据)BigIntStringBooleanUndefinedNullSymbolDate引用类型JSONArrayObjectFunction数据类型。变量被重新赋值与这里的概念不同MathError原因: 值 undefined 实际上是从 值 null 派生来的2.原因:非数有无数种值,显然不是指向某一个地址。

海胆的博客 405

js中typeof和instanceof

对于typeof和instanceof,我们经常用来检测数据的类型。typeof可以检测Number、Boolean、String、Undefined、Function类型,对于其他类型的数据都返回为object;而instanceof可以弥补这一不足,也就是说最常用检测数组可以用arr instanceof Array就可以,当然,es5给我们提供了一个新方法isArray。 这里我...

dianfenju4557的博客 108

还在用typeof、instanceof?是时候给你的类型检查升个级了

toString的另一个强大之处在于可以使用特殊的对象属性自定义对象的toString方法的行为例如};对于大多数特定于环境的对象,都有一个这样的属性。// 特定于环境的对象和类的 toStringTag:// Window正如我们所看到的,输出结果恰好是(如果存在),只不过被包裹进了里。给大家举个在实际中使用的例子有时我们对某个值进行类型判断,不是仅为了知道原型类的名字,根本上是为了知道这个类的定义以及作用特别在自建类的使用中,定制化类型判断信息能极大减少我们的心智负担// 类声明文件。

军火库 509

jstutorial 语法篇精读:JavaScript 数据类型、typeof 运算符与 null/undefined 辨析

本文是 jstutorial(开源《JavaScript 教程》)语法篇的核心章节讲解,系统梳理 JavaScript 的六种数据类型、原始类型与合成类型的分类体系,深入剖析 `typeof`、`instanceof`、`Object.prototype.toString` 三种类型判断手段的差异与适用场景,并结合教程其他章节厘清 `null` 与 `undefined` 的历史渊源、使用区别以及

gitblog_00719的博客 485

javaScript 数据类型,变量的类型转换,typeof()可以判断变量类型

js的数据类型和常见隐式转化逻辑。 一、六种数据类型 原始类型(基本类型):按值访问,可以操作保存在变量中实际的值。原始类型汇总中null和undefined比较特殊。 引用类型:引用类型的值是保存在内存中的对象。 * 与其他语言不同的是,JavaScript不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象...

weixin_30515513的博客 118

JS中检测数据类型的7种方法

目录 一.JS中的数据类型: 二、检测数据类型的方法: 1、typeof 检测一些基本的数据类型 2、A instanceof B检测当前实例是否隶属于某各类 3、constructor构造函数 4、hasOwnporperty检测当前属性是否为对象的私有属性 5、is Array判断是否为数组 6、valueOf 7、Object.portotype.toString(最好的) 一.JS中的数据类型: 1) 简单类型:String、Number、Boolean...

王春燕的博客 2万+

js——数据类型转化、检查

1、数据类型 Number:所有数字 NaN 属性是代表非数字值的特殊值。该属性用于指示某个值不是数字。可以把 Number 对象设置为该值,来指示其不是数字值 提示:请使用 isNaN() 全局函数来判断一个值是否是 NaN 值 String:字符串 字符串嵌套需添加转义字符使用(/’或/”)或” ’ ’ “及’ ” ” ‘ Boolean:布尔值 true:非零、非空 fa...

肖的博客 278

JavaScript数据类型 以及类型转换(最新)

JavaScrip数据有两大类,七种: 原始值:1.Number 数字 2.String 字符 3. Boolean 布尔值 4.Null 空 5.Undefined未定义 6.Symbol符号(es6加上的,暂时不加讨论) 引用值: 7...

qq_41995398的博客 257

typeof instanceof操作符的相关知识

数据类型 ECMAScript中有5中基本数据类型:Undefined Null Boolean Number String。 Typeof运算符 对一个值使用typeof操作符可能返回下列某个字符串: ‘undefined’——如何这个值未定义 ‘boolean’——如果这个值是布尔值 “string”——如果这个值是字符串 “number”——如果这个值是数值 ...

Liuzhongbao123456的博客 156
上一篇: 选择排序&快速排序(JS)
下一篇: 浏览器相关知识1
RowanIT3
博客等级 码龄14年 13粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值