一个有趣的js隐式转换的问题

一个有趣的js隐式转换的问题

在chrome的控制台中打印一下表达式

[] + {} //结果为 [object object]

然后调整顺序打印

{} + [] //结果为 0

然后将两个表达式组合一下

{} + [] === [] + {} //true

wtf???

原理解释如下:

一般的类型转换的时候, 面对 + , 首先调用 valueOf^[1]进行转换, 如果转换的结果不是

基本类型, 那么采用 toString() 方法进行转换, 所以

[]+{} //结果Wie [object + object]

但是 {} 在js或者很多语言中是代码块的区别标志, 所以在首位的话, 会被认为是 blank block 而

忽略, 所以 +[], 即 +"", 最终的结果会是 0

{}+[]// 0

而最终的

{}+[] === [] + {}//true 是因为 chrome 默认在这种判断的外边增加了 括号, 所以两个字符
//"[object object]" === "[object object]" 自然就是 true 了.

[1] Date除外

原文地址:https://www.cnblogs.com/asdfq/p/9419102.html

时间: 2024-10-06 05:28:48

一个有趣的js隐式转换的问题的相关文章

再说js隐式转换

再说js隐式转换 自己整理的一个整体规则如下: Date 默认 走 toString, 如果 toString 返回的是对象, 那么查看 valueOf 其他对象的转换, 默认走 valueOf, 但是如果 valueOf 返回的是对象, 那么尝试 toString //比如示例如下: //默认的对象隐式转换是走 valueOf var o1 = { valueOf: function(){ return 1; }, toString: function(){ return 9; } } con

js隐式转换个人总结

隐式转换在js中通常可以通过parseInt(),  Number(), String(), Boolean()等函数转换成对应的数据类型, 但通常为了简便, 我们会用特殊的写法进行转换, 比如: var a = 5; console.log( a + '' ); // 输出'5', 将number类型转成string类型 //这里是将string转换成number类型 console.log( +'56' ); //输出 56, 等价于Number(a) console.log( -'56 )

JS隐式转换

 首先,JS数据类型分为6种,分别是null.undefined.boolean.string.number.object.其中,object是引用类型,其余5种是基本类型或者叫做原始类型. 类型转换,就是隐式转换!不同类型的变量相比较时要先转换类型.隐式转换通常发生在运算符加.减.乘.除,以及大于.小于等等. typeof()方法用来打印判断某个元素是什么数据类型. 1.字符串和数字的相互转换: (1).字符串 加 数字 || 数字 加 字符串,数字 => 字符串 eg: typeof("

隐式转换

发现某一条语句消耗较高,执行比较频繁数据库版本如下将TextData语句拷贝到查询窗口执行将sp_executesql中的主体语句拷贝到查询窗口执行执行计划的总体流向是一致的,根据token得到LKLoginTokenRecord,然后嵌套循环AccountsInfoSimple.但是sp_executesql语句的执行计划有常量扫描和计算标量的操作,并且在索引查找中有谓词CONVERT_IMPLICIT(nvarchar(32),[DBname].[dbo].[LKLoginTokenReco

JS笔记(二):隐式转换

最近刚开始复习JS的基础知识,看到隐式转换这一块,发现它的规则很多,红宝书上列出的框框又有些冗杂,所以这里我借一个式子总结一下其中的规律以及一些有趣的现象.

js学习日记-隐式转换相关的坑及知识

隐式转换比较是js中绕不过去的坎,就算有几年经验的工程师也很有可能对这块知识不够熟悉.就算你知道使用===比较从而避免踩坑,但是团队其它成员不一定知道有这样或那样的坑,有后端语言经验的人常常会形成一个思维误区:"JS这门语言很简单,看看语法再找几个例子就能操作DOM,编写特效了".随着react.vue.html5等技术在项目中大规模使用,越来越多的项目中使用了大量的JS,甚至整个项目都用JS来写(例如基于webapi的SPA管理后台.微信小程序.微信H5应用,Hybrid app),

js 的隐式转换与显式转换

隐式转换 1.undefined与null相等,但不恒等(===) 2.一个是number一个是string时,会尝试将string转换为number 3.隐式转换将boolean转换为number,0或1 4.隐式转换将Object转换成number或string,取决于另外一个对比量的类型 5.对于0.空字符串的判断,建议使用 “===” . 6.“==”会对不同类型值进行类型转换再判断,“===”则不会.它会先判断两边的值类型,类型不匹配时直接为false. undefined == nu

有趣的JavaScript隐式类型转换

JavaScript的数据类型是非常弱的(不然不会叫它做弱类型语言了)!在使用算术运算符时,运算符两边的数据类型可以是任意的,比如,一个字符串可以和数字相加.之所以不同的数据类型之间可以做运算,是因为JavaScript引擎在运算之前会悄悄的把他们进行了隐式类型转换的,如下是数值类型和布尔类型的相加: 3 + true; // 4 结果是一个数值型!如果是在C或者Java环境的话,上面的运算肯定会因为运算符两边的数据类型不一致而导致报错的!但是,在JavaScript中,只有少数情况下,错误类型

javascript 隐式转换 == 之 [ ]==![ ] 结果为true,而{ }==!{ } 结果为false

ECMAScript中的隐式转换 == 会先将两边转换成相似的类型,再执行比较: ①.如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false转换为0,而true转换为1:②.如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值③.如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较,如果对象没有valueOf()方法,则调用 toString(): 顺便提一下,valueOf() 方法