JS:类型、类型转换

有不少人认为:JavaScript 没有类型!

正解是JavaScript 中的变量没有类型,但值有类型。变量可以随时持有任何类型的值。

1. 值与类型

JavaScript 有 7 种内置类型:

  • 空值(null)
  • 未定义(undefined)
  • 布尔值(boolean)
  • 数字(number)
  • 字符串(string)
  • 对象(object)
  • 符号(symbol,ES6 中新增)

使用 typeof 运算符即可查看值的类型

特别注意:typeof null == "object",这已被设计和维护 JavaScript 的委员会 T39 认定是一个错误。但这个bug由来已久,也许永远也不会修复,因为这牵涉到太多的 Web 系统。

要区分 undefinedundeclared 状态:

  • 变量已声明,但未初始化,它的值就是 undefined;
  • 变量未声明,就是 undeclared,访问未声明变量会报错

2. 类型转换基本规则

在很多 JavaScript 书籍中强制类型转换被说成是危险、晦涩和糟糕的设计。但对于不懂的地方我们应该迎难而上,知其然并且知其所以然,不会因为种种传言就退避三舍。

字符串、数字和布尔值之间类型转换的基本规则;

a. ToBoolean:

图1:toBoolean 示例

b. ToString:

图2:toString 示例

b. ToNumber:

图3:toNumber 示例

倒计时 10 秒钟 ...

公布答案 ...

3. “显式”强制类型转换

“显式” 是指那些意图较明显的方式...

a. 转换为 Boolean:

Boolean(...)(不带 new); ! 运算符(转换为 boolean 并反转); if( ...) 语句中的条件判断表达式; for( ..; ..; ..) 语句中的条件判断表达式; while(..) 循环中的条件判断表达式; do...while(...) 循环中的条件判断表达式; ? : 中的条件判断表达式; 逻辑运算符 || 或 && 左边的操作数;

b. 转换为 Number:

Number(...)(不带 new) + 一元运算符 - 一元运算符(转换并反转符号位) parseInt(string, radix) parseFloat(value)

c. 转换为 String:

String(...) (不带 new) .toString()

3. “隐式”强制类型转换

“隐式” 指那些隐晦、易坑人的方式...

a. 加法与字符串连接(+):

最权威的解释,永远来自于规范

b. 宽松相等判定(==):

还是看规范中最权威的解释

下面以一道 JS 面试题

结束本文

题目: 实现一个函数,运算结果可以满足如下预期结果: add(1)(2) // 3 add(1, 2, 3)(10) // 16 add(1)(2)(3)(4)(5) // 15

下面是利用 valueOf 特性给出的一种解

参考:

https://tc39.github.io/ecma262/ 《JavaScript 权威指南》 《你不知道的 JavaScript(中卷)》 《JavaScript 语言精粹》 《Effective JavaScript》

原文发布于微信公众号 - WebJ2EE(WebJ2EE)

原文发表时间:2018-10-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券