你不知道的JavaScript(中卷)笔记(二)

  1. 1. 强制类型转换
    1. 1.1. 抽象值操作
      1. 1.1.1. ToString
      2. 1.1.2. ToNumber
      3. 1.1.3. ToBoolean
      4. 1.1.4. 假值对象
    2. 1.2. 显示强制类型转换
    3. 1.3. 隐式强制类型转换
    4. 1.4. 宽松相等(==)和严格相等(===)
      1. 1.4.1. 其他类型和布尔类型相等比较
      2. 1.4.2. null和undefined之间相等比较
      3. 1.4.3. 对象与非对象之间的相等比较

强制类型转换

众所周知,JavaScript是弱类型语言,所以其值的类型是可以随意进行转换的,分为显式强制类型转换和隐式强制类型转换

1
2
3
let b = 12
let a = '' + b // 隐式强制类型转换
let c = String(b) //显式强制类型转换

抽象值操作

熟悉toString,toNumber,toBoolean,完成数值、字符串、布尔值互相的转换

ToString

基本类型值的字符串化规则是: undefined转换为'undefined'null转换为'null'true转换为'true',这些都能通过toString完成

1
2
let a = 1.07 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000;
a.toString() // "1.07e21"

对普通对象来说,只要不是自行定义,否则toString返回其内部 属性[[Class]]的值

1
2
let a = [1,2,3]
a.toString() // '1,2,3'

ToNumber

使用toNumber将非数字值转换为数字使用,包括true转为1false转为0

ToBoolean

JavaScript的值可分为可以被强制类型转换为false的值和其他值,而这部分能被转换的值称为假值

假值包括有

  • undefined
  • null
  • false
  • +0, -0NaN
  • ""

我们可以理解为假值以外的值都是真值,真值转换为布尔值都为true

假值对象

假值对象并不是对象为假值,而是进行对象封装的假值

1
2
3
let a = new Boolean(false)
let b = new Number(0)
let c = new String("")

上面大的即为假值对象,虽然他们都封装了假值,然而他们并不是false

1
2
let d = Boolean(a && b && c)
d //true

显示强制类型转换

显示强制类型即是显而易见的类型转换,包括toString,toNumber

1
2
let a = '12'
+a // 12

这里的一元运算符+即可将字符串显示强制转换为数字

1
2
let b = ''
!!b // false

这里的!!即可将值显示强制转换为布尔值

隐式强制类型转换

隐式强制转换往往带来很多误解和bug

针对+号,如果 + 的其中一个操作数是字符串(或者通过以上步骤可以得到字符串),则执行字符串拼接;否则执行数字加法

1
2
3
4
5
6
7
var a = 42; 
var b = "abc";
var c = null;
a || b; // 42
a && b; // "abc"
c || b; // "abc"
c && b; // null
  • ||&& 首先会对第一个操作数 第一个操作数 (a 和 c )执行条件判断,如果其不是布尔值(如上例)就先进行 ToBoolean强制类型转 换,然后再执行条件判断。

  • 对于|| 来说,如果条件判断结果为 true 就返回第一个操作数(a 和 c )的值,如果为 false 就返回第二个操作数(b ) 的值。

  • &&则相反,如果条件判断结果为 true 就返回第二个操作数(b )的值,如果为 false 就返回第一个操作数(a 和 c )的 值。

宽松相等(==)和严格相等(===)

===== 都会检查操作数的类型。区别在于操作数类型不同时它们的处理方式不同。

1
2
3
4
5
var a = 42; 
var b = "42";

a === b; // false
a == b; // true

具体转换规则为

(1) 如果 Type(x) 是数字,Type(y) 是字符串,则返回 x == ToNumber(y) 的结果。
(2) 如果 Type(x) 是字符串,Type(y) 是数字,则返回 ToNumber(x) == y 的结果。

其他类型和布尔类型相等比较

规则如下

(1) 如果 Type(x) 是布尔类型,则返回 ToNumber(x) == y 的结果;
(2) 如果 Type(y) 是布尔类型,则返回 x == ToNumber(y) 的结果。

nullundefined之间相等比较

(1) 如果 x 为 null ,y 为 undefined ,则结果为 true 。
(2) 如果 x 为 undefined ,y 为 null ,则结果为 true

对象与非对象之间的相等比较

(1) 如果 Type(x) 是字符串或数字,Type(y) 是对象,则返回 x == ToPrimitive(y) 的结果;
(2) 如果 Type(x) 是对象,Type(y) 是字符串或数字,则返回 ToPromitive(x) == y 的结果。