JS数据类型之问---转换篇

184 阅读3分钟

[]==![]的结果是什么?为什么?

结果是:true

ECMAScripth中相等操作符==,如果两个操作数相等,则返回true,然而这种操作符会先强制转换操作数,再比较相等性

基本的转换规则

  • 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false转换为0,而true转换为1
  • 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值
  • 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较

关于本题

  • 根据运算符优先级,!的优先级大于==,所以先执行![],而可将变量转换成布尔类型,nullundefinedNaN以及空字符串('')取反都为true,其余都为false。所以![]的运算结果为false
  • 题目变成了[]==false ,根据上面的规则,会把false转换成0
  • 而如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较,如果对象没有valueOf()方法,则调用toString()
  • 对于空数组,[].toString() -> " "(空字符串)
  • 也就是 " "== 0 一个是字符串,另一个是数值,则比较之前转换为数值
  • 得到0==0 ,返回true
  • [] == ! [] -> [] == false -> [] == 0 -> '' == 0 -> 0 == 0 -> true

==和===的区别

而如果这里的“==”换成“===”

可以得到:

  • 相等和不相等——先转换再比较 (==)
  • 全等和不全等——仅比较而不转换 (===)

JS中类型转换有几种?

一、JS显式数据类型转换

  • 转数字(Number类型)
// Number 转换 
var a = '123';
a = Number(a);

//parselnt转换
var a = '123';
a = Number(a

//parseFloat转换,与parseInt一样,区别是可以保留小数
  • 转字符串(String)
//String()
var a = 123;a = String(a);

//toString()
var a = 123; 
a = a.toString();    //undefined,null不能用toString。
  • 转布尔类型(Boolean)
var a ='true';
a = Boolean(a);

// 在进行boolean转换的时候所有的内容在转换以后结果都是true
//除了:false、”“(空字符串)、0、NaN、undefined,这几个为true

二、JS隐式数据转换

  • Number
var a = '123';
a=+a;
//加减乘除以及最余都可以让字符串隐式转换成number。
  • String
var a = 123;
a = a + '';
  • boolean
var a = 123;
a = !!a;

三、JS值类型之间的数据类型转换

  • 数字和字符串使用+运算符
//数字和字符串如果使用+运算符进行操作,那么会将数字先转换为字符串,然后进行 
字符串连接操作:
var text = 'asd';
var num = 123;
alert(text+num);
  • 布尔值参与的+运算符操作
//如果有布尔型参与,那么首先会将布尔值转换为对应的数字或者字符串,然后再进行相应的 
字符串连接或者算数运算。
var bool = true;
var num = 8;
console.log(bool + num); -> 8

var bool = true;
var num = "8";
console.log(bool + num); -> true8
  • 减法操作
//如果进行减法操作,那么两个操作数都会先被转换为数字,然后在进行算数运算
var bool = true;
var num = "8";
console.log(bool - num);  -> -7 
  • ==等性运算
//undefined和null比较特殊,它们两个使用==运算符返回值是true
console.log(undefined==null); -> true

//其他值类型进行比较的时候都会将运算数转换为数字
console.log("3"==3);

对象转原始类型是根据什么流程运行的?

对象转原始类型总结 来自CSDN