• javascript中的类型转换,宽松相等于严格相等


    为了将值转换为基本类型值(string,number,boolean,null,undefined),抽象操作ToPrimitive会首先检查该值有没有valueOf()方法,如果有并且返回基本类型值,那么使用该值进行强制类型转换,如果没有就使用toString()的返回值进行强制类型转换。如果valueOf()和toString()均不返回基本类型值,那么会产生TypeError错误。

    一、其他类型的值转换成字符串的规则 ToString

    1)null转换为"null"

    2)_undefined转换为"undefined"

    3)数字转换为对应的数字字符串

    4)普通对象,除非自行定义,否则会调用默认的toString()方法(Object.prototype.toString()),返回内部属性[[class]]的值。

    5)数组的toString()方法经过了重新定义,会将所有单元字符串化之后用,连接起来。如[1,2]转换为1,2;[]转换为'';(数组的valueof会返回数组本身)

    二、其他类型的值转换为数字的规则 ToNumber

    1)true转换为1,false转换为0

    2)undefined转换为NaN

    3)null转换为0

    4)数字字符串转换为对应数字,如果字符串不是数字形式,转换失败返回NaN。'', ,'  ' 的toNumber返回0.

    5)对象,包括数组会首先被转换为基本类型值(方法见本篇开头),如果返回的是非数字的基本类型值,则再遵循上述规则将其强制转换为数字。

    三、数字字符串和数字之间的显式强制转换

    (凡是需要调用函数的开销一般较大,不推荐) 

    数字转换为字符串: 

    var a=23;
    var b=String(a);//能转换,不推荐
    var b=a.toString();//能转换,不推荐
    var b=a+'';//推荐

     

    字符串转换为数字: 

    var a=‘23’;
    var b=Number(a);//能转换,但不推荐
    var b=+a;//推荐

     注意,转换数字字符串与解析数字字符串是不同的概念。

    parseInt与parseFloat可以解析数字字符串(注意,参数一定是字符串)。解析允许字符串中含有非数字字符,解析按照从左向右的顺序,如果遇到非数字字符就停止。而转换不允许出现非数字字符,否则会失败并返回NaN。判断字符串是否为数字字符串可以使用isFinite,如isFinite('123abc'),返回false。

    三、将其他类型的值转换为布尔值的规则 ToBoolean

    javascript的值可以分为两类:

    1)可以强制转换为false的值(false or false-like):包括null,undefined,'',+0,-0,NaN

    2)其他。如"0",[],{}强制转换为布尔值的话,都为true

    将其他类型的值显示转换为布尔值可以使用Boolean(a)(不建议)和!!a(建议)这两种方式。

    与上述显式强制类型转换对应的还有一类隐式强制类型转换(多指在运算中,或者条件判断中静默发生的类型转换)。

    四、宽松相等(==)与严格相等(===)

    二者的区别在于,==允许在相等比较中进行强制类型转换,而===则不允许。

    有几个非常规的情况值得注意:

    NaN不等于NaN,这是一个唯一不具有自反性的值。

    +0等于-0.

    1.字符串和数字之间的相等(==)比较

    1)如果Type(x)是数字,Type(y)是字符串,则返回x==ToNumber(y)的结果。

    2)如果Type(y)是数字,Type(x)是字符串,则返回ToNumber(x)==y的结果。

    总之,就是想办法让等号两边都成为数字之后,再比较。

    2.其他类型的值与布尔值相等比较

    1)如果Type(x)是布尔值,Type(y)是字符串,则返回ToNumber(x)==y的结果。

    2)如果Type(y)是布尔值,Type(x)是字符串,则返回x==ToNumber(y)的结果。

    总之,就是让布尔值先转换为数字。

    3.null与undefined之间的比较。

    null==undefined与undefined==null,这两者是成立的。也就是说,==中null与undefined是等价的。除此之外的任何值都!=null或者undefined.

    4.对象和非对象之间的相等比较

    1)如果Type(x)是字符串或者数字,Type(y)是对象,则返回x==ToPrimitive(y)的结果。

    2)如果Type(x)是对象,Type(y)是字符串或者数字,则返回ToPrimitive(x)==y的结果。

    这里没有提到布尔值,是因为之前说过,布尔值会被首先转换为数字。

    总之,就是先调用对象的toPrimitive再比较

    上面这些规则有时候会出现一些乍一看很晕的结果,如:

    false==[].//true

    false=={}//false

    []==![]//true

    有两个原则可以让我们尽量避免出错:

    1)如果两边的值中有true或者false,千万不要使用==。

    如:可以直接用if(a),if(!!a),if(a===true).不要使用if(a==true)

    2)如果两边的值中有'',0或者[],尽量不要用==。

    这时尽量用===来避免不经意的类型转换。

    上述两个规则可以让我们避开几乎所有强制类型转换的坑。

  • 相关阅读:
    FCKeditor 2.3 在ASP.NET中的设置和使用
    如何去掉重复记录的Sql语句写法
    asp.net如何去掉HTML标记
    Asp.net中如何删除cookie?
    怎样得到select所有option里的值
    HttpModule是如何工作的
    Asp.net2.0下的表单验证Cookieless属性
    FreeTextBox实现机制
    ajax实现动态从数据库模糊查询显示到下拉框中(ajax方法返回Dataset的例子)
    新浪博客自动发表程序,请勿用于非法用途
  • 原文地址:https://www.cnblogs.com/bobodeboke/p/6298245.html
Copyright © 2020-2023  润新知