一.JS隐式类型转换
/*1.js隐式类型转换:当运算符两边数据类型不一致时,编译器会先转成一致再运算
* 其他数据类型转成string:+(字符串连接符)
* 其他数据类型转成number: 算术运算符(+ - * / %) 自增自减(++ --) 关系运算符(> >= < <= == === != !==)
* 其他数据类型转成boolean: ! 逻辑非
8种情况会得到false: 0 -0 undefined null NaN false ""(空字符串) document.all()
其余为 true
*
2.比较运算符 == === 区别
*/
1. === 全等
严格匹配:两边数据类型与值必须要完全一致(不存在类型转换)
console.log ( 1 === "1" );//false
2.== 不完成相等
不严格匹配:2边数据不一致,会类型转换,分5种情况
2.1 x和y都是string,number,boolean,此时如果两边不一样则会转成number后运算
console.log ( 1 == true ) //true
console.log ( "1" == true ) //true
console.log ( "10" == 10 );//true
2.2 如果x和y都是undefinde或者null,则返回true
console.log(undefined == undefined) true
console.log(undefined == null) true
2.3 如果x或y是NaN,则返回false
console.log ( NaN == NaN );//false
console.log ( NaN == "0" );//false
2.4 x或y,一个是复杂数据类型,一个是基本数据,会隐式类型转换;会获取复杂数据类型的原始值,然后再来比较
/*复杂数据类型原始值
*先转原始值
*[] : 空字符串
*{} : [object Object]
*/
console.log ( [ 1, 2, 3 ] == "1,2,3" );//true
console.log({} == 0)//false
步骤分析:(1)Object.prototype.toString.call({}) = "[object Object]: (2) "[object Object]:" == 0 "[object Object]" :转成Number NaN(3) NAN == 0
console.log( {} == "[object Object]")//true
2.5 x或y 都是复杂数据类型 ,不类型转换;比较内存地址,如果地址是一样则返回true,地址不一样则返回false
console.log({} == {});//false
二:JS中短路运算符&& 和 ||
1.逻辑与 && (找假) 如果第1个表达式的值为真,则返回表达式2;如果第一个表达式的值为假,则返回表达式1
var a = 123 && 456
console.log(a) // 456
var aa = 0 && 456
console.log(aa) // 0
2.逻辑或 && (找真) 如果第1个表达式的值为真,则返回表达式1;如果第一个表达式的值为假,则返回表达式2
var b = 123 || 456
console.log(b) // 123
注:逻辑短路运算符工作中挺常用的,常用于数据值的判断.
比如:返回的结果为res,要拿到res数组对象中的数据,res.data && res.data.字段名等进行更严谨的判断