var a=b={n:1}//a b 都指向n:1空间地址;
a.x=a={z:2}//正确思想赋值是从由往左,但是在运算符 = 赋值的时候,
// . () 等优先级比较高,所以我们先a.x 进行赋值,然后在给a进行赋值
console.log(a) // {z:2}
console.log(b)// a.x修改了a和b他们同一个空间;所以b同时也增加了x属性;{n:1,x:{z:2}
查找当前作用域的上级作用域:
要看当前作用域在哪里创建的,那么他的上级作用域就在哪里;
数据类型转换:
数据类型转换
1、把其它数据类型转换为字符串(toString方法)
->null和undefined转换为字符串的'null'/'undefined',但是我们不能操作toString这个方法
->[12].toString() =>'12'
->[12,13].toString() =>'12,13'
->[[[[[1]]]],[[[2]]],[[[[[3]]]]]].toString() =>'1,2,3' ()
->({name:'周啸天'}).toString() =>'[object Object]' 普通对象调用这个方法不是转换为字符串,而是在检测数据类型(Object.prototype.toString.call())
在什么情况下,我们需要把其它数据类型转换为字符串?
字符串拼接
1+'1' =>'11' 加号在JS中不仅仅是数学运算,还有字符串拼接的作用,如果加号的一边遇到了字符串,都是字符串拼接
1-'1' =>0 除了加号,减法/乘法/除法都是数学运算,会把其它的非数字类型转换为数字类型,在进行运算
1+null+undefined+'12'+[]+undefined+{name:'张三'}+null
->1+null <=> 1+0 = 1
->1+undefined <=> 1+NaN = NaN
->NaN+'12' = 'NaN12'
->'NaN12' + [] = 'NaN12'
->'NaN12' + undefined = 'NaN12undefined'
->'NaN12undefined' + {name:'张三'} = 'NaN12undefined[object Object]'
->'NaN12undefined[object Object]'+null = 'NaN12undefined[object Object]null'
2、把其它数据类型转为布尔
“0、NaN、null、undefined、空字符串”转换为FALSE,其余的都转换为TRUE
什么时候需要用到这个转换?
-> ! / !! / Boolean()
-> if(12){} 先把12转换为布尔,然后验证真假
3、把其它数据类型转化为数字
Number('12') ->12
Number('12px') ->NaN
Number(true) ->1
Number(false) ->0
Number(null) ->0
Number(undefined) ->NaN
//->对象转数字:先把对象转为字符串,然后再转换为数字
Number([]) -> Number('') -> 0
Number([12]) -> Number('12') ->12
Number([12,13]) -> Number('12,13') ->NaN
Number({}) -> Number('[object Object]') ->NaN
什么时候会把对象转化为数字?
->Number()
->parseInt()
->parseFloat()
->数学运算
4、==在比较的时候,如果数据类型不一样,首先转换为一样的数据类型,然后再作比较
-> null==undefined:true
null===undefined:false
null==0:false
undefined==0:false
null和undefined相等,但是和其它任何值都不相等
-> NaN和谁都不相等(包括和自己也不相等)
NaN===NaN:false
-> 对象==对象 (比较的是空间的地址,地址不一样就不会相等)
[]==[]:false
-> 对象==字符串:都转换为数字
-> 对象==布尔:都转换为数字
-> 对象==数字:对象转换为数字
-> 字符串==布尔:都转换为数字
-> 字符串==数字:把字符串转换为数字
-> 布尔==数字:把布尔转为数字
[]==0:true
false==0:true
true==2:false
[]==false:true
-> 都转换为数字0
![]==false:true
-> ![]:先转布尔在取反 []变为TRUE 取反为FALSE
-> false==false:true
'3px'+3?alert(6):alert(NaN); =>'6'
'3px'-3?alert(0):alert(NaN); =>'NaN'