介绍

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 – 类型转换的更多相关文章

  1. JavaScript 类型转换

    在 JavaScript 中有 5 中不同的数据类型: string number boolean object function 3 种对象类型: Object Date Array 2 个不包含任 ...

  2. 松软科技Web课堂:JavaScript 类型转换

    Number() 转换数值,String() 转换字符串,Boolean() 转换布尔值. JavaScript 数据类型 JavaScript 中有五种可包含值的数据类型: 字符串(string) ...

  3. javascript 类型转换。

    学校js感觉好漫长,断断续续,要坚持每天都能学到点,总结了下数据类型的转换. Javascript的变量是松散类型的,它可以存储Javascript支持的任何数据类型,其变量的类型可以在运行时被动态改 ...

  4. 一道面试题引发的对javascript类型转换的思考

    最近群里有人发了下面这题:实现一个函数,运算结果可以满足如下预期结果: add(1)(2) // 3 add(1, 2, 3)(10) // 16 add(1)(2)(3)(4)(5) // 15 对 ...

  5. Javascript类型转换的规则

    Javascript的变量是松散类型的,它可以存储Javascript支持的任何数据类型,其变量的类型可以在运行时被动态改变.请看示例: 1 2 3 var n = 10; n = "hel ...

  6. javascript总结8:JavaScript 类型转换

    1 JavaScript 数据类型转换 1.1 数字类型转字符串 n1 = 10;var n2 =String(n1); 或者 var n3 = n1.toString(n1); 1.2 字符串转数字 ...

  7. Javascript类型转换的规则实例解析

    http://www.jb51.net/article/79916.htm 类型转换可以分为隐式转换和显式转换,所谓隐式转换即程序在运行时进行的自动转换,显式转换则是人为的对类型进行强制转换.Java ...

  8. Javascript类型转换的规则全面&附有实例

    Javascript的变量是松散类型的,它可以存储Javascript支持的任何数据类型,其变量的类型可以在运行时被动态改变.请看示例: 1 2 3 var n = 10; n = "hel ...

  9. javascript类型转换、运算符、语句

    1.类型转换: 分为自动转换和强制转换,一般用强制转换. 其他类型转换为整数:parseint(): 其他类型转换为小数:parsefloat(): 判断是否是一个合法的数字类型:isNaN(): 是 ...

  10. JavaScript 类型转换(2)

    隐式类型转换 1. var a = "123"; a++; 这时候会将调用Number("123")将"123"转换成数字类型,然后再自增. ...

随机推荐

  1. git分支学习笔记2-解决合并的冲突

    来源:https://www.liuhaolin.com/git/115.html git中合并冲突是在不同的分支中同一个文件的内容不同导致的,如果进行合并就会冲突.文件可能是新增的文件,比如在两个分 ...

  2. tp5.1--数据库事务操作

    https://blog.csdn.net/qq_42176520/article/details/88708395 使用事务处理的话,需要数据库引擎支持事务处理.比如 MySQL 的 MyISAM  ...

  3. let 和 const 是 JavaScript 中用于声明变量的关键字

    let 和 const 是 JavaScript 中用于声明变量的关键字. let 关键字用于声明可变(可重新赋值)的变量.通过使用 let 关键字声明的变量可以在其作用域内被重新赋值.例如: let ...

  4. SQL Server调用OLE对象

    T-SQL 中是可以调用 OLE 的,将这一功能应用到触发器.存储过程等对象中,SQL Server 运用变得更贴近我们的功能,更加满足我们的需要. T-SQL 中有七个存储过程是围绕本节内容进行的, ...

  5. Java maven反应堆构建学习实践

    Java maven反应堆构建学习实践 实践环境 Apache Maven 3.0.5 (Red Hat 3.0.5-17) 应用示例 示例项目结构 maven示例项目组织结构如下 maven-stu ...

  6. Python threading实现多线程 基础篇

    讲多线程前,先要了解什么是进程,什么是线程,已经知道的请略过. 一.进程与线程: 进程是资源分配的最小单位,一个程序至少有一个进程. 线程是程序执行的最小单位,一个进程至少有一个线程. 进程都有自己独 ...

  7. redis复制replica

    通过查看log信息即可观察主机是否与从机正确连接,一般来说主机上有succeeded就是可以了 可以通过info replication查看自己的身份 role:master connected_sl ...

  8. 视觉测距和SLAM —— Visual Odometry / SLAM

    地址: https://www.cvlibs.net/datasets/kitti/eval_odometry.php

  9. 使用lanczos算法进行的预处理共轭梯度算法(Preconditioned Conjugate Gradients Method)

    构造预处理矩阵M(对称正定) 下图来自:预处理共轭梯度法(1) 下图来自:预处理(Preconditioning) 根据上面的对于预处理共轭梯度法的介绍,我们可以得到使用lanczos算法进行的预处理 ...

  10. 为什么不建议在华为技术论坛(昇腾论坛/mindspore技术论坛)发表帖子和技术博客

    华为的硬件设计技术在国内没得说,华为的硬件制造技术基本就没听说过,而华为的软件技术可是出了名的不咋样.一年前曾经在昇腾的页面进入到华为技术论坛,并且发了几篇关于mindspore的编译问题的帖子,由于 ...