? JS中强制类型转换非常常见,常常非常危险。这一章来具体介绍强制类型转换。
? 将值从一种类型转换为另一种类型通常有两种形式:
? 其实这两种分类的修辞并不特别准确。因为类型转换
var b = 1;
var a = String(b); // "1"
实际上更像是“强制的”类型转换,因此我们更应该用 显式、隐式来区别这两种方式。
? 抽象操作和转换规则定义了标量基本类型值之间的转换基本规则。
\(null \to \ "null"\)
\(undefined\to \ "undefined"\)
\(true \to \ "true"\)
数字的字符串化则遵循通用规则
数组,将所有单元字符串以后再用“,”来连接(\([1,\ 2,\ 3]\to \ "1,\ 2,\ 3"\))
JSON.stringify(..)也可以将JSON对象序列化为字符串也用到了TOSTRING。
? 假值会被强制转换为false,其他的值都会被判断为true。假值有:
? 显式强制类型转换可以将类型转换表达更加清楚,许多静态语言中的类型转换都是由此种方法实施。
? 隐式强制类型转换带来了隐患,同时也带来极大地遍历,可以说是动态语言的缺点也是优点。
// 静态类型的类型转换
SomeType x = SomeType(AnotherType(y))
// 动态语言的类型转换
SomeType x = SomeType(y)
? 这里存在一个非常常见的 误区:==(宽松相等)”检查值是否相等,===检查值和类型是否相等。
? 而正确的解释是:==允许在相等比较中进行强制类型转换,而===不允许。
? 前面对两个相等的不同解释同时表明性能的不同:
? 不同于误区,==的性能更差,因为并不是它比===少做一个检查类型,而是多做了一个强制类型转换。
? ==操作符带来的强制类型转换,导致了抽象相等可能导致的危险。
? <、>等关系操作符也会带来强制类型转换的风险。
原文:https://www.cnblogs.com/enmac/p/13216958.html