JavaScript中的类型转换
将值从一种类型转换为另一种类型,a -> ‘a’ ,称为类型转换。转换分为两种,一种显式的,一种隐式的,隐式的往往也是强制类型转换。强制类型转换总是返回标量基本类型,不会返回对象和函数。
如何区分?
类型转换(显式),通常发生在静态类型语言的编译阶段,而强制类型转换则发生在动态类型语言的运行时。
例如:
var a = 123
var b = a + '' // '123' 隐式强制类型转换
var c = String(a) // '123' 显示强制类型转换
1. 抽象一点的值操作
1.1 ToString
基本字符串化规则:
null -> 'null'
undefined -> 'undefined'
true -> 'true'
1 -> '1'
稍微特殊一点的情况
var a = 1.02 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000
console.log(a.toString()) // '1.02e+21'
数组的 toString 方法经过了重新定义,返回 每个元素使用 ,
拼接的字符串
var arr = [1,2,3]
arr.toString() // '1,2,3'
toString 可以显式调用,也会在需要的时候自动调用
1.2 JSON 字符串化
工具函数 JSON.stringfy() 在将 JSON 对象序列化为字符串也用到了 toString 方法
对于大多数简单值,JSON.stringfy() 和 toString 基本相同
JSON.stringify(123) // "123"
JSON.stringify("123") // ""123"" 在JSON中,所有的字符串都必须用引号括起来。即使在一些浏览器没有显示想要的结果
JSON.stringify(null) // "null"
JSON.stringify(undefined) // "undefined"
JSON.stringify() 在对象中遇见 undefined、function 和 Symbol 是会自动忽略,在数组中碰到就会返回 null
JSON.stringify(undefined) // undefined
JSON.stringify(function(){}) // undefinedJSON.stringify([1,nudefined,function(){},4]) // "[1,null,null,4]"
JSON.stringify({a:2,b:function(){}}) // "{"a":2}"
如果对象里定义了 toJSON方法,JSON.stringify() 会首先调用该方法,然后用返回值执行 JSON.stringify() ,这( toJSON方法)一般用于返回一个安全可被序列化的值。注意:toJSON 不是返回一个 JSON 字符串。
JSON.stringify() 的额外参数
- 如果额外参数(replacer) 是一个数组,表示要处理的对象的属性名称集合,而其他属性不会被处理,也不会被返回。
- 但如果是个函数,那么函数携带的参数分别表示键、值。如果要忽略就返回 undefined。
var obj = {a: 1,b: 'bbb',c: [1,2,3]
}
console.log(JSON.stringify(obj, [a, b])) // "{"a":1,"b":"bbb"}"const res = JSON.stringify(obj, function(k,v){if( k !== 'c') {return v}
})console.log(res) // "{"a":1,"b":"bbb"}"
JSON.string 还有一个可选参数 space,用来指定输出的缩进格式。space 为正整数时是指定每一级缩进的字符数,它还可以是字符串,此时最前面的十个字符被用于每一级的缩进
var a = { b: 42,c: "42",d: [1,2,3] };JSON.stringify( a, null, 3 );// {
// "b": 42,
// "c": "42",
// "d": [
// 1,
// 2,
// 3
// ]
// }JSON.stringify( a, null, "-----" );
// "{
// -----"b": 42,
// -----"c": "42",
// -----"d": [
// ----------1,
// ----------2,
// ----------3
// -----]
// }"
字符串、数字、布尔值和null的 JSON.stringify() 与 ToString 基本相同
如果传递给 JSON.stringify(…) 的对象中定义了 toJSON() 方法,那么该方法会在字符串化前调用,以此将对象转换为可字符串化的 JSON 值。
1.3 ToNumber
对于一些非数字值当作数字来进行运算,会发生以下转换:
- true —> 1
- false —> 0
- undefined —> NaN
- null —> 0
可以看出,toNumber 基本符合数字常量计算的规则,处理失败返回 NaN。
注意:ToNumber 对 0 开头的数字会按照十进制处理,而不是八进制。
ToPrimitive是一个抽象操作,在将值转换为相应的基本类型值时使用。它首先检查该值是否有valueOf()方法。如果有并且返回一个基本类型值,就使用该值进行强制类型转换。如果没有valueOf()方法,就会检查是否有toString()方法。如果存在toString()方法并且返回一个基本类型值,就使用该值进行强制类型转换。
但是从 ES5 开始,使用 Object.create(null) 创建的对象没有原型上的方法。所以无法强制类型转换。
var a = {valueOf: function(){return "42";}
};
var b = {toString: function(){return "42";}
};
var c = [4,2];
c.toString = function(){return this.join( "" ); // "42"
};
Number( a ); // 42
Number( b ); // 42
Number( c ); // 42
Number( "" ); // 0
Number( [] ); // 0
Number( [ "abc" ] ); // NaN
1.4 ToBoolean
在 JavaScript 中,1 不等于 true,而 0 也不等于 false ,这是无法一概而论的。
1.4.1 假值
JavaScript 中有以下假值:
- undefined
- null
- false
- +0、-0 和 NaN
如果我们不考虑 JavaScript 的规范,除了上述假值之外,其他的值都应该视为真值。
1.4.2 假值对象
var a = new Boolean( false );
var b = new Number( 0 );
var c = new String( "" );
假值对象并非包含了假值的对象…
var res = Boolean(a && b && c)
console.log(res) // true
假值对象是浏览器在特定情况下创建的外来值,尽管它们看起来像普通对象,但在布尔强制类型转换时结果为false。其中一个常见的例子是document.all,它以前是一个真值对象,但现在是一个假值对象。为了符合标准,IE不再支持使用if(document.all){…}。虽然我们无法完全摆脱document.all,但可以考虑修改JavaScript的类型机制来处理它。****
1.4.3 真值
真值就是除了假值之外的值。
2. 显式强制类型转换
显式类型转换,顾名思义,是在 JavaScript 中强制把一种数据类型变为另一种数据类型。JavaScript是动态类型的编程语言,但有时我们为了某些逻辑需要将一个数据类型强制转换为另一个数据类型,此时就会用到显式类型转换。
主要有以下几种方式:
Number()
:将其他任何数据类型转换为数字。String()
:将其他任何数据类型转换为字符串。Boolean()
:将其他任何数据类型转换为布尔值。
这是一些简单的示例:
// 将数字转为字符串
let num = 123;
let str1 = String(num); // 显式转换
console.log(typeof str1); // 输出 'string'// 将布尔值转为字符串
let bool = true;
let str2 = String(bool); // 显式转换
console.log(typeof str2); // 输出 'string'// 将字符串转为数字
let strNum = "123";
let number = Number(strNum); // 显式转换
console.log(typeof number); // 输出 'number'// 将字符串转为布尔值
let strBool = "true";
let boolean = Boolean(strBool); // 显式转换,任何非空字符串都会转为 true
console.log(boolean); // 输出 true
这些是显式类型转换在JavaScript中的基本用法
还可以通过
+
、-
、~
、!!
等等符号操作来进行类型转换
-
加号 (+) :将任何非 string 类型的值转换为 string 类型。
var num = 15; console.log(typeof +num); // "number" console.log(typeof (+num + "")); // "string"
在这个例子中, “+num” 仍然是一个数字。但是,当我们通过 “+num + “”” 将字符串与数字连接起来时,整个表达式将是字符串类型。
-
减号 (-):将字符串类型的数字值转换为 number 类型。
var strNum = "123"; console.log(typeof strNum); // "string" console.log(typeof -strNum); // "number"
然而,“-strNum”是一个负数,所以你可能需要再次使用 “-” 操作符来恢复其原始正值。
-
非 (~):在 JavaScript 中,非运算符 “~” 可以用于数组查找或者用来替代条件语句。“~” 运算符会将数字翻转,即计算其一补数。在类型转换中,它并非常用。
// 使用 "~" 运算符和 "indexOf()" 方法从数组中查找字符串 "word" // 如果 "word" 不在数组中,"indexOf()" 将返回 -1,"~" 将其改变为 0;否则,"~" 会把 "indexOf()" 返回的任何其他数值(代表 "word" 在数组中的位置)改变为一个非零数值 var index = ~someArray.indexOf("word"); // 如果 "index" 是非零值(意味着找到了 "word"),则执行 if 后面的代码块;如果是 0(意味着没有找到 "word"),则不执行 if (index)// 与上面的代码基本同样的逻辑,但是省略了定义变量 "index" 的步骤。它直接在 "if" 条件中进行查找和 "~" 运算,然后根据返回的是否为零值来决定是否执行后面的代码块 // 同样,如果找到了 "word",则执行 if 后的代码块;如果没有找到,不执行 // 这种写法更简洁,但可能在某些情况下可读性更差 if(~someArray.indexOf("word"))
-
双非 (!!):将任何非 boolean 类型的值转化为 boolean 类型。这个运算符被称为 “双否运算符”,会将值转换为真实的逻辑布尔值(true 或 false)。
var name = "AI"; console.log(typeof !!name); // "boolean"
“!!name”返回的是 “true”,因为我们对一个非空的字符串使用了 “!!” 操作符。
相关文章:
JavaScript中的类型转换
将值从一种类型转换为另一种类型,a -> ‘a’ ,称为类型转换。转换分为两种,一种显式的,一种隐式的,隐式的往往也是强制类型转换。强制类型转换总是返回标量基本类型,不会返回对象和函数。 如何区分? 类型…...

