最新要闻
- 多地政企联手 “真金白银”留人抢人
- 韩国人买鱼都带辐射检测仪了!专家:精准测量需超3小时 更多是安慰
- 奥迪向中国车企低头?大众也扛不住了!途昂家族至高优惠6万元
- 三星Galaxy Z Fold5外观曝光:厚度感人
- 今日入伏 头伏中暑指数地图出炉:12省份易出现中暑天气
- 魔方电池+六合一电机 续航1400公里 全新荣威D7 DMH混动版能否成为下一爆款?
- 电子竞技将在2026年名古屋亚运会继续作为正式项目
- 进击的巨人完结,请给艾伦一点温暖
- 小米14外观曝光:1mm窄边框之王预定
- 没遗憾了!小米14 Ultra将打造玻璃/陶瓷版本
- 领先版二代骁龙8折叠旗舰!小米MIX Fold 3用上罕见5倍长焦
- P5配音演员被喷退网:要求删除AI唱歌视频遭网友攻击
- 哪吒S剪刀门一般人需要不?哪吒CEO:我开了一个月放弃了
- 2022年省会城市人均GDP排名
- 高温天气下1岁幼儿不慎被锁车内,消防紧急破窗施救
- 期货交易能赚钱吗?
手机

英国房地产因利率上升陷入困境 房价正以2011年来最快速度下跌

