Web | JavaScript的引用数据类型强制转换类型
我在这里主要的想提下的是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的引用数据类型强制转换类型的更多相关文章
- JavaScript学习笔记——数据类型强制转换和隐式转换
javascript数据类型强制转换 一.转换为数值类型 Number(参数) 把任何的类型转换为数值类型 A.如果是布尔值,false为0,true为1 B.如果是数字,转换成为本身.将无意义的后导 ...
- 简述Java变量和强制转换类型
简述Java变量和强制转换类型 java变量 1. java变量 变量:顾名思义,就是在java执行程序过程中可以发生改变的量,就好比方程式中的未知数X一样. 变量的内存分配过程 int a ; // ...
- PHP强制转换类型
PHP强制转换类型 获取数据类型 : 1.如果想查看某个表达式的值和类型,用var_dump(). 2.如果只是想得到一个易读懂的类型的表达方式用于调试,用 gettype().3.要查看某个类型 ...
- TypeError: Error #1034: 强制转换类型失败:无法将 mx.controls::DataGrid@9a7c0a1 转换为 spark.core.IViewport。
1.错误描述 TypeError: Error #1034: 强制转换类型失败:无法将 mx.controls::DataGrid@9aa90a1 转换为 spark.core.IViewport. ...
- TypeError: Error #1034: 强制转换类型失败:无法将 flash.events::MouseEvent@73b7cc1 转换为 mx.events.ItemClickEvent。
1.错误描述 TypeError: Error #1034: 强制转换类型失败:无法将 flash.events::MouseEvent@73b7cc1 转换为 mx.events.ItemClick ...
- TypeError: Error #1034: 强制转换类型失败:无法将 "" 转换为 Array。
1.错误描述 TypeError: Error #1034: 强制转换类型失败:无法将 "" 转换为 Array. at mx.charts.series::LineSeries/ ...
- TypeError: Error #1034: 强制转换类型失败:无法将 "0.49" 转换为 mx.graphics.IFill。
1.错误描述 TypeError: Error #1034: 强制转换类型失败:无法将 "0.49" 转换为 mx.graphics.IFill. at mx.charts.ser ...
- C++ 4 种具有更 为准确语义的新强制转换类型
1. static_cast<T>() 可用于把指向A 的指针强制转换为指向B 的指针,其约束条件是类B必须是类A的子类.例如:A *obj = new B;B *b = static_c ...
- C++下的强制转换类型
一.static_cast static_cast,静态类型转换. 下面,我举几个例子,大家就能清楚了. int main(int argc, char const *argv[]) { char ...
随机推荐
- PHP 如何向关联数组指定的 Key 之前插入元素
PHP 关联数组可以通过三种方式插入新元素: $array[$insert_key] = $insert_value; $array = array_merge($array, $insert_arr ...
- 转:php 获取memcache所有key
文章出处 在php提供的用于与memcached交互的扩展模块中有memcached与memcache,前者提供方法getAllKeys用于遍历所有Memcached服务器上的key,但是并不保证原子 ...
- react与vue
vue的选择居于react与angular之间,框架自身的语法比react多一点,但是又比angular少一点. 也正是由于选择的不同,所呈现出来的写法与思考方式就一定会有所差异,不论优劣,但肯定会导 ...
- LeetCode赛题395----Longest Substring with At Least K Repeating Characters
395. Longest Substring with At least K Repeating Characters Find the length of the longest substring ...
- 初识WCF3
http://www.cnblogs.com/xiangchangdong/p/3924030.html 第三篇 在IIS中寄宿服务 通过前两篇的学习,我们了解了如何搭建一个最简单的WCF通信模型,包 ...
- C#中的特殊数据类型
一.c#中的特殊数据类型 C#中特殊数据类型有class类型.结构类型.数组类型.枚举类型.集合类型.委托类型.事件.Lambda表达式.接口类型. 1.class类型 1.1类定义 class St ...
- React学习笔记(五)State&声明周期
React学习笔记(五) 四.State&声明周期 可以为组件添加"状态(state)".状态与属性相似,但是状态是私有的,完全受控于当前组件. 局部状态就是只能用于类(定 ...
- Linux 基础学习大考核
0.关于Linux的简介 Linux(好又免费)的组成部分: Linux 是一种计算机操作系统: 一系列能让您与计算机进行交互操作并运行其它程序的程序. 操作系统由多种基础程序构成.它们使计算机可以与 ...
- Android studio ocr初级app开发问题汇总(含工程代码)
博客第一篇文章,稍作修改,增加文字介绍 开发目的 最近由于某些需求,需要在Android手机端实现OCR功能,大致为通过手机照相,识别出相片中的中文信息字段.但是由于新手光环+流程不熟悉,遇到了各种各 ...
- 12、Node.js 路由
这里实现的好像就是把路由和服务器相结合起来.具体需要引入 url 模块和 http 模块为路由提供请求的 URL 和其他需要的 GET 及 POST 参数,随后路由需要根据这些数据来执行相应的代码需要 ...