为了将值转换为基本类型值(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。'',\n,'  ' 的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或者[],尽量不要用==。

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

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

javascript中的类型转换,宽松相等于严格相等的更多相关文章

  1. JavaScript中数据类型转换总结

    JavaScript中数据类型转换总结 在js中,数据类型转换分为显式数据类型转换和隐式数据类型转换. 1, 显式数据类型转换 a:转数字: 1)Number转换: 代码: var a = " ...

  2. JavaScript中的类型转换(二)

    说明: 本篇主要讨论JavaScript中各运算符对运算数进行的类型转换的影响,本文中所提到的对象类型仅指JavaScript预定义的类型和程序员自己实现的对象,不包括宿主环境定义的特殊对象(比如浏览 ...

  3. JavaScript中的类型转换(一)

    前言 JavaScript是一种非常灵活的弱类型的语言,它的灵活性的一方面体现在其繁杂多样的类型转换.比如当JavaScript期望使用一个布尔值的时候(比如if语句中)你可以提供任一类型的值,Jav ...

  4. [翻译]解释JavaScript中的类型转换

    原文地址:JavaScript type coercion explained 类型转换是将值从一种类型转换为另一种类型的过程(比如字符串转换为数值,对象转换为布尔值,等等).任何类型,无论是原始类型 ...

  5. 【你不知道的javaScript 中卷 笔记2】javaScript中的类型转换

    1.1 对象内部属性 [[Class]] 常见的原生函数: String() Number() Boolean() Array() Object() Function() RegExp() Date( ...

  6. javascript中强制类型转换

    javascript开发过程中,强制类型转换一般发生在条件判断和==运算符.其他情况,发生的类型转换(与这两种情况也是基本类似,属于万变不离其宗的范畴),暂不讨论. == 双等运算符 考虑代码: a ...

  7. javascript中数据类型转换

    转换为数字: parseInt():转换为整数型数值:从下标0开始判断,若为数值型则继续直到遇到非数值,返回前面的整数值: 小数点无效,若0开始为非数值则返回NaN: 转换空字符串会返回NaN: 能转 ...

  8. javascript中的类型转换(进制转换|位运算)

    1:parseInt(string) : 这个函数的功能是从string的开头开始解析,返回一个整数 parseInt("123hua"); //输出 123 parseInt(& ...

  9. js | JavaScript中数据类型转换总结

    转载 在js中,数据类型转换分为显式数据类型转换和隐式数据类型转换. 1, 显式数据类型转换 a:转数字: 1)Number转换: 代码: var a = “123”; a = Number(a); ...

随机推荐

  1. 缩放动画(ScaleTransform)

    在Silverlight的动画框架中,ScaleTransform类提供了在二维空间中的坐标内进行缩放操作,通过ScaleTransform可以在水平或垂直方向的缩放和拉伸对象,以实现一个简单的缩放动 ...

  2. C#Random随机值重复的解决方法

    使用如上图所示的代码,将会出现如下情况,明明是随机,可值都是同样的,这样的随机几率也太小了,所以估计是代码有问题. 于是搜索了下,发现引起这个问题的原因是C#中的Random是根据时间来产生随机数,而 ...

  3. 日志(logging)与正则(re)模块

    logging模块 #日志:日常的流水 =>日志文件,将程序运行过程中的状态或数据进行记录,一般都是记录到日志文件中 #1.logging模块一共分为五个打印级别 debug.info.warn ...

  4. # 机器学习算法总结-第五天(降维算法PCA/SVD)

  5. Oracle对字段去重查询所有字段数据

    单个字段: select distinct(a) from tableA; 多个字段,利用max()去重  SELECT  * FROM  GM_PPU_RESIDENT_NORBASE g  WHE ...

  6. 10.自定义EL函数和自定义标签

    需要在JSP页面中进行一些常见逻辑操作(如对字符串进行操作),首先考虑是否可以用到sun公司提供的EL函数库(fn.tld)和JSTL 核心标签库 如果sun公司的EL函数库没有或者无法满足,就需要自 ...

  7. 第二章、drf框架 - 请求模块 | 渲染模块 解析模块 | 异常模块 | 响应模块 (详细版)

    目录 drf框架 - 请求模块 | 渲染模块 解析模块 | 异常模块 | 响应模块 Postman接口工具 drf框架 注册rest_framework drf框架风格 drf请求生命周期 请求模块 ...

  8. 英语是学习Java编程的基础吗

    就当前市场行情需求来看,Java人才需求依旧火爆,在如今互联网时代,手机移动端的软件开发是非常重要的,如今无论是大中小企业都是需要进行软件的开发的,又因为Java是开源的使用起来可以节约一大批的成本, ...

  9. YOLO---Darknet下的学习笔记

    YOLO.V3-Darknet下的学习笔记 @wp20180927 [目录] 一. 安装Darknet(仅CPU下) 2 1.1在CPU下安装Darknet方式 2 1.2在GPU下安装Darknet ...

  10. Ubuntu系统--安装官方flash插件包的方法

    浏览器安装官方install_flash_player_npapi_linux.x86_64.tar.gz插件包的方法 第一步:下载安装包. adobe flash player的官方下载instal ...