我在这里主要的想提下的是JavaScript中的引用类型进行强制转换类型.因为对于基本数据类型的变换大多都是雷同的,很容易熟知,但是引用数据类型有一点小插曲.

JavaScript的引用类型主要为对象,数组和函数.主要针对的是对对象和数组进行转换.而转换又包括两种方式,即显式和隐式转换.

显式强制类型转换

首先我们需要一些基本的规则.

基本类型的字符串化规则:

  • null ==> 'null'
  • true ==>'true' ,false ==> 'false'
  • undefined ==> 'undefined'
  • 数字也是自身字符串化,1 ==> '1'

基本类型的数字化规则:

  • null ==> 0
  • undefined ==> NaN
  • true ==> 1, false ==> 0
  • 字符串会拆开引号,看它是否是数字,是则输出数字,否则输出NaN.如果是空字符串,则会转成0.

不同类型对象的valueof规则:

对象 ==>对象本身

Boolean ==> 布尔值

Number ==> 数字值

String ==> 字符串值

Array ==> 返回数组对象本身

Date ==> 距离1970的毫秒数

Function ==> 函数本身

Math和Error没有valueof方法

通过构造String()化

首先,会调用引用数据类型的tostring()方法,会看该方法是否会返回基本数据类型,如果是就使用.如果不是就会调用valueof方法,返回基本数据类型就使用,如果不是则会报错.

		//通过复写其系统方法来观察
// obj,对象
Object.prototype.toString=function () {
return [];
}
Object.prototype.valueOf=function () {
return 456;
}
var obj = {
name:"Jan",
age:18
}
// obj.toString() ---> obj.valueOf()
var res = String(obj);
console.log(typeof res,res);//string '456' // 数组
Array.prototype.toString=function () { }
Array.prototype.valueOf=function () {
return 123;
}
var arr =[1,2,3,4];
var res = String(arr);
console.log(typeof res,res);//string undefined

通过构造Number()化

首先,会调用引用数据类型的valueof()方法,会看该方法是否会返回基本数据类型,如果是就使用.如果不是就会调用tostring()方法,返回基本数据类型就使用,如果不是则会报错.

	//对数组和对象进行number化
var arr = [1,2,3];
var res = Number(arr); //tostring==>1,2,3
console.log(typeof res,res);//number NaN Object.prototype.valueOf=function(){
return " 12345 ";
}
var obj ={};
var res = Number(obj);
console.log(typeof res,res);//number 12345 var res = +obj;
console.log(typeof res,res);//number 12345

只有Number()和'+'正号才能激发显式number化.

另外提下toPrimitive,它是引用数据类型转基本数据类型.都是先回调用valueof方法,然后才调用tostring方法.

隐式强制类型转换

隐式转换一般是'+'符号触发,还有逻辑判断触发

    //如果某个操作数是字符串  + 将进行拼接操作
//遇到对象 则ToPrimitive() Array.prototype.valueOf=function(){
return "1";
}
Array.prototype.toString=function(){
return false;
}
console.log([] + 1); //'11'
(1)  if (..) 语句中的条件判断表达式。
(2) for ( .. ; .. ; .. ) 语句中的条件判断表达式(第二个)。
(3) while (..) 和 do..while(..) 循环中的条件判断表达式。
(4) ? : 中的条件判断表达式。
(5) 逻辑运算符 || (逻辑或)和 && (逻辑与)左边的操作数(作为条件判断表达式)

