js弱类型转换的知识点

本文属于转载知识点,如下是原博文做者:不死鸟哇的文章,文章连接:原文JavaScript里什么状况下a==!a为true呢?数组

今天群里有位同窗问了这样一个问题,JavaScript在什么状况下会出现变量a == !a为true呢?听说是在司徒正美的书里看到的。我以为这个问题有点意思,涉及到了隐式类型转换的问题,与你们分享一下吧!.net

    答案是当a = []的时候,这个答案我一开始也没想出来。而是在调试器试了几回以后知道的。可是其中的缘由我是明白的。这是由于JavaScript的类型转换。调试

    咱们先来考虑这个问题,console.log([] == false)会打印什么呢?对象

    答案是true。为何呢?blog

    首先,由于当"=="号两边其中一个是布尔值的话,先把它转换为数字(ECMAScript的规范)。因而就变成了求[] == 0。ip

    而后问题是为何[]==0会是true呢?这是由于当"=="的一边是字符串或数字,另外一边是对象的时候(数组也是对象),先把对象值转换为原始值再判断相等。对象值到原始值是怎么转换的呢?.对于全部非日期雷对象来讲,对象到原始值的转换基本上就是对象到数字的转换。有3个步骤:字符串

    1.全部对象先调用valueOf()方法,若是此方法返回的是原始值,则对象转为这个原始值。get

    2.若是valueOf方法返回的不是原始值,则调用toString方法,若是toString方法返回的是原始值吗,则对象转换为这个原始值。it

    3.若是valueOf和toString方法均没有返回原始值,则抛出TypeError异常.console

好,让咱们看看[]到原始值的转换是怎么样的?首先调用[].valueOf()方法,返回值是对象自身,即[],这不是一个原始值。因此继续调用[].toString()方法,返回的是空字符串"",这是一个原始值,因此此值就做为对象转换为原始值的输出。因而问题就变成了求"" == 0.

    最后,为何"" == 0会是true呢?相信不少同窗都知道了,当"=="两边一个是字符串一个是数字的时候,先把字符串转为数字,再进行比较。“”转成数字为0,因此最后得出[] == false为true。

    让咱们回到标题 [] == ![]为何是true。!的优先级比==要高,因此会先执行![]。也就是先把[]转为布尔类型再取反。[]转布尔值是true,为何呢?由于在JavaScript里除了false自身之外只有5个假值,分别是“”,undefined, null, 0, NaN。除了这5个假值之外,其余全部值转布尔类型都是true。一切对象都是真值,包括new Boolean(false)。因而问题就成了刚才咱们讨论的 [] == false了。故获得 [] == ![]为true。

相关文章
相关标签/搜索