JavaScript – 类型转换
介绍
JS 是弱类型语言, 在编程时, 有许多自动类型转换的技巧, 虽然大家都不太鼓励, 尤其是用了 TypeScript 之后,
但无可否认自动转换很方便, 看上去也很干净. 所以这篇还是要介绍一些常见的类型转换语法.
题外话: C# 是强类型, 为什么可以 "abc" + 5, 但不可以 "1" - "2". 因为 + 会被 compile 成 String.Concat(...) 参考: stackoverflow – string = string + int: What's behind the scenes?
参考
Convert to boolean
除了下面五种值会被强转成 false, 其余值都是 true
Boolean(0); // zero
Boolean(NaN); // not a number
Boolean(''); // empty string
Boolean(undefined); // undefined
Boolean(null); // null
Auto convert to boolean
const obj = {};
if(obj) {
console.log('dada');
}
这种 if (value) 但 value 又不是 boolean 的情况是最常见的.
JS 会先把 value 强转成 boolean, 然后进入 if 判断,
Convert to number
for 原始类型
Number(123); // 123
Number('123'); // 123
Number(''); // 0
Number(true); // 1
Number(false); // 0 Number('123abc'); // NaN (因为有 abc)
Number(undefined); // NaN Number(null); // 0
前面 5 个可以理解, '123abc' 和 undefined 也可以接受, 最奇葩是 null 为什么是 0...背起来呗
for 对象会更乱水
const obj = {
toString() {},
valueOf() { }
} if(typeof obj.valueOf() === 'object') {
Number(obj.toString());
}
else {
Number(obj.valueOf());
}
它会拿对象的 valueOf 或 toString 的返回值来做强转. 顺序看上面 if else 的逻辑就明白了.
Auto convert to number
const value = 100 * null; // 0 (因为 null 被强转成 0, 所以 100 * 0 = 0)
console.log(value);
const value2 = 100 + undefined;
console.log(value2); // NaN (因为 undefined 强转时 NaN, 所以 100 + NaN = NaN)
当出现运算操作符时, JS 就会尝试强转成 number 了.
不过当 + 遇上 string 的时候例外哦, 会优先 auto convert to string
const value = '1' + 2;
console.log(value); // string: '12' const value2 = '2' - '1';
console.log(value2); // number: 1' 因为不是 + string
>, >=, <, <=
当 compare (>, >=, <, <=) 2 个不同类型的值时, JS 也是会强转 value 到 Number
忠告
由于 Number 强转非常混乱, 所以不推荐使用, 唯一可以用的是通过 + 符号把 string 转换成 nunber
const value = +'500'; // 500, ok 用但要确保 string 是纯数字哦
const value1 = +'500px' // NaN
const value2 = Number.parseFloat('500px') // 500 如果担心 string 不干净, 建议使用 parseInt or parseFloat
Convert to string
for 原始类型
String(123.50) // "123.5"
String(true) // "true"
String(false) // "false"
String(undefined) // "undefined"
String(null) // "null"
for 对象
和 Number 类似, 只是顺序换了, 它优先看 toString, 不行才用 valueOf
if(typeof obj.toString() === 'object') {
String(obj.valueOf());
}
else {
String(obj.toString());
}
Auto convert to string
const whateverType = 100;
const value = 'string value' + whateverType; // string value100
当一个 string + (加) 任何类型的值, 这个值都会被强转成 string.
最常用的地方就是 number + 'px', 不知不觉就用到了.
JavaScript – 类型转换的更多相关文章
- JavaScript 类型转换
在 JavaScript 中有 5 中不同的数据类型: string number boolean object function 3 种对象类型: Object Date Array 2 个不包含任 ...
- 松软科技Web课堂:JavaScript 类型转换
Number() 转换数值,String() 转换字符串,Boolean() 转换布尔值. JavaScript 数据类型 JavaScript 中有五种可包含值的数据类型: 字符串(string) ...
- javascript 类型转换。
学校js感觉好漫长,断断续续,要坚持每天都能学到点,总结了下数据类型的转换. Javascript的变量是松散类型的,它可以存储Javascript支持的任何数据类型,其变量的类型可以在运行时被动态改 ...
- 一道面试题引发的对javascript类型转换的思考
最近群里有人发了下面这题:实现一个函数,运算结果可以满足如下预期结果: add(1)(2) // 3 add(1, 2, 3)(10) // 16 add(1)(2)(3)(4)(5) // 15 对 ...
- Javascript类型转换的规则
Javascript的变量是松散类型的,它可以存储Javascript支持的任何数据类型,其变量的类型可以在运行时被动态改变.请看示例: 1 2 3 var n = 10; n = "hel ...
- javascript总结8:JavaScript 类型转换
1 JavaScript 数据类型转换 1.1 数字类型转字符串 n1 = 10;var n2 =String(n1); 或者 var n3 = n1.toString(n1); 1.2 字符串转数字 ...
- Javascript类型转换的规则实例解析
http://www.jb51.net/article/79916.htm 类型转换可以分为隐式转换和显式转换,所谓隐式转换即程序在运行时进行的自动转换,显式转换则是人为的对类型进行强制转换.Java ...
- Javascript类型转换的规则全面&附有实例
Javascript的变量是松散类型的,它可以存储Javascript支持的任何数据类型,其变量的类型可以在运行时被动态改变.请看示例: 1 2 3 var n = 10; n = "hel ...
- javascript类型转换、运算符、语句
1.类型转换: 分为自动转换和强制转换,一般用强制转换. 其他类型转换为整数:parseint(): 其他类型转换为小数:parsefloat(): 判断是否是一个合法的数字类型:isNaN(): 是 ...
- JavaScript 类型转换(2)
隐式类型转换 1. var a = "123"; a++; 这时候会将调用Number("123")将"123"转换成数字类型,然后再自增. ...
随机推荐
- TypeScript 学习笔记 — 泛型的使用(七)
目录 一.指定函数参数类型 单个泛型 多个泛型 二.函数标注的方式 类型别名 type 接口 interface *案例分析: 三.默认泛型 四.泛型约束 五.泛型接口使用 六.类中的泛型 泛型(Ge ...
- DataGridView1列宽根据内容自适应
DataGridView1列宽根据内容自适应 在使用DataGridView控件时,要使列宽根据内容自适应,你可以使用DataGridView的AutoResizeColumns方法.这个方法允许你根 ...
- Docker Compose 基本概要
Docker Compose 基本概要 Compose 是一个用于定义和运行多容器 Docker 应用程序的工具.使用 YAML 文件来配置多个应用程序的服务,包括生产.暂存.开发.测试以及 CI 工 ...
- PixiJS源码分析系列:第三章 使用 canvas 作为渲染器
使用 canvasRenderer 渲染 上一章分析了一下 Sprite 在默认 webgl 渲染器上的渲染,这章让我们把目光聚集到 canvasRenderer 上 使用 canvas 渲染器渲染图 ...
- C# 通过反射(Reflection)调用不同名泛型方法
概述 由于工作需要,需要通过数据类型和方法名控制方法走向 用到的数据类型有8种(string,Int16,Int32,Int64,Boolean,Byte,Single,Double) 读取的方法(参 ...
- RHCA rh442 010 文件系统结构 BDP调优 网卡驱动带宽
文件系统结构 用户通过虚拟文件系统,访问底层的文件系统 对于一块磁盘而言,MBR + 分区表记录硬盘的信息 对于一个分区而言,这个分区的第一个块,superblock,超级块,记录分区元数据信息 对于 ...
- PyCharm设置背景主题
PyCharm修改主题的路径: File->Settings->Appearance &Behavior->Appearance 1. Intellij:白色 2. Dar ...
- 前端RSA密钥生成和加解密——window.crypto使用相关
转自简书,原文地址,本文介绍window.crypto关于RSA方面的API. crypto API支持常用的rsa.aes加解密,这边介绍rsa的应用. 浏览器兼容性 window.crypto需要 ...
- 【转载】英特尔CEO:如果美出口管制太严,中国就必须生产自己的芯片
原文地址: https://mbd.baidu.com/newspage/data/landingsuper?context={"nid"%3A"news_9816136 ...
- 强化学习 —— reinforce算法中更新一次策略网络时episodes个数的设置对算法性能的影响 —— reinforce算法中迭代训练一次神经网络时batch_size大小的不同设置对算法性能的影响
本文相关的博客:(预先知识) 强化学习中经典算法 -- reinforce算法 -- (进一步理解, 理论推导出的计算模型和实际应用中的计算模型的区别) 本文代码地址: https://gitee.c ...