01-JVM 内存结构
JVM 内存结构 Java 虚拟机的内存空间分为 5 个部分: 程序计数器Java 虚拟机栈本地方法栈堆方法区 JDK 1.8 同 JDK 1.7 比,最大的差别就是:元数据区取代了永久代。元空间的本质和永久代类似,都是对 JVM 规范中方法区的实现。不过…...

树与二叉树(考研版)
文章目录 树与二叉树树的基本概念结点、树属性的描述树的性质 二叉树的概念二叉树的性质二叉树的构建二叉树的遍历先序遍历中序遍历后序遍历层次遍历 递归算法和非递归算法的转换源代码 线索二叉树二叉树的线索化线索二叉树 找前驱/后继 树和森林树的存储 树与二叉树的应用哈夫…...
前端车牌键盘组件
父组件 // 粘贴回去后格式化一下<div class"input-plate-wrap"><div v-for"(item, index) in keyBoard.kbLenght" :key"index"><divclass"plate-item"v-if"index ! keyBoard.kbLenght - 1":class"{ ac…...

什么是脚本文件,脚本的执行,脚本格式等
1.脚本文件是什么? 脚本文件是包含一系列计算机命令的文本文件,通常用于自动化任务、自定义功能或执行特定操作。这些命令通常按照一定的编程语法和语义规则编写,以便计算机能够逐行解释和执行它们。脚本文件通常包含了一组操作,…...

