js中对象转化成字符串、数字或布尔值的转化规则
js中对象可以转化成 字符串、数字、布尔值
一、对象转化成字符串:
规则:
1、如果对象有toString方法,则调用该方法,并返回相应的结果;(代码通常会执行到这,因为在所有对象中都有toString方法)
2、如果对象有valueOf方法,则调用该方法,并返回相应的结果;
3、否则抛出异常。
通常,所有对象都有toString方法,且内置对象都有自己toString方法的
实现
alert( {key: 'value'} ) // [object Object]
alert( [1,2] ) // "1,2"
alert( new Date() ) // "Sat Sep 15 2018 15:58:01 GMT+0800 (中国标准时间)"
在界面输出中, 比如 alert() 和 document.write() ,将优先调用 toString,如果过得不到 标量 或 undefined、null ,再尝试 valueOf ,如果仍然返回对象则报错。
其实 parseInt()、 alert()、 document.write() 这些函数的调用中,参数所进行的类型转换,应当视为"被动的" , 是函数的实现方式使之优先调用 toString, 而非数据对象自动调用 toString。
可以自定义toString()
var obj = {
age:23,
toString:function(){
return this.age;
}
}
obj.toString();//
二、对象转化成数字
- 函数里边的参数需要是数字,如:
Math.sin(obj)
/isNaN(obj) 以及
算术运算符:+obj
; - 用于比较,如:
obj == 'John'
PS:下面两种比较不会发生类型转换,
a)在严格比较(===)中,不会发生任何的类型转换,
b)在非严格比较中,如果参数都是对象,不会发生类型转换,通常,如果两个对象引用统一对象,则返回true.
转化成数字的规则:
1、如果对象有valueOf方法,则调用该方法,并返回相应的结果;
2、当调用valueOf返回的依然不是数字,则会调用对象的toString方法,并返回相应的结果;
3、否则抛出异常。
对象的valueOf方法返回的是对象本身,而不是字符串(比如数组、函数,它们的valueOf方法是从Object.prototype上继承下来的,默认行为是返回对象本身),所以才会采用toString
对于对象型参与 算术运算和 "==" 运算, 不等于比较元算(> 、<、>=、<=),自动发生数据类型转换,先调用 valueOf ,如果 valueOf 不能返回标量(number、string、boolean) 和 undefined、 null ,
将继续调用 toString, 如果仍然返回对象型数据,报错。
Date 类型的例外: 在 + 和 == 运算中,优先 toString ,这应该是规范对该数据类型的特殊对待。
补充:调用valueOf()的结果:
参数类型 | 返回结果 |
Undefined | 抛出TypeError异常 |
Null | 抛出TypeError异常 |
Number | 创建一个Number对象,它内部的初始值为传入的参数值 |
String | 创建一个String对象,它内部的初始值为传入的参数值 |
Boolean | 创建一个Boolean对象,它内部的初始值为传入的参数值 |
Object | 对象本身 |
可以重写对象的valueOf()方法(百度一道面试题,定义一个对象,使obj == '1' ,结果为true):
var obj = {
valueOf: function(){
return 1;
}
};
console.log(obj == '1');//true
三、对象转化成布尔值:
对象在JS中总是返回true
根据上述,对象在相等性判断中如何转变?
在布尔上下文中, a
是true
, b
是false,
。a == b
,这是可能的
[] == ![] //true
内部的转化步骤:
1、右边是![],将会被转换成一个布尔值,[]为true,取非为false,此时表达式变成:
2、按照规则,右边是布尔值,将false转换成0,左边是数组,数组也将进行数字转换,先调用valueOf(),不能转化成原始值,再用toString(),转换为0
3、结果为true
补充 == 和!=判断规则(注意: ===!== 和 对象==对象 这三种情况不会进行类型转换):
- 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值----false转化为0,true转化为1;
- 如果有一个数是字符串,另一个操作数是数值,将字符串转化成数值;
- 如果一个操作数是对象,另一个操作数不是对象,将对象转化为基本操作类型(先valueOf()再toString(),均不能得到基本类型的值则会报错),再比较。
所以,对象在相等性判断中:
- 若两边都是对象,不会进行类型转换,为同一个引用才会返回true
- 若只有一边为对象,则会先调用对象的valueOf()方法,不能返回基本类型,再调用对象的toString()方法,还是不能就会报错,否则用转化后的基本类型值继续进行判断
举例,感受下~:
[]==[]//false
[]==false//true
!![]//true
[]==![]//true
总结:
在JavaScript中,对象有三个转换,这取决于具体情况:
- 字符串输出,使用
toString
。 - 数字:数学函数,操作符,使用
valueOf
后使用toString
。 - 布尔值:转化为true。
js中对象转化成字符串、数字或布尔值的转化规则的更多相关文章
- js将对象转成字符串-支持微信
最近写一个微信项目时用到了 把对象转成字符串,因为我需要把它存在cookie中,碰到了一些问题,在这里分享一下. 要转换的就是这货~ var FBinf = { "workPlacesCod ...
- js把其他类型转化成字符串
js把其他类型转化成字符串 一.总结 一句话总结:类型转换中的强制类型转换分为类型转换函数和类型名强制.js后一种和其它语言不同,是类型类的构造方法.String() 二.js把其他类型转化成字符串 ...
- js 将json对象转成字符串
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- [转]JS中对象与字符串的互相转换
原文地址:http://www.cnblogs.com/luminji/p/3617160.html 在使用 JSON2.JS 文件的 JSON.parse(data) 方法时候,碰到了问题: thr ...
- JS中对象与字符串的互相转换
在使用 JSON2.JS 文件的 JSON.parse(data) 方法时候,碰到了问题: throw new SyntaxError('JSON.parse'); 查询资料,大概意思如下: JSON ...
- json字符串转换成json对象,json对象转换成字符串,值转换成字符串,字符串转成值
一.json相关概念 json,全称为javascript object notation,是一种轻量级的数据交互格式.采用完全独立于语言的文本格式,是一种理想的数据交换格式. 同时,json是jav ...
- 前台 JSON对象转换成字符串 相互转换 的几种方式
在最近的工作中,使用到JSON进行数据的传递,特别是从前端传递到后台,前台可以直接采用ajax的data函数,按json格式传递,后台Request即可,但有的时候,需要传递多个参数,后台使用requ ...
- js中对象的一些特性,JSON,scroll家族
一.js中对象的一些特性 对象的动态特性 1.当对象有这个属性时,会对属性的值重写 2.当对象没有这个属性时,会为对象创建一个新属性,并赋值 获得对象的属性的方式 为元素设置DOM0级事件 二.JSO ...
- 【转载】js中对象的使用
原文链接:http://www.jb51.net/article/90256.htm[侵删] 简单记录javascript中对象的使用 一.创建对象 //创建一个空对象 var o={}; //创建一 ...
随机推荐
- IE6/IE7不支持first-child的解决办法
#sidebar li:first-child{ border-top-style:none; } #sidebar li{ border-top-width:1px; border-top-styl ...
- PAT——1063. 计算谱半径
在数学中,矩阵的“谱半径”是指其特征值的模集合的上确界.换言之,对于给定的n个复数空间的特征值{a1+b1i, ..., an+bni},它们的模为实部与虚部的平方和的开方,而“谱半径”就是最大模. ...
- HDU 1165 Eddy's research II(给出递归公式,然后找规律)
- Eddy's research II Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64 ...
- linux 下线程错误查找,与线程分析命令
一. 使用top和jstack查找线程错误 我们使用jdk自带的jstack来分析.当linux出现cpu被java程序消耗过高时,以下过程说不定可以帮上你的忙: 1.top查找出哪个进程消耗的cpu ...
- ucosii任务堆栈的作用是什么呢?
http://blog.csdn.net/supreme42/article/details/7397241 第一,当任务运行时,它用来保存一些局部变量:第二,当任务挂起时,它负责保存任务的运行现场, ...
- 书单list
2018年对我来说是个踩到狗屎的一年,不能说运气差,只能说过去所有的不良决策后果都集中到2018年爆发了,希望新的一年,都好起来.书单很短,买的确实很多,真的惭愧. 昨日世界 南渡北归 上学记 回忆录 ...
- 用JavaScript编写简单斗地主效果Es6
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 网站jcms流程分析
本实例大致流程:基于jsp页面,通过servlet传递数据调用方法,利用service更改数据库.本文重点分析的是其中的两个小方法add()和delete(),来反映出反射机制的一个具体作用:减少Se ...
- 【js】javaScript 执行机制
javascript 是一门单线程语言(按照语句一行一行的执行) let a = '1'; console.log(a); let b = '2'; console.log(b); 这样子正常执行是没 ...
- C++练习 | 掷骰子走到第n步的方法数(DFS)
玩家根据骰子的点数决定步数,骰子点数为1的时候走一步,以此类推.求玩家走到第n步总共有多少种投骰子的方法.输入为一个整数n,输出为投骰子的方法数. #include <iostream> ...