作者:DmitriPavlutincom/qq44924588...已收录,更多往期好评文章已归类,还有我的大量文档和教程资料也得到了整理。欢迎来到星和完美。面试时可参考考点复习。我希望我们能在一起。在日常的JS编码中,可能很难看出相等运算符(=)是如何工作的。特别是当操作数具有不同类型时。这有时会在条件语句中产生一些难以识别的错误。很容易看出为什么0==8是flase或''==false是true。但我不明白为什么{}==true是假的。接下来我就说说这是什么肥东西。在此之前,先说几个术语:运算符(Operator)表示运算的符号。例如,相等运算符==比较两个值,三级运算符===比较两个值及其类型,加法运算符+两个数字和/或连接两个字符串。操作数(Operand)是运算的主体,是执行运算的数量。例如,在表达式0=={}中,0是第一个操作数,{}是第二个操作数。JS中的基本数据类型(原始类型)有number、string、boolean、null和undefined、symbol。大家都说简历里没项目可写,所以给大家找了一个项目,还给了一个【搭建教程】。相等运算符===相等和不等运算符遵循以下基本规则(IEA规则):如果两个操作数的类型不同,则它们不严格相等如果两个操作数都为null,则它们严格相等如果两个操作数都未定义,则它们严格相等如果一个或两个操作数都是NaN,则它们不严格相等如果两个操作数都为真或都为假,则它们严格相等操作数是字符串类型并且具有相同的值,它们严格相等如果两个操作数的类型都引用相同的对象或函数,则在操作数不严格相等的所有其他情况下它们严格相等。规则很简单。值得一提的是,在同余运算中,与任何其他值相比,NaN都是假的。让我们考虑一些例子,这是学习这些规则的好方法。示例11==="1"//错误,规则1操作数属于不同类型(数字和字符串),根据IEA规则1,它们不相等。示例20===0//正确,规则6操作数具有相同类型和相同值,因此根据IEA规则6,它们严格相等。示例3undefined===undefined//true,规则3,两个操作数均未定义,应用IEA规则3,它们相等。Example4undefined===null//false,rule1因为操作数是不同的类型,所以根据IEArule1它们是不一样的。Example5NaN===NaN//false,IEArule5操作数是同一类型,但IEA规则4规定任何与NaN的比较都是不相等的。示例6varfirstObject={},secondObject=firstObject;secondObject['name']='Neo';secondObject===firstObject//true,IEA规则8两个变量firstObject和secondObject是对同一对象的引用,根据IEA规则8,它们是相等的。示例7[]===[]//false,IEA规则9文字[]创建一个新的数组引用。两个操作数是同一类型(对象),但它们引用不同的对象。根据IEA规则9,它们不相等。将对象转换为基元的规则对象到布尔值对象到布尔值的转换很简单:所有对象(包括数字和函数)都转换为true。包装对象也是如此:newBoolean(false)是一个对象而不是原始值,它将转换为true。Object-to-StringObject-to-String和Object-to-Number转换是通过对要转换的对象调用方法来完成的。麻烦的事实是JS对象有两种不同的方式来执行转换,接下来讨论的一些特殊场景使事情变得更加复杂。值得注意的是,这里提到的字符串和对象的转换规则只适用于原生对象。宿主对象(例如网络浏览器定义的对象)可以根据各自的算法转换为字符串和数字。所有的对象都继承了两种转换方法。第一个是toString(),它返回一个反映这个对象的字符串。默认的toString()方法不返回有趣的值:({x:1,y:2}).toString()//=>"[objectobject]"许多类定义了更具体的toString()方法版本。例如,数组的toString()方法将每个数组元素转换为字符串,并在元素之间添加逗号后连接生成的字符串。该函数的toString()方法为此函数返回一个实现定义的函数。在实践中,这里的实现通常是将用户自定义函数转换为JS源码字符串。DateDate的toString()方法返回人类可读的日期和时间字符串。RegExp的toString()方法将RegExp对象转换为表示正则表达式文字的字符串:下面是几个例子:[1,2,3].toString()//=>"1,2,3"(function(x){f(x);}).toString()//=>"function(x){f(x);}"/\d+/g.toString()//=>"/\d+/g"newDate(2019,9,16).toString()//=>"WedOct16201900:00:00GMT+0800(ChinaStandardTime)"另一个转换对象的函数是valueOf()。如果存在任何原始值,则默认将对象转换为表示其原始值。对象是复合值,大多数对象不能真正表示为原始值,因此默认的valueOf()方法只是返回对象本身,而不是返回原始值。数组、函数和正则表达式简单地继承此方法,并且在这些类型的实例上调用valueOf()方法简单地返回对象本身。Date的valueOf()方法返回它的内部表示:自1970年1月1日以来的毫秒数。newDate(2019,9,16).valueOf()//1571155200000通过使用toString()和valueOf()方法,您可以将对象转换为字符串,将对象转换为数字。但需要注意的是,在某些特殊场景下,JS会进行完全不同的对象到原始值的转换。JS中对象到字符串的转换经过以下几个步骤,我们简称为OPCA算法。如果方法valueOf()存在,则调用它。如果valueOf()返回原始值,则JS将值转换为字符串(如果本身不是字符串)并返回字符串结果。如果方法toString()存在,则调用它。如果toString()返回原始值,则JS将该值转换为字符串(如果本身不是字符串)并返回字符串结果。注意原始值到字符串的转换。否则,JS无法从toString()或valueOf()获取原始值,会抛出TypeError:cannotconvertobjecttoprimitivevalue异常当调用valueOf()方法时,大多数原始对象会返回对象本身。因此toString()方法的使用频率更高。关于Date对象的注意事项:当转换为原始值时,该对象会立即使用toString()方法转换为字符串。因此,规则1被跳过。普通的JS对象,{}或newobject(),通常通过用“,”分隔符连接它们的元素来转换为“[objectObject]”数组。例如[1,3,"four"]被转换为"1,3,four"。大家都说简历里没项目可写,所以给大家找了一个项目,还给了一个【搭建教程】。相等运算符==相等运算符“==”如果两个操作数不是同一类型,则相等运算符会尝试一些类型转换,然后进行比较。EqualityOperatorAlgorithm(EEA)如果操作数具有相同的类型,则使用上面的IEA来测试它们是否严格相等。如果不严格相等则不相等,否则相等。如果操作数有不同的类型:2.1如果一个操作数是null,另一个是undefined,它们是相等的2.2如果一个值是数字,另一个是字符串,先把字符串转换成数字,然后用转换后的值比较2.3如果一个操作数是布尔值,则将true转换为1,将false转换为0,然后使用转换后的值进行比较2.4如果一个操作数是对象,而另一个操作数是数字或字符串,则使用OPCA将对象转换为原始值原始值,然后用转换后的值进行比较。在上述其他情况下,操作数不相等示例11==true//true上述转换步骤:1==true(使用EEA规则2.3将true转换为1)1==1(操作数具有相同的类型。使用EEA规则1将相等转换为同余运算进行比较1===1(两个操作数都是数字并且具有相同的值。根据IEA规则6,这是相等的)true示例2''==0//上面的true转换步骤:''==0(一个操作数是字符串,另一个操作数是数字,根据EEA规则2.2,''转换为数字0)0==0(操作数类型相同,useEEArule1将相等转化为同余运算进行比较)0===0(操作数类型相同,值相同,所以根据IEArule6,是恒等)trueexample3null==0//falseaboveconversionstep:null==0(nullistheoriginaltype,0isthenumbertype.根据EEArule3)falseexample4null==undefined//trueaboveconversionstep:null==undefined(basedonEEArule2.1,operandsareequal)trueexample5NaN==NaN//false以上转换步骤:NaN==NaN(两个操作数都是数字。根据EEA规则1,将相等转换为同余运算以进行比较)NaN===NaN(根据IEA规则4,操作数严格不相等)false示例6['']==''//true上述转换步骤:['']==''(['']是一个数组,''是一个字符串。应用EEA规则2.4并使用OPCA规则2将数组转换为原始值'')''==''(两个操作数都是字符串,将相等转换为同余运算进行比较)''===''(两个操作数类型相同,值相同。使用IEA规则7,它们相等)true示例7{}==true//false上面的转换步骤:{}==true(使用EEA规则2.3,将true操作数转换为1){}==1(第一个操作数是一个对象,所以需要用OPCA将其转换为原始值)"[objectobject]"==1(因为第一个操作数是字符串,第二个操作数是数字,转换"[objectobject]"到根据EEA规则2.2的数字)NaN==1(两个操作数都是数字,因此使用EEA规则1将相等转换为一致运算以进行比较)NaN===1(根据IEA规则4,没有什么是相等的toNaN,theresultisfalse)false实用技巧即使在详细研究了本文中的所有示例并学习了算法之后,您会发现立即理解复杂的比较需要时间。告诉你一些技巧。把这篇文章收藏起来(使用Ctrl+D),下次看到有趣的情况,可以根据方程算法写一步步计算。如果你检查至少10个例子,你以后就不会有任何问题。现在试一下,[0]==0的结果和转换步骤是什么?相等运算符==执行类型转换。因此,可能会出现意想不到的结果,例如{}==true为false(参见示例7)。在大多数情况下,使用相等运算符===更安全。总结相等和同余运算符符号可能是最常用的运算符之一。理解它们是编写稳定且错误较少的JS的步骤之一。代码部署后可能存在的bug,无法实时获知。事后为了解决这些bug,花费了大量的时间在日志调试上。顺便推荐一个好用的bug监控工具Fundebug。原文:https://dmitripavlutin.com/th...交流文章每周更新。可以微信搜索“大千世界”阅读即时更新(比博文早一两篇)。这篇文章在GitHubhttps://github.com/qq449245884/xiaozhi已经收录,整理了很多我的文档。欢迎star和改进。可以参考考点面试。另外,关注公众号,后台会回复福利,看到福利就知道了。
