一篇搞定JS类型转换

165 阅读4分钟

前言:
这个还是需要记下来的。

类型转换规则

  • 原始 --> 数字

标题
true1
false0
null0
undefinedNaN
string空字符: 0
string去掉引号,不是数字 就是NaN 
  • true ——— 1

  • false ——— 0

  • null ——— 0

  • undefined ——— NaN

  • string

    • 空字符 —— 0
    • 去掉引号,不是数字 就是NaN 
  • 所有--> boolean

    • string: 空字符串 ""   false ,    "  "  true        '\t\r\n'   true

    • boolean: false

    • null: false

    • undefined: false

    • number:  0 、 NaN     false 

    • 其他都是 true

      Boolean([])  true
      Boolean({})  true
      
  • 原始--> 字符串

    • 加上引号
    • 数值 ——— '数值'
    • 字符串 ——— 不变
    • 布尔值 ——— "true" 、 "false"
    • undefined —— "undefined"
    • null ——— "null"
  • 对象 --> 原始

    先调用 valueOf 然后调用 toString

    • valueOf , toString

      • [] valueOf [] , [] toString ''
      • {} valueOf {}, {} toString '[object Object]'
      • function 调用 valueOf toString

valueOf 和 toString 是挂载在 Object上的, 任何对象或者值 都有这个方法

Number(对象)

1valueOf()   --->    原始数据类型  --->   String()
2toString()   --->   原始类型   --->   String()
3、报错
​
Number([])      // 0
Number({})      // NaN[].valueOf()     // []
[].toString()    // ''
​
​

String( 对象 )

  • 先调用 toString, 后调用 valueOf
1toString()   --->   原始类型   --->   String()
2valueOf()   --->    原始数据类型  --->   String()
3、报错
​
​
var obj = {a: 1}
console.log(obj.toString)   [object Object]
console.log(obj.valueOf)    {a: 1}
​
​
console.log(String(obj))    [object Object]

运算符规则

 *   算数运算符时,       转为  number 类型。  
        1、 如果有一方是  字符串    字符串拼接。   2、  NaN +  =  NaN

 *   逻辑运算符          转为  boolean 类型  

 *   比较运算符          转为  number  类型  

        *   \===   需要比较值和引用地址。
        *   \==  值比较
        *   NaN == NaN   值是false
        *   undefined  null  只有和自身比较,或者相互比较时  才是  true

面试官问: javascript 是怎么进行 数据转换的?为什么会存在 转换?

因为js 是 弱类型 动态类型语言。 变量没有类型限制,可以赋予任意值。

面试官问: 你能说说JS类型转换么?

1、 显式转换   Boolean()   String() Number() 包装类 类型 一来转换规则 直接转

  • Boolean()   转换   基本类型的时候    

        0   undefined  null  NAN  false   ''6种  转为  false。   
        其他都是 true
  • String()     转换   基本类型的时候    

      直接变成字符串
    

2、 转换复杂类型的时候

1.  Boolean(对象)    先调用 valueOf  如果得到对象    继续调用  toString()  

    如果得到 基本类型,  返回基本类型。 如果得到 对象, 报错。

2.  String(对象)    先调用 toString  如果得到对象     继续调用 valueOf()  

    如果得到  基本类型, 返回基本类型。 如果得到 对象, 报错。
    ​

3. 隐式转换   运算符 (算数运算符、 逻辑运算符、 比较运算符)  

  • 需要转为 原始类型进行算数 逻辑   比较。

    *   算数运算符时,       转为  number 类型。  
        1、 如果有一方是  字符串    字符串拼接。   2、  NaN +  =  NaN
    
    *   逻辑运算符          转为  boolean 类型  
    
    *   比较运算符          转为  number  类型  
    
        *   \===   需要比较值和引用地址。
        *   \==  值比较
        *   NaN == NaN   值是false
        *   undefined  null  只有和自身比较,或者相互比较时  才是  true
    

自动转换 Boolean 情况, js 遇到期望为 布尔值的地方

if()
!  三元

---------------------------------上题目 ---------------------------------

下面表达式的值 是什么? 腾讯

1、
      0 == ''0 == '0'
​
3、   2 == true2 == false
​
5、  false == 'false'false == '0'
​
7、 false == undefined
​
    false == null
​
9、 null == undefined
​
  '\t\r\n' == 0
​
\n               10            换行
​
\r                13            回车CR
​
\t                            跳格(移至下一列)。  tab键
​
​
​
​
​
​
​
​
​
​
​
1truetrue3false   ****
​
    false5falsetrue7falsefalse9truetrue

下面表达式 网易

null + '1' == null + 1
​
2、 null + 1 == 1null == 0
​
4、 null == undefined
​
null + 1 ==  undefined + 1
​
6、 null + null == undefined + undefined
'null1' ==   1   false2true3false4true5false6false

下面代码 输出什么? 新东方

var obj1 = {
    a: 1,
    b: 2,
    valueOf: function() {
        return this.a + this.b;
    },
    toString: function() {
        return 1;
    }
};
​
var obj2 = {
    toString: function() {
        return 0;
    }
};
​
​
console.log(obj1 + !!obj2);
 //  4

知乎大佬发布文章的图 我找不到链接了

image-20240622000910814.png

知乎大佬发布文章的图 我找不到链接了

false       =>  ![]
true        =>  !![]
undefined   =>  [][[]]
NaN         =>  +[![]]
0           =>  +[]
1           =>  +!+[]
2           =>  !+[]+!+[]
10          =>  [+!+[]]+[+[]]
​
​
Array       =>  []
Number      =>  +[]
String      =>  []+[]
Boolean     =>  ![]
Function    =>  []["filter"]
eval        =>  []["filter"]["constructor"]( CODE )()
window      =>  []["filter"]["constructor"]("return this")()

(! + [] + [] + ![]).length

! + [] 这么看 ! (+[])

+[] == +'' == 0 转数字 0

!0 true

![] []转boolean Boolean([]) == true !true == false

!(+[]) + [] + ![]

javascript 是怎么进行 数据转换的? 为什么会存在 转换。 因为js 是 弱类型 动态类型语言。 变量没有类型限制,可以赋予任意值。

显式转换有两种   Boolean()   String()
​
Boolean()    转换   基本类型的时候     0   undefined  null  NAN  false   ''6种  转为  false。   其他都是 trueString()     转换   基本类型的时候     直接变成字符串
​
转换复杂类型的时候
Boolean(对象)    先调用 valueOf  如果得到对象    继续调用  toString()   如果得到 基本类型,  返回基本类型。 如果得到 对象, 报错。
String(对象)    先调用 toString  如果得到对象     继续调用 valueOf()    如果得到  基本类型, 返回基本类型。 如果得到 对象, 报错。
​
隐式转换的话    运算符    算数运算符、 逻辑运算符、 比较运算符。   需要转为  原始类型进行算数  逻辑   比较。
​
算数运算符时,       转为  number 类型。   
                        1、 如果有一方是  字符串    字符串拼接。   2NaN +  =  NaN
逻辑运算符          转为  boolean 类型   
比较运算符          转为  number  类型   
                            1、 ===   需要比较值和引用地址。 
                            2、  ==  值比较
                            3NaN == NaN   值是false
                            4undefined  null  只有和自身比较,或者相互比较时  才是  true