js强制类型转换(隐式转换)

一、核心转换规则

  1. 转数字(Number)

    • null → 0

    • undefined → NaN

    • true → 1false → 0

    • 字符串:空串 "" → 0,非数字字符串(如 "abc")→ NaN

    • 对象:先调用 valueOf() 或 toString() 得到原始值,再转换

  2. 转字符串(String)

    • 数组 → 逗号分隔的字符串(如 [1,2] → "1,2"

    • 对象 → "[object Object]"

    • null → "null"undefined → "undefined"

  3. 转布尔值(Boolean)

    • Falsy 值(自动转 false):0""nullundefinedNaNfalse

    • Truthy 值(自动转 true):其他所有值(包括 []{}"0"


二、常见隐式转换场景

1. 算术运算符(+ - * /
  • + 运算符

    • 若任一操作数为字符串,执行字符串拼接:

      javascript

      "3" + 4;        // "34"(数字转字符串)
      [] + {};        // "[object Object]"([] 转 "",{} 转 "[object Object]")
    • 否则尝试转数字:

      javascript

      true + 1;       // 2(true → 1)
      null + 1;       // 1(null → 0)
  • 其他算术运算符(- * /:强制转数字:

    javascript

    "5" - 2;    // 3
    "10" / "2"; // 5
    "abc" - 1;  // NaN
2. 比较运算符(== != > <
  • == 的宽松相等(按优先级转换类型):

    javascript

    1 == "1";     // true(字符串转数字)
    true == 1;    // true(布尔转数字)
    [] == 0;      // true([] → "" → 0)
    [null] == 0;  // true([null] → "" → 0)
    {} == "[object Object]"; // true(对象转字符串)

    特殊规则

    • null == undefined 为 true(不转换)

    • NaN 与任何值(包括自身)比较均为 false

  • > < 比较:优先转数字:

    javascript

    "10" > 2;    // true("10" → 10)
    "abc" > 1;   // false("abc" → NaN,比较返回 false)
3. 逻辑运算符(if && ||
  • 条件判断:自动转布尔值:

    javascript

    if ("hello") { ... }  // true(非空字符串)
    if (0) { ... }        // false
  • || 和 &&:返回原值(非布尔值):

    javascript

    "foo" || "bar";  // "foo"(truthy 返回第一个值)
    0 || "default";  // "default"(falsy 返回第二个值)
4. 对象参与的转换
  • 对象先调用 valueOf()(默认返回对象自身),再调用 toString()

    javascript

    [] + 1;          // "1"([] → "" → 字符串拼接)
    {} + [];         // 0({} 被解析为空代码块,实际计算 +[] → 0)

三、避免陷阱的实践建议

  1. 使用 === 和 !==:严格相等避免隐式转换:

    javascript

    "1" === 1;    // false
    undefined === null; // false
  2. 显式转换:主动控制类型:

    javascript

    Number("123");  // 123(显式转数字)
    String(123);    // "123"(显式转字符串)
    Boolean([]);    // true
  3. 注意特殊值

    javascript

    isNaN(+"abc");  // true(检测 NaN)
    Object.is(NaN, NaN); // true(ES6 精准比较)

经典面试题

javascript

console.log([] == ![]); // true
// 解析:
// 1. ![] → false([] 是 truthy,取反为 false)
// 2. [] == false → [] == 0 → "" == 0 → 0 == 0 → true

console.log({} + []); // "[object Object]"
// 解析:{} 和 [] 均转字符串后拼接

如何是 a==1 && a==2 &&a==3为true

let a = {
    i:1,
    // valueOf:function(){
    //   return this.i++;
    // }
    toString:function(){
      return this.i++;
    }
  }
  if(a ==1 && a == 2 && a == 3){
    console.log('您好!');
  }

以下写法会报错

let obj = {
        name:"Rahul",
        valueOf:function(){
            return this;
        },
        toString:function(){
            return this;
        }
       }
       console.log(1 + obj);

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值