宁夏评选出上半年10名“宁夏好人” 95后消防员因敬业奉献入选
- 英国房地产因利率上升陷入困境 房价正以2011年来最快速度下跌
- 宁夏评选出上半年10名“宁夏好人” 95后消防员因敬业奉献入选
- 离婚时共同债务应该怎么处理?
- 华为云盘古大模型3.0正式发布
- 支持自动长文生成,WPS AI发布:基于大语言模型的智能办公助手
- 《街头霸王6》全球总销量突破200万份 卡普空再次为其玩家送上礼物
家电
细节决定成败,聊聊JS的类型(下)
讲完了基本类型,我们来介绍一个现象:类型转换。
因为 JS 是弱类型语言,所以类型转换发生非常频繁,大部分我们熟悉的运算都会先进行类型转换。大部分类型转换符合人类的直觉,但是如果我们不去理解类型转换的严格定义,很容易造成一些代码中的判断失误。
(资料图)
其中最为臭名昭著的是 JavaScript 中的“ == ”运算,因为试图实现跨类型的比较,它的规则复杂到几乎没人可以记住。
这里我们当然也不打算讲解 == 的规则,它属于设计失误,并非语言中有价值的部分,很多实践中推荐禁止使用“ ==”,而要求程序员进行显式地类型转换后,用 === 比较。
其它运算,如加减乘除大于小于,也都会涉及类型转换。幸好的是,实际上大部分类型转换规则是非常简单的,如下表所示:
在这个里面,较为复杂的部分是 Number 和 String 之间的转换,以及对象跟基本类型之间的转换。我们分别来看一看这几种转换的规则。
StringToNumber
字符串到数字的类型转换,存在一个语法结构,类型转换支持十进制、二进制、八进制和十六进制,比如:
30;
0b111;
0o13;
0xFF。
此外,JavaScript 支持的字符串语法还包括正负号科学计数法,可以使用大写或者小写的 e 来表示:
1e3;
-1e-2。
需要注意的是,parseInt 和 parseFloat 并不使用这个转换,所以支持的语法跟这里不尽相同。
在不传入第二个参数的情况下,parseInt 只支持 16 进制前缀“0x”,而且会忽略非数字字符,也不支持科学计数法。
在一些古老的浏览器环境中,parseInt 还支持 0 开头的数字作为 8 进制前缀,这是很多错误的来源。所以在任何环境下,都建议传入 parseInt 的第二个参数,而 parseFloat 则直接把原字符串作为十进制来解析,它不会引入任何的其他进制。
多数情况下,Number 是比 parseInt 和 parseFloat 更好的选择。
NumberToString
在较小的范围内,数字到字符串的转换是完全符合你直觉的十进制表示。当 Number 绝对值较大或者较小时,字符串表示则是使用科学计数法表示的。这个算法细节繁多,我们从感性的角度认识,它其实就是保证了产生的字符串不会过长。
具体的算法,你可以去参考 JavaScript 的语言标准。由于这个部分内容,我觉得在日常开发中很少用到,所以这里我就不去详细地讲解了。
装箱转换
每一种基本类型 Number、String、Boolean、Symbol 在对象中都有对应的类,所谓装箱转换,正是把基本类型转换为对应的对象,它是类型转换中一种相当重要的种类。
前文提到,全局的 Symbol 函数无法使用 new 来调用,但我们仍可以利用装箱机制来得到一个 Symbol 对象,我们可以利用一个函数的 call 方法来强迫产生装箱。
我们定义一个函数,函数里面只有 return this,然后我们调用函数的 call 方法到一个 Symbol 类型的值上,这样就会产生一个 symbolObject。
我们可以用 console.log 看一下这个东西的 type of,它的值是 object,我们使用 symbolObject instanceof 可以看到,它是 Symbol 这个类的实例,我们找它的 constructor 也是等于 Symbol 的,所以我们无论从哪个角度看,它都是 Symbol 装箱过的对象:
var symbolObject = (function(){ return this; }).call(Symbol("a"));console.log(typeof symbolObject); //objectconsole.log(symbolObject instanceof Symbol); //trueconsole.log(symbolObject.constructor == Symbol); //true
装箱机制会频繁产生临时对象,在一些对性能要求较高的场景下,我们应该尽量避免对基本类型做装箱转换。
使用内置的 Object 函数,我们可以在 JavaScript 代码中显式调用装箱能力。
var symbolObject = Object(Symbol("a"));console.log(typeof symbolObject); //objectconsole.log(symbolObject instanceof Symbol); //trueconsole.log(symbolObject.constructor == Symbol); //true
每一类装箱对象皆有私有的 Class 属性,这些属性可以用 Object.prototype.toString 获取:
var symbolObject = Object(Symbol("a"));console.log(Object.prototype.toString.call(symbolObject)); //[object Symbol]
在 JavaScript 中,没有任何方法可以更改私有的 Class 属性,因此 Object.prototype.toString 是可以准确识别对象对应的基本类型的方法,它比 instanceof 更加准确。
但需要注意的是,call 本身会产生装箱操作,所以需要配合 typeof 来区分基本类型还是对象类型。
拆箱转换
在 JavaScript 标准中,规定了 ToPrimitive 函数,它是对象类型到基本类型的转换(即,拆箱转换)。
对象到 String 和 Number 的转换都遵循“先拆箱再转换”的规则。通过拆箱转换,把对象变成基本类型,再从基本类型转换为对应的 String 或者 Number。
拆箱转换会尝试调用 valueOf 和 toString 来获得拆箱后的基本类型。如果 valueOf 和 toString 都不存在,或者没有返回基本类型,则会产生类型错误 TypeError。
var o = { valueOf : () => {console.log("valueOf"); return {}}, toString : () => {console.log("toString"); return {}}}o * 2// valueOf// toString// TypeError
我们定义了一个对象 o,o 有 valueOf 和 toString 两个方法,这两个方法都返回一个对象,然后我们进行 o*2 这个运算的时候,你会看见先执行了 valueOf,接下来是 toString,最后抛出了一个 TypeError,这就说明了这个拆箱转换失败了。
到 String 的拆箱转换会优先调用 toString。我们把刚才的运算从 o*2 换成 String(o),那么你会看到调用顺序就变了。
var o = { valueOf : () => {console.log("valueOf"); return {}}, toString : () => {console.log("toString"); return {}}}String(o)// toString// valueOf// TypeError
在 ES6 之后,还允许对象通过显式指定 @@toPrimitive Symbol 来覆盖原有的行为。
var o = { valueOf : () => {console.log("valueOf"); return {}}, toString : () => {console.log("toString"); return {}}}o[Symbol.toPrimitive] = () => {console.log("toPrimitive"); return "hello"}console.log(o + "")// toPrimitive// hello
结语
在本篇文章中,我们介绍了 JavaScript 运行时的类型系统。这里回顾一下今天讲解的知识点。除了这七种语言类型,还有一些语言的实现者更关心的规范类型。
List 和 Record: 用于描述函数传参过程。
Set:主要用于解释字符集等。
Completion Record:用于描述异常、跳出等语句执行过程。
Reference:用于描述对象属性访问、delete 等。
Property Descriptor:用于描述对象的属性。
Lexical Environment 和 Environment Record:用于描述变量和作用域。
Data Block:用于描述二进制数据。
有一个说法是:程序 = 算法 + 数据结构,运行时类型包含了所有 JavaScript 执行时所需要的数据结构的定义,所以我们要对它格外重视。
最后我们留一个实践问题,如果我们不用原生的 Number 和 parseInt,用 JavaScript 代码实现 String 到 Number 的转换,该怎么做呢?请你把自己的代码留言给我吧!
更多补充内容请看:开发者网站
关键词:
-
-
-
-
细节决定成败,聊聊JS的类型(下)
多地政企联手 “真金白银”留人抢人
韩国人买鱼都带辐射检测仪了!专家:精准测量需超3小时 更多是安慰
奥迪向中国车企低头?大众也扛不住了!途昂家族至高优惠6万元
三星Galaxy Z Fold5外观曝光:厚度感人
今日入伏 头伏中暑指数地图出炉:12省份易出现中暑天气
魔方电池+六合一电机 续航1400公里 全新荣威D7 DMH混动版能否成为下一爆款?
电子竞技将在2026年名古屋亚运会继续作为正式项目
遇到的坑二:文件找不到(路径不对),包括配置文件找不到,excel文件找不到等等
进击的巨人完结,请给艾伦一点温暖
小米14外观曝光:1mm窄边框之王预定
没遗憾了!小米14 Ultra将打造玻璃/陶瓷版本
领先版二代骁龙8折叠旗舰!小米MIX Fold 3用上罕见5倍长焦
P5配音演员被喷退网:要求删除AI唱歌视频遭网友攻击
哪吒S剪刀门一般人需要不?哪吒CEO:我开了一个月放弃了
2022年省会城市人均GDP排名
spring启动流程 (4) FactoryBean详解
高温天气下1岁幼儿不慎被锁车内,消防紧急破窗施救
期货交易能赚钱吗?
旅韩大熊猫爱宝诞下双胞胎:熊猫宝宝萌化网友
联发科发布天玑6100+处理器:6nm工艺8核、5G功耗直降20%
无惧国产加长宝马X5 新款奔驰GLE上市:69.98万起
50多万博士生分布地图:近8成在省会 北京、江苏、上海最多
3899元起!红魔电竞平板首销:12.1英寸超大屏配骁龙8+
黄骅港:昔日“煤黑子” 今朝“绿色港”
go generate命令简介
北京通州摩托车飙车致2人身亡 官方回应属实:网友感慨就该禁摩
新能源车冰火两重天!比亚迪6月销量是特斯拉3倍 特斯拉单车利润是其8.5倍
沙特外交大臣出席俄罗斯-海合会部长级会议并与俄外长会面
现在的热只是预热!今日正式入伏 中央气象台继续发布高温橙色预警
空姐被甩到天花板 上海飞北京CA1524航班遇严重颠簸:国航回应
刚过去的6月是有记录以来最热的6月:科学家称不会很快降温 7月会更热
一个bug半年多都没修好 AMD RX 7000系显卡功耗过高问题还在
小米14设计图出炉:超窄直屏+直边 设计有传承了
商业银行发力“智慧金融”
选读SQL经典实例笔记04_日期运算(上)
价格战会毁了国内汽车产业吗??
双胞胎兄弟婚前婚后判若四人引热议:网友感慨岁月是把杀猪刀
文心一言 VS 讯飞星火 VS chatgpt (57)-- 算法导论6.4 1题
推动物业维修收费公开透明
漫威《死侍3》首曝剧照:休·杰克曼金刚狼回归 经典黄蓝制服
Intel中国成都工厂20年了!三大顶尖技能于一身
苹果曾经的灵魂人物 做了个46万元的限量产品
50岁老妈退休后 决定和我一起玩DNF
买二手显卡怕是矿卡?我来教你如何分辨!
招商局港口(00144.HK):7月10日南向资金增持1.4万股
今日张翰演过的电影大全(张翰演过的电影)
数字人民币SIM卡硬钱包功能来了!断网、没电也能支付
印尼一工厂上百人失控 狂哭抽搐:原因哭笑不得
唯一全自研国产CPU!龙芯又干了件大事
辽宁夏联输青岛!刘维伟+吴乃群狂笑,李虎翼累坏,鄢手骐很郁闷
乘联会秘书长:签承诺书不是搞价格垄断、不许车企降价
现在的热只是预热:南方最热的时候要来了 新一轮降雨中止北方极端高温
高铁路过桂林乘客齐刷刷惊叹拍照:重峦叠嶂美得像幅画
温网突发!冰美人收退赛大礼,13号种子伤心落泪:非常沮丧退场!
opencv-python图像处理模块(一)
lol探险家带什么符文(lol探险家ez符文怎么搭配)
Intel 14代酷睿笔记本榨干牙膏!8+16满血核心全线出击
未来属于HDMI还是DP接口?联想:恐怕都不是 而是Type-C
AMD锐龙7000差点上昂贵的VC均热板!可惜 效果奇差无比
《王者荣耀》联名宝格丽!芈月璀璨新程皮肤公布:高贵女王
快使用双截棍 | 低码之连接器 元服务开发的奇门武器
2023年全国残疾人游泳锦标赛落幕 安阳市运动员“泳”夺2金1银2铜
两部门:支持房地产市场政策期限延长至2024年12月31日
日本北海道砒霜泄露:最新监测发现已超标2100倍
多色可选:雪中飞男士冰丝薄款弹力牛仔裤29元抄底
8999元 戴尔新款37.5寸带鱼屏上市:支持IPS Black技术
马斯克开着Cybertruck兜风 答应网友加炮塔
特斯拉呼吁收紧史上最严排放标准 与传统车企“对着干”
大涨!光伏逆变器概念股风云再起,又将谁主沉浮?
1份价格2个会员!京东PLUS + 芒果TV会员年卡98元限时购
坦克300撞废逆行哈弗H6 长城回应:不能只看受损去判定谁更胜一筹
承认落后!奥迪被曝求助中国车企:将购买纯电平台 缩短研发时间
OPPO官宣与理想合作:理想全系均支持手表无感车钥匙
8月量产!iPhone 15/15 Pro新配色颜值高:辨识度拉满了
PlayWright(十四)- 前置和后置
Threads 四天破亿,扎克伯格暴击马斯克
债市日报:7月10日
新造车自燃 气不过把电池子公司给卖了
3.99万起买“埃尔法” 国产新能源未奥BOMA上市:丰田能气笑
14代酷睿i7-14700K解锁4个小核心:跑分飙升18%
全球多地遭遇极端高温天气:正值冬季的南极洲也出现异常
官司已打几十场!加多宝回应被判赔偿广药集团3.17亿元 :立即上诉
中学生40度天坐爸爸车后座认真背书
领域知识图谱-中式菜谱知识图谱:实现知识图谱可视化和知识库智能问答系统(KBQA)
【财经分析】“初尝”退市整理期 蓝盾转债价格单日缩水76.74%
储蓄国债利率再降 3%成历史
【高端访谈·REITs生态圈】积极参与REITs市场 构建保租房业务发展新格局——访城投控股董事长张辰
《种地吧》文化输出了!韩版7月底翻拍:爱奇艺版豆瓣9分
奥迪欲购买国产电动平台 网友意见出奇一致:比亚迪e3.0
宝妈买3斤干冰降温家中秒变仙境 消防:处置不当有危险
微信又双叒叕推送更新 网友:无用的功能又增加了
激进的骁龙8 Gen2旗舰来了!李杰暗示一加Ace 2 Pro遥遥领先
中央网信办:加强“自媒体”管理,强化资质认证展示
数据图表解析:掌握关键指标,提升数据分析能力
共探AI大模型时代下的挑战与机遇,华为云HCDE与大模型专家面对面
线段树
胡锡进发文回应卸任环球时报职务:已在2021年年底退休时卸去所有公职
三伏天将开启,南方电网最高用电负荷逼近历史纪录
收评:创业板指冲高回落收涨1.37% 多只超跌行业龙头放量反弹