前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【前端】:类型与强制类型转换

【前端】:类型与强制类型转换

作者头像
WEBJ2EE
发布2020-02-19 11:37:44
9700
发布2020-02-19 11:37:44
举报
文章被收录于专栏:WebJ2EEWebJ2EE
代码语言:javascript
复制
目录
1. 类型
2. 强制类型转换
    2.1. 抽象操作——类型转换
        2.1.1. ToBoolean(argument)
        2.1.2. ToString(argument)
        2.1.3. ToNumber(argument)
        2.1.4. ToPrimitive ( input [ , PreferredType ] )
    2.2. Object.prototype.valueOf() 方法 
    2.3. Object.prototype.toString() 方法
        2.3.1. Array.toString()
        2.3.2. Date.toString()
    2.4. 显式强制类型转换
        2.4.1. 转为 String
        2.4.2. 转为 Number
        2.4.3. 转为 Boolean
    2.5. 隐式强制类型转换
        2.5.1. “+” 操作符
        2.5.2. “==” 宽松相等
        2.5.3. 抽象关系比较
3. 几道笔试题

1. 类型

正确理解 JavaScript 中的类型:

  • ECMAScript 标准定义了 8 种内置数据类型,包含 7 种基本数据类型(primitives)和对象(Object)。(备注:function 不是内置数据类型,实际是 object 的一个“子类型”,是“可调用对象”)
  • typeof null === "object"。虽然这已被设计和维护 JavaScript 的委员会 T39 认定是一个错误。但这个bug由来已久,也许永远也不会修复,因为这牵涉到太多的 Web 系统。
  • JavaScript 中的变量没有类型,但它们持有的值有类型。类型定义了值的行为特征。
  • undefined 与 undeclared 不是一回事。已在作用域中声明但还没有赋值的变量,是 undefined。相反,还没有在作用域中声明过的变量,是 undeclared,而且访问 undeclared 变量,会报 ReferenceError 错误!
  • typeof 有一个特殊的安全防范机制,typeof Undeclared == "undefined",常用于检测某组件是否存在。

图1-1:ECMAScript 定义的标准数据类型

图1-2:用 typeof 查看值的类型

图1-3:typeof 与 undeclared

2. 强制类型转换(Type coercion)

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

2.1. 抽象操作——类型转换

The ECMAScript language implicitly performs automatic type conversion as needed. To clarify the semantics of certain constructs it is useful to define a set of conversion abstract operations. The conversion abstract operations are polymorphic; they can accept a value of any ECMAScript language type. http://www.ecma-international.org/ecma-262/10.0/index.html#sec-type-conversion

2.1.1. ToBoolean(argument)

图2-1:ToBoolean 示例

图2-2:坑,别跳进去,笔试题经常玩这个

2.1.2. ToString(argument)

图2-3:ToString 规则细节

图2-4:ToString 示例

2.1.3. ToNumber(argument)

图2-5:ToNumber 规则细节

图2-6:ToNumber 示例

2.1.4. ToPrimitive ( input [ , PreferredType ] )

图2-7:ToPrimitive 示例

图2-8:Date-ToPrimitive 示例

图2-9:Symbol-ToPrimitive 示例

2.2. Object.prototype.valueOf() 方法

2.3. Object.prototype.toString() 方法

每个对象都有一个 toString() 方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString() 方法被每个 Object 对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 "[object type]",其中 type 是对象的类型。

2.3.1. Array.toString()

2.3.2. Date.toString()

2.4. 显式强制类型转换

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

2.4.1. 转为 String

代码语言:javascript
复制
String(...)(不带 new)

图2-10:String(value) 官方说明

2.4.2. 转为 Number

代码语言:javascript
复制
Number(...)(不带 new)
+ 一元运算符
- 一元运算符(转换并反转符号位)
parseInt(string, radix)
parseFloat(value)

图2-11:Number(value) 官方说明

图2-12:一元操作符 +、- 官方说明

2.4.3. 转为 Boolean

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

图2-13:Boolean(value) 官方说明

图2-13:逻辑运算符 ! 官方说明

2.5. 隐式强制类型转换

显式强制类型转换的作用是让代码清晰易读

隐式强制类型转换的作用是减少冗余

2.5.1. “+” 操作符

2.5.2. “==” 宽松相等

翻译:

  • 在 == 中 null 和 undefined 相等(它们也与其自身相等),除此之外其他值都不和他们两个相等。
  • String 与 Number,则用 ToNumber 将 String 转换为 Number 比较。
  • == 最容易出错的一个地方是 true 和 false 与其他类型之间的相等比较。布尔类型会先转换成数字,然后再进行比较。
  • 关于对象和基本类型的比较,会先将对象通过 ToPrimitive 转换为基本类型,然后比较。

2.5.3. 抽象关系比较

3. 几道笔试题

题目01:

题目02:

题目03:

题目04:

参考:

MDN,JavaScript,Grammer and Types: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Grammar_and_Types ECMAScript-262: http://www.ecma-international.org/ecma-262/10.0/index.html#sec-abstract-operations http://www.ecma-international.org/ecma-262/10.0/index.html#sec-unary-plus-operator https://tc39.es/ecma262/#sec-array.prototype.tostring https://tc39.es/ecma262/#sec-date.prototype.tostring https://tc39.es/ecma262/#sec-addition-operator-plus https://tc39.es/ecma262/#sec-abstract-equality-comparison https://tc39.es/ecma262/#sec-abstract-relational-comparison

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WebJ2EE 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档