Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

类型转化 #18

Open
YBFACC opened this issue Jun 16, 2020 · 0 comments
Open

类型转化 #18

YBFACC opened this issue Jun 16, 2020 · 0 comments

Comments

@YBFACC
Copy link
Owner

YBFACC commented Jun 16, 2020

类型转化

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

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

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

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

  • 基本类型
    • Boolean
    • String
    • Number
    • Null
    • Undefined
    • Symbol
    • Bigint
  • 引用类型
    • Object

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

举个例子

这是我在第一次使用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值:

  • false
  • 0
  • 0n(BigInt)
  • ""、‘’、``(空字符串)
  • null
  • undefined
  • NaN

原始值转换到原始值

  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

===与==

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

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

  • 如果 x 或 y 中有一个为 NaN,则返回 false

  • 如果 x 与 y 皆为 nullundefined 中的一种类型,则返回 true(null == undefined // true);否则返回 false(null == 0 // false);

  • 如果 x,y 类型不一致,且 x,y 为 StringNumberBoolean 中的某一类型,则将 x,y 使用 toNumber 函数转化为 Number 类型再进行比较;

  • 如果 x,y 中有一个为 Object,则首先使用 ToPrimitive 函数将其转化为原始类型,再进行比较。

此处引用来自 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 运算符规则与隐式类型转换详解

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant