JS中的类型转换非常恶心,大家都懂的,不过该学还是要学。

今天看犀牛书看到了转换规则,总结出来。

X转字符串、数字、布尔值

X表示各种类型的值,直接上图:

转数字 转字符串 转布尔值
undefined NaN “undefined” false
null 0 “null” false
true 1 “true”  
false 0 “false”  
0   “0” false
-0   “0” false
NaN   “NaN” false
Infinity   “Infinity” true
-Infinity   ”-Infinity” true
1(非零)   “1” true
{}(任意对象) 见下文 见下文 true
[](任意数组) 0 ”” true
[9](包含一个数字元素) 9 “9” true
[”a”](其他数组) NaN 使用.join()方法 true
function(){}(任意函数) NaN 见下文 true

两个基本方法

上文中有三个“见下文”,就是见这里了。这三个地方也就是JS转换最麻烦的地方。

首先来看两个基本的转换方法:

toString()  // 返回对象的字符串表示形式

valueOf()  // 返回对象的数字表示形式

乍一看很简单是吧,别着急,关键是JS并不会像你想的那样单纯地调用这些方法。

对象转字符串

具体步骤如下:

  • 如果有toString()方法,调用对象的toString()方法,如果返回一个字面量就把这个字面量转换成字符串并返回。字面量转字符串见上表。
  • 如果没有toString()方法或者没有返回字面量,并且有valueOf()方法,调用valueOf()方法。如果这个方法返回字面量就转换成字符串返回。
  • 如果以上两步都没有成功,就抛出一个类型错误异常。

对象转数字

其实就是把对象转字符串的前两步调换了一下,然后把返回结果都转换成数字。

具体步骤如下:

  • 如果有valueOf()方法,调用valueOf()方法。如果这个方法返回字面量就转换成数字返回。
  • 如果没有valueOf()方法或者没有返回字面量,并且有toString()方法,调用对象的toString()方法,如果返回一个字面量就把这个字面量转换成数字并返回。字面量转数字见上表。
  • 如果以上两步都没有成功,就抛出一个类型错误异常。

对象转字面量

有些特殊的运算符并不会把对象转换成数字或者字符串,而是转换成字面量。

对象转字面量的具体步骤和对象转数字的具体步骤一样,先调用valueOf再调用toString,区别是,对象转字面量并不会在返回之前把结果转换成字符串或者数字,也就是说没有上面步骤中的粗体部分。

那么什么运算符会这么SB呢:

  • +
  • ==
  • !=
  • <,>以及所有关系运算符

处理日期类

别着急,JS还有更SB的一种情况,就是处理Date类型。

如果“+”和“==”遇到的是Date类型对象,那就会采用去除粗体部分的对象转字符串步骤,也就是说先调用toString再调用valueOf,并且不会对结果进行类型转换。

总结

普通转换参见表格,+、==、!=、<>和关系运算符的文艺转换参见对象转字面量,+、==遇见Date的2B转换参见处理日期类。

JS中的各种类型转换规则(转)的更多相关文章

  1. js中的变量类型

    js 中输出定义变量的类型  typeof  变量名. var u:  --underfined类型 var s = "你是一个好人":   --string类型 var n = ...

  2. JS 中对变量类型的五种判断方法

    5种基本数据类型:undefined.null.boolean.unmber.string 复杂数据类型:object. object:array.function.date等 方法一:使用typeo ...

  3. JS中 typeof,instanceof类型检测方式

    在js中的类型检测目前我所知道的是三种方式,分别有它们的应用场景: 1.typeof:主要用于检测基本类型. typeof undefined;//=> undefined typeof 'a' ...

  4. JS 中对变量类型判断的几种方式

    文章整理搬运,出处不详,如有侵犯,请联系~   数据类型判断和数据类型转换代码工具 在 JS 中,有 5 种基本数据类型和 1 种复杂数据类型,基本数据类型有:Undefined, Null, Boo ...

  5. js中的基本类型与引用类型学习

    一.基本数据类型 ECMAScript 有 5 种原始类型(primitive type),即 Undefined.Null.Boolean.Number 和 String,也称为基本数据类型,ES6 ...

  6. JS 中对变量类型的判断

    总结:1. 一般简单的使用 typeof 或 instanceof 检测(这两种检测的不完全准确)          2. 完全准确的使用 原生js中的 Object.prototype.toStri ...

  7. js中对象的类型

    js中的类型分为三种,"内部对象"."宿主对象"."自定义对象" 1."内部对象"有Date.Function.Arra ...

  8. jquery ajax中支持哪些返回类型以及js中判断一个类型常用的方法?

    1 jquery ajax中支持哪些返回类型在JQuery中,AJAX有三种实现方式:$.ajax() , $.post , $.get(). 预期服务器返回的数据类型.如果不指定,jQuery 将自 ...

  9. js中判断对象类型的几种方法

    我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...

随机推荐

  1. SaveData Functions

    Here are some save function for some situations: Yes/No /// <summary> ///保存数据到WCF /// </sum ...

  2. textkit 研究,mark一下,一个不错的开源库:MLLabel(但是没有文档)

    别人写的一个基于textkit的封装: https://github.com/molon/MLLabel 基于textkit实现的支持富文本的label, 可实现自定义emoji表情等

  3. Django model '__week_day'与python datetime的weekday()

    上周出了个bug,按星期几查询数据的时候,发现查到的数据与显示的星期几并不相符,后来发现代码中按星期几查询,有的地方用的是Django QuerySet提供的'__week_day',有的地方用的是p ...

  4. 《Linux内核分析》第五周 扒开系统调用的三层皮(下)

    [刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK FIVE( ...

  5. Docker 安装部署

    Docker学习笔记 一.Ubuntu Docker 安装 (1).获取最新版本Docker安装包 lyn@lyn:/data/docker$ sudo wget -qO- https://get.d ...

  6. ios开发xcode中设置代码块

    在开发中有很多重复的代码,很多开发者把常用的代码做成代码块提高开发效率. 在xcode里选中代码块的时候总是很不容易,点击选中的代码(文字),不要移动和松开鼠标左键,当竖线变成像拉长了的x(我也不知道 ...

  7. 如何使用Sitemap和menu创建网站导航

    1.添加Sitemap文件 将Sitemap内容替换为如下示例代码: <?xml version="1.0" encoding="utf-8" ?> ...

  8. FTP上传

    package cn.zto.util; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileIn ...

  9. curl常用选项详解

    curl常用选项详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 又是下班的时间了,让我们一起来学习一下今天的Linux命令吧~我一半只把自己常用的参数列出来,其他的有但是我们几 ...

  10. 。。。contentType与pageEncoding的区别。。。

    今天,开始换了一个新的开发工具IDEA,目前还不熟悉,新建了一个简单的Web项目,用到了Servlet,out.print("大家好!");然后就输出乱码了,用了response. ...