Web | JavaScript的引用数据类型强制转换类型的更多相关文章

  1. JavaScript学习笔记——数据类型强制转换和隐式转换

    javascript数据类型强制转换 一.转换为数值类型 Number(参数) 把任何的类型转换为数值类型 A.如果是布尔值,false为0,true为1 B.如果是数字,转换成为本身.将无意义的后导 ...

  2. 简述Java变量和强制转换类型

    简述Java变量和强制转换类型 java变量 1. java变量 变量:顾名思义,就是在java执行程序过程中可以发生改变的量,就好比方程式中的未知数X一样. 变量的内存分配过程 int a ; // ...

  3. PHP强制转换类型

    PHP强制转换类型   获取数据类型 : 1.如果想查看某个表达式的值和类型,用var_dump(). 2.如果只是想得到一个易读懂的类型的表达方式用于调试,用 gettype().3.要查看某个类型 ...

  4. TypeError: Error #1034: 强制转换类型失败:无法将 mx.controls::DataGrid@9a7c0a1 转换为 spark.core.IViewport。

    1.错误描述 TypeError: Error #1034: 强制转换类型失败:无法将 mx.controls::DataGrid@9aa90a1 转换为 spark.core.IViewport. ...

  5. TypeError: Error #1034: 强制转换类型失败:无法将 flash.events::MouseEvent@73b7cc1 转换为 mx.events.ItemClickEvent。

    1.错误描述 TypeError: Error #1034: 强制转换类型失败:无法将 flash.events::MouseEvent@73b7cc1 转换为 mx.events.ItemClick ...

  6. TypeError: Error #1034: 强制转换类型失败:无法将 "" 转换为 Array。

    1.错误描述 TypeError: Error #1034: 强制转换类型失败:无法将 "" 转换为 Array. at mx.charts.series::LineSeries/ ...

  7. TypeError: Error #1034: 强制转换类型失败:无法将 "0.49" 转换为 mx.graphics.IFill。

    1.错误描述 TypeError: Error #1034: 强制转换类型失败:无法将 "0.49" 转换为 mx.graphics.IFill. at mx.charts.ser ...

  8. C++ 4 种具有更 为准确语义的新强制转换类型

    1. static_cast<T>() 可用于把指向A 的指针强制转换为指向B 的指针,其约束条件是类B必须是类A的子类.例如:A *obj = new B;B *b = static_c ...

  9. C++下的强制转换类型

    一.static_cast static_cast,静态类型转换.   下面,我举几个例子,大家就能清楚了. int main(int argc, char const *argv[]) { char ...

随机推荐

  1. div实现水平和垂直都居中的三个超实用的方法

    本文仅仅介绍作者认为的三种不错的方式, 方式一:transform: translate(-50%,-50%)  示例代码如下: .div{ position: absolute; top: 50%; ...

  2. IDEA 的缓存问题

    当IDEA还是使用以前的配置时,大概率是缓存问题,查看target,里面的内容就是编译好的东西,问题都是出自这里.

  3. docker pull提示x509错误的对应方法

    在一台虚拟机上使用docker pull时出现了x509错误,相关原因与对应方法简单memo如下. 错误现象 在使用docker pull从dockerhub上下载镜像时提示如下错误 docker: ...

  4. osgEarth编译——以VS2012为例

    整理记录下 osgEarth编译过程. osgEarth是依赖于OSG的三维地理平台. 准备工作 OpenSceneGraph-3.4.0.zip OSG_3RDPARTY_DIR    http:/ ...

  5. [2014年学习计划之RoR系列] 第二步 – 熟悉Ruby语言 (2/n) Blocks and Iterators (代码块和迭代器)

    [就算没有含金量,也请尊重原创, 转载自我的独立博客http://brucejia.net] Blocks and Iterators (代码块和迭代器) 代码块和迭代器是Ruby语言中比较有特点的东 ...

  6. Springmvc和Mybatis中常用的注解

    使用注解来构造IoC容器 用注解来向Spring容器注册Bean.需要在applicationContext.xml中注册<context:component-scan base-package ...

  7. CentOS7路由、端口和服务排障常用命令

    1. ip route   显示主机基本路由信息 ~]# ip route default via 172.25.0.254 dev eth0  proto static  metric 1024 1 ...

  8. 在 Windows Server Container 中运行 Azure Storage Emulator(一):能否监听自定义地址?

    我要做什么? 改 ASE 的监听地址.对于有强迫症的我来说,ASE 默认监听的是 127.0.0.1:10000-10002,这让我无法接受,所以我要将它改成域名 + 80 端口的方式: 放到容器中. ...

  9. 通过u盘启动盘重装系统

    前言:一直想通过u盘启动盘给旧本装个win7,但是发现网上完整的教程很少.这里分享给大家我重装的一些步骤和遇到的问题. 前期准备: 1.我们要准备一个容量在4G以上的U盘. 2.我们要将U盘中的重要数 ...

  10. Java学习---JAVA的类设计

    基础知识 JAVA是由C/C++语言发展而来的纯面向对象语言,其基本元素包括:简单数据类型 和 复合数据类型(即类).类是对客观事物的抽象描述,它有面向对象的四个特点,即:封装性.继承性.多态性和通信 ...