YBFACC / blog

仅记录个人学习使用
3 stars 0 forks source link

类型转化 #18

Open YBFACC opened 4 years ago

YBFACC commented 4 years ago

类型转化

在日常使用if等判断语句时,你会碰到隐式转化。例如以下的例子👇

if(""){
  console.log('true')
}

所以了解类型转化也成了我们的必备技能。

基本数据类型和引用数据类型

所有基本类型的值都是不可改变的。但需要注意的是,基本类型本身和一个赋值为基本类型的变量的区别。变量会被赋予一个新值,而原值不能像数组、对象以及函数那样被改变。

举个例子

这是我在第一次使用js碰到的问题。

let str = 'abcdefg'
for (let i = 0; i < str.length; i++) {
  str[i] = 'A'
}
console.log(str)//abcdefg

str 不可变,可以验证基本类型的值不可变

Falsy

falsy 值 (虚值) 是在 Boolean 上下文中认定为 false 的值

js中只有以下7个Falsy值:

原始值转换到原始值

  1. 原始值到布尔值。

    除了 Falsy 其他的都转化为 true

  2. 原始值转化为字符串。

    相当于 原始值+“”

  3. 原始值转化为数字。

    Boolean:true=>1、 false=>0

    String:转化为数字或者 NaN 。

1_change

原始值转化到对象

  1. 如果是 nullundefined 使用 new Object() 转化为对象,将会创建并返回一个空对象。

3_change

  1. 使用对应的包装对象。BooleanStringNumberBigIntSymbol

对象转化到原始值

  1. 对象转化为布尔都为 true。
  2. 对象转化为字符串、数字。

这里有3个函数可能会影响结果。

Symbol.toPrimitive

toString()

valueOf()

Symbol.toPrimitive

一个对象可被转换为原始值。该函数被调用时,会被传递一个字符串参数 hint ,表示要转换到的原始值的预期类型。 hint 参数的取值是 "number""string""default" 中的任意一个

举个栗子

4_change

toString()

返回一个表示该对象的字符串。5_change

注意⚠️ toString 在不同类型中表现不同。(数组、函数等都会重写 toString 方法)

6_change

valueOf()

返回值为该对象的原始值。

注意⚠️ valueOf 在不同类型中表现不同。(数组、函数等都会重写 valueOf 方法)

8_change

测试

Symbol.toPrimitive优先

10_change

转为数字时,valueOf 优先。转为字符串时,toString 优先

11_change

判断 NaN

必须使用 Number.isNaN()isNaN() 函数。

12

===与==

===:进行比较时,不会类型转化。

==:进行比较时,会类型转化。

此处引用来自 JavaScript 运算符规则与隐式类型转换详解

测试

let a={name:'a'}
let b={name:'a'}
a==b//false
a==a//true

2个都是对象时,我猜测是:比较地址引用。

>比较

发现有趣的现象[6,2,3]>[9,6]的结果为 true

432

可以看到 > 可以对数组进行比较。(按字典序返回结果)

PS.如果字典序排列中,你缺少了一位,缺少的这一位比比0小

999

参考

Falsy

MDN

JavaScript核心概念(1):类型转换

Symbol.toPrimitive

JavaScript 运算符规则与隐式类型转换详解