百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>JS教程> 前端笔试中的坑位-JS隐式转换问题
分享文章到:

前端笔试中的坑位-JS隐式转换问题

发布时间:09/01 来源:未知 浏览: 关键词:
我们在写笔试题的时候,经常碰到触及隐式转换的问题,例如

"1" + 2
obj + 1
[] == ![] 
[null] == false

=== 和 ==

=== 叫做严厉运算符,对象类型指向地址雷同或原始类型( 数值、字符串、布尔值)值雷同;==叫做相等运算符,类型不一样会停止转化再比力,undefined、null相等,对象类型还是比力援用。==运算符将原始值和其包装对象视为相等,但===运算符将它们视为不等。 所有obj.a==null(相当于obj.a=== null || obj.a ===undefined)。

相等运算符就是常常引发JS隐式转换的坑货,它也常常显现在我们的面试题中,不外我们在实际开发中,为了不不必要的问题要求使用严厉运算符,但是理解还是很有必要的。

想要理解JS隐式转换,就要先从三个知识点下手。

原始类型

原始类型(根本类型、根本数据类型、原始数据类型)是一种既非对象也无办法的数据。在 JavaScript 中,共有7种:string,number,bigint,boolean,null,undefined,symbol (ECMAScript 2016新增)

falsy 值 (虚值)

falsy 值 (虚值) 是在 Boolean 上下文中认定为 false 的值,在JavaScript只要 七个 falsy 值。

  1. false false 关键字
  2. 0 数值 zero
  3. 0n 当 BigInt 作为布尔值使用时, 遵从其作为数值的规则. 0n 是 falsy 值.
  4. 一个空字符串 (字符串的长度为零). JavaScript 中的字符串可用双引号 "", 单引号 '', 或 模板字面量 `` 定义。
  5. null null - 缺少值
  6. undefined undefined - 原始值
  7. NaN NaN - 非数值

特殊要说明的是,除了这七个对象全是真值,如new Number 和new Boolean 都是真值。

let b = new Boolean(false);i
f(b){
//会施行到这里。
}

四大转换规则

  • toString规则:其他类型的值转换为字符串类型的操纵

    • null => "null"
    • undefined => "undefined"
    • true => "true" false=>"false"
    • 10 => "10" "1e21"=>"1e+21"
    • [1,2,3] => "1,2,3"
    • Object对象 => "[Object Object]" 其实是调取toString办法
  • ToPrimitive规则:对象类型数组转为原始类型的操纵

    • 当对象类型需要被转为原始类型时,它会先查寻对象的valueOf办法,假如valueOf办法返回原始类型的值,则ToPrimitive的结果就是这个值
    • 假如valueOf不存在或者valueOf办法返回的不是原始类型的值,就会尝试调取对象的toString办法,也就是会遵照对象的ToString规则,然后使用toString的返回值作为ToPrimitive的结果
    • Date 是先toString再ValueOf
    • 假如在toString再ValueOf后都不克不及拿到原始类型,再推断相等、加减时就抛出Uncaught TypeError: Cannot convert object to primitive value
  • ToNumber规则

    • null=> 0
    • undefined => NaN
    • "123"=>123 "12ssd"=>NaN ""=>0
    • false => 0 true=>1
    • 数组、对象ToPrimitive
  • ToBoolean规则

    • js中七个falsy 值 (虚值) 为false,其他都为true

隐式转换

有了对上面知识点的认识,我们可以来一举拿下JS隐式转换了。

  • == 的历程(优先换成数字、字符串)
  1. 第一看==前后有没有NaN,有的话都是返回false。NaN不等于任何值,包罗其本身
  2. 布尔值会转成数字类型,true转成1,false转成0
  3. 数字和字符串比力,字符串会转成数字
  4. undefined和null除了和undefined或null相等,和其他比拟都是false
  5. 数字或者字符串和对象比拟,对象使用ToPrimitive规则转换。
  6. 当两个操纵数都是对象时,JavaScript会比力其内部援用,当且仅当他们的援用指向内存中的雷同对象(区域)时才相等,即他们在栈内存中的援用地址雷同。
  • +的历程(优先换成字符串、数字)
  1. 假如至少有一个操纵数是对象,它会被转换成原始值(字符串,数字或布尔);
  2. 转换之后,假如至少有一个操纵数是字符串类型,第二个操纵数会被转换成字符串,并且会施行连接。
  3. 在其他的状况下,两个操纵数都会转换成数字并施行算数加法运算。
  • -的历程(转换成数字) 这个就很简便了,全部用ToNumber规则转换成数字

检测学习成果

我们按照以上所学看几个笔试题。假如你都知道结果,就不消看我的废说明了。

[] == [] 
[] == ![] 
[null] == false

第一个,==摆布都是对象,比力援用地址,这个两个不一样的实例,必定不相等啊。 第二个,!的优先级高于==,所以先 [] 是真值,求非当让是false了,转成数字0,==左是对象右是数字,对象使用ToPrimitive规则转换成"",再用ToNumber规则就转成0了,推断为相等。 第三个,[null]ToPrimitive再ToNumber规则就转成0,false也转成0。

var  a = 1;
var  b = "3";

var obj1 = {
    i:1,
    toString:function() {
        return "1";
    },
    valueOf:function() {
        return 1;
    }
};
var obj2 = {
    i:1,
    toString:function() {
        return "2";
    }
};
var obj3 = {
    i:1,
    valueOf:function() {
        return 3;
    }
};
var obj = {
    i:1,
};
var objE = {
    i:1,
    valueOf:function() {
        return [];
    },
    toString:function() {
        return {};
    }
};


a+b  
a + obj  
a + objE 

a+obj1  
a+obj2  
a+obj3  

b+obj1  
b+obj2  
b+obj3  

a==obj2  
a==obj1

这道题比力简便你只要熟练把握我上面说的那几个知识点可以了。下面直接写出结果啦。

a + b    //"13"
a + obj  //"1[object Object]"
a + objE //Uncaught TypeError: Cannot convert object to primitive value

a+obj1  //2
a+obj2  //"12"
a+obj3  // 4

b+obj1  //"31"
b+obj2  //"32"
b+obj3  //“33”

a==obj2  //false
a==obj1  //true

最后提一个比力奇葩的问题。

定义一个变量a,使得下面的表达式结果为true

  a == 1 && a == 2 && a == 3

这里我简便提醒下,a如果一个对象,重写valueOf办法,让它每次隐式转换的时候,调取时i++。

在这里插入图片描述

valueOf()在Object上默许返回的是对象不是原始类型,它会再调取toString。所以只要重写toString也可以。

假如还是没有思绪,你们可以去看下这道题的文章原文从一道面试题说起—js隐式转换踩坑合集。

引荐教程:《JS教程》

以上就是前端笔试中的坑位-JS隐式转换问题的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有151人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板