js中有7种数据类型,可以分为两类:原始类型、对象类型。
简单数据类型(也称为原始类型):Undefined、Null、Boolean、Number、String 和 Symbol。ES6 中新增了一种 Symbol 。这种类型的对象永不相等,即始创建的时候传入相同的值,可以解决属性名冲突的问题,做为标记。 复杂数据类型叫 Object(对象)。Object 是一种无序名值对的集合。
在js中,当运算符在运算时,如果两边数据不统一,CPU就无法计算,这时我们编译器会自动将运算符两边的数据做一个数据类型转换,转成一样的数据类型再计算。 这种无需程序员手动转换,而由编译器自动转换的方式就称为隐式转换。 在js中,想要将对象转换成原始值,必然会调用toNumber() 和 toPrimitive() 方法,是内部的。 toNumber() 方法,比较好理解,就是转换成 Number 类型,类似 Number() 方法。 该函数形式如下: toPrimitive(input,preferedType?) input是输入的值,preferedType是期望转换的类型,他可以是字符串,也可以是数字。
涉及隐式转换最多的两个运算符 + 和 ==。
+运算符即可数字相加,也可以字符串相加。所以转换时很麻烦,有些也比较难理解: 1.字符串连接符+:会把其他数据类型调用String()方法转成字符串然后拼接 2.算术运算符+:会把其他数据类型调用Number()方法转成数字然后做加法计算
//+是字符串连接符:
//String(1)+'true'='1true'
console.log( 1 + "true")://"1true"
//+是算术运算符:
//1 + Number(true)=1+1=2
console.log ( 1 + true);//2
//1+ Number(undefined)=1+NaN=NaN
console.log( 1 + undefined);// NaN
//1+Number(null)=1+0=1
console.log( 1 + null);//1
1.对象和布尔值比较
对象和布尔值进行比较时,对象先转换为字符串,然后再转换为数字,布尔值直接转换为数字
[] == true; //false
[]转换为字符串’’,然后转换为数字0,true转换为数字1,所以为false
2.对象和字符串比较
对象和字符串进行比较时,对象转换为字符串,然后两者进行比较。
[1,2,3] == '1,2,3' // true
[1,2,3]转化为’1,2,3’,然后和’1,2,3’, so结果为true;
3.对象和数字比较
对象和数字进行比较时,对象先转换为字符串,然后转换为数字,再和数字进行比较。
[1] == 1; // true
对象先转换为字符串再转换为数字,二者再比较 [1] => ‘1’ => 1 所以结果为true
4.字符串和数字比较
字符串和数字进行比较时,字符串转换成数字,二者再比较。
'1' == 1 // true
5.字符串和布尔值比较
字符串和布尔值进行比较时,二者全部转换成数值再比较。
'1' == true; // true
6.布尔值和数字比较
布尔值和数字进行比较时,布尔转换为数字,二者比较。
true == 1 // true
其实规律很简单,大家可以记下边这个图 数据转换
如图,任意两种类型比较时,如果不是同一个类型比较的话,则按如图方式进行相应类型转换,如对象和布尔比较的话,对象 => 字符串 => 数值 布尔值 => 数值。
[] == false;
![] == false;
这两个的结果都是true,第一个是,对象 => 字符串 => 数值0 false转换为数字0,这个是true应该没问题, 第二个前边多了个!,则直接转换为布尔值再取反,转换为布尔值时,空字符串(’’),NaN,0,null,undefined这几个外返回的都是true, 所以! []这个[] => true 取反为false,所以![] == false为true。
当关系运算符两边有一边是字符串的时候,会将其他数据类型使用Number()转换,然后比较关系↓
console.log("2">10 );//false Number(2)>10=2 >10=false
当关系运算符两边都是字符串的时候,此时同时转成number然后比较关系。此时并不是按照Number()的形式转成数字,而是按照字符串对应的unicode编码来转成数字。使用这个方法可以查看字符的unicode编码:字符串.charCodeAt(字符下标,默认为0).
console.log("2">"10");//true
//'2'.charCodeAt()>'10'charCodeAt()=50>49=true
console.log("2".charCodeAt())://数字50
console log("10".charCodeAt())://数字49(默认返回第一个字符的编码,如果想要查自第二个字符可以传参下标)
多个字符从左往右依次比较↓
console.log( "abc" > "b" );//false
先比较'a'和'b','a'与'b'不等,则直接得出结果
console log ( "abc" > "aad")//true
先比较'a'和'a',两者相等,继续比较第二个字符
'b'与'a' ,得出结果,
console.log("a".charCodeAt())://数字97
console.log("b".charCodeAt())://数字98
特殊情况(无视规则): 如果数据类型是 undefined与null,,得出固定的结果
console.log( undefined == undefined);//true
console.log( undefined == null);//true
console.log( null == null);//true
console.log( NaN == NaN );//false
console.log( Number('as') == NaN );//false
Null类型的比较不等于1或0(实际上,null仅与undefined 相当),但当强制转换ToNumber(null)===0;(但一定要注意区分null和0) NaN与任何数据比较都是NaN ,Number(‘as’) 输出 NaN 。NaN == NaN 为什么是 false。其实 js 规定的NaN 不等于NaN。
在隐式转换时会先转成String,然后再转成Number运算
{
}+[]//0
[]+{
}//"[object Object]"
0+{
}//"0[object Object]"
{
}+0//0
是因为{}可以是空块或空对象文字,具体取决于上下文。
可以是一元加运算符,也可以是连接运算符,具体取决于上下文。 第一个代码示例是一个空块,它可能也不存在,使表达式相同+[],意思是“空数组转换为数字”。
你不能把一个块作为一个函数参数,所以第二个代码示例{}是一个对象,代码的意思是“用一个数组来传递一个对象”(隐式地将对象和数组转换为字符串)。换句话说,{} + []表达式是一个empty代码块,后面跟array一个数字(Number[])的约束。
在第二个示例中,您只是向concat数组提供了一个对象文字(空对象)。这就是你收到的原因[object Object]。
实例:
空数组的toString()方法会得到空字符串,而空对象的toString()方法会得到字符串[object Object]
(注意第一个小写o,第二个大写O)
== 等号两边都为对象时,比较的是地址
[]==[]//false
{
}=={
}//false
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/183500.html原文链接:https://javaforall.cn