react 实战- 玩转 react 全家桶(进阶)学习
一个命令是怎么运行起来的? Shell运行一个命令,实际上是运行一个脚本 环境变量 装了node以后,node的路径,就被注册到了环境变量里. 一个js的东西,可以注册? bin Webpack配置 构建 import A from A , const Arequire(A) 为什么可以这么写?为哈都行?本质上,是构建工…...
【Python】取火柴小游戏(八什博弈)
# 火柴游戏:Python编程示例 当我们想要玩一个简单而有趣的游戏,同时又想锻炼自己的编程技能时,一个经典的选择就是火柴游戏。这个游戏的规则很简单:有一堆火柴,每次可以拿走1到6根,两名玩家轮流取火柴&…...

【Redis安装】Ubuntu和Centos
此处安装的是 Redis5 在 Ubuntu 系统上 切换到 root 用户下,su 命令切换使用 apt 可以搜索 redis 相关软件包 apt search redis使用 apt 命令安装 redis apt install redis手动修改配置文件 redis.conf cd /etc/redis/ vim redis.conf修改以下两处 重启服务器 …...

【Java】ArrayList集合使用
ArrayList集合常见方法 方法名称说明public boolean add(E e)将元素插入到指定位置的arraylist中,返回值:返回boolean类型public E remove(int index)删除 arraylist里的单个元素,返回值:返回删除之前的元素public E set(int inde…...

【proteus】8086仿真/汇编:创建项目并添加汇编代码文件
1.创建好新项目 2.点击source code 弹出VSM 3. 4.注意两个都不勾选 可以看到schematic有原理图出现 5. 再次点击source code 6.project/project settings,取消勾选embed 7. add 8.输入文件名保存后: 注意:proteus不用写dos的相关语句 。...

如何给Github上的开源项目提交PR?
前言 对于一个热爱开源的程序员而言,学会给GitHub上的开源项目提交PR这是迈出开源的第一步。今天我们就来说说如何向GitHub的开源项目提交PR,当然你提交的PR可以是一个项目的需求迭代、也可以是一个Bug修复、再或者是一些内容文本翻译等等,并…...
【Java】小计 TCP UDP的区别
面向连接 TCP面向连接,需要连接,而UDP不需要建立连接 可靠性 TCP协议通过确认应答、连接管理、流量控制、拥塞控制来确保可靠性传输;UDP不保证可靠性传输。 性能 TCP传输效率慢,需要较多的资源开销,UDP传输效率快&am…...

Day 1 Vue 页面框架
现在前端框架越来越像后端了,特别是TypeScript这样的语言出现后,开发前端的体验跟后端渐渐接近了。当然,作为一个后端,直接上手前端,还是有很多坑要填的。 本次开发,前端页面框架直接选择Vue。原因很简单&…...
ChatGPT课件汇总介绍
第二节:有效管理 Token,充分发挥 ChatGPT 的能力 OpenAI 官方计算token的测试地址:https://platform.openai.com/tokenizer 第三节:探索ChatGPT在不同领域的创新应用 1、小说撰写 1、我希望你能作为一个小说家。我会给你一个主题,请写出有创意的、吸引人的故事,能够长时…...

自然语言处理---RNN、LSTM、GRU模型
RNN模型 RNN模型概述 RNN(Recurrent Neural Network),中文称作循环神经网络,它一般以序列数据为输入,通过网络内部的结构设计有效捕捉序列之间的关系特征,一般也是以序列形式进行输出。RNN的循环机制使模型隐层上一时间步产生的…...

rust学习——方法 Method
文章目录 方法 Method定义方法self、&self 和 &mut self方法名跟结构体字段名相同 带有多个参数的方法关联函数多个 impl 定义为枚举实现方法 rust 结构体与枚举的区别回答1回答2 方法 Method 从面向对象语言过来的同学对于方法肯定不陌生,class 里面就充斥…...

目录遍历漏洞
漏洞挖掘之目录遍历漏洞 (baidu.com) 从0到1完全掌握目录遍历漏洞 0x01 什么是目录遍历漏洞 目录遍历漏洞是由于网站存在配置缺陷,导致网站目录可以被任意浏览,这会导致网站很多隐私文件与目录泄露。 比如数据库备份文件、配置文件等,攻击…...

Python基础入门例程10-NP10 牛牛最好的朋友们
目录 描述 输入描述: 输出描述: 示例1 解答: 说明: 描述 牛牛有两个最好的朋友,他们的名字分别用input读入记录在两个字符串中,请使用字符串连接()帮助牛牛将两个朋友的名字依…...

html web前端,登录,post请求提交 json带参
html web前端,登录,post请求提交 json带参 3ca9855b3fd279fa17d46f01dc652030.jpg <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title></t…...
防火墙实验
防火墙 ping(网络测试工具,测试主机之间的可达性)原理: 发送一些小的网络数据包(ICMP数据包)到目标主机,并等待目标主机返回一个响应(通常是回显应答 Echo Reply)。 ss…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...