有不少人认为:JavaScript 没有类型!
正解是:JavaScript 中的变量没有类型,但值有类型。变量可以随时持有任何类型的值。
1. 值与类型
JavaScript 有 7 种内置类型:
使用 typeof 运算符即可查看值的类型。
特别注意:typeof null == "object",这已被设计和维护 JavaScript 的委员会 T39 认定是一个错误。但这个bug由来已久,也许永远也不会修复,因为这牵涉到太多的 Web 系统。
要区分 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》