一,变量类型
1,值类型:Number,String,Boolean,Null,Undefined
2,引用类型:Object,Array,Function
3,值类型和引用类型的区别:
(1)值类型
1)占用空间固定,保存在栈中(当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁了。因此,所有在方法中定义的变量都是放在栈内存中的;栈中存储的是基础变量以及一些对象的引用变量,基础变量的值是存储在栈中,而引用变量存储在栈中的是指向堆中的数组或者对象的地址,这就是为何修改引用类型总会影响到其他指向这个地址的引用变量。)
2)保存与复制的是值本身
3)使用typeof检测数据的类型
4)基本类型数据是值类型
(2)引用类型
1)占用空间不固定,保存在堆中(当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的参数传递时很常见),则这个对象依然不会被销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在核实的时候回收它。)
2)保存与复制的是指向对象的一个指针
3)使用instanceof检测数据类型
4)使用new()方法构造出的对象是引用型
二,变量计算
1,强制类型转换
(1)字符串拼接
var a = 10+10; //20
var b = 10+'10'; //'1010'
(2)==运算符(0,’ ',null,undefined都会转为false,其他会转为true)
null == undefined; //true
100 == '100'; //true
0 == ' '; //true
(3)if 语句(0,’ ',null,undefined都会转为false,其他会转为true)
(4)逻辑运算(0,’ ',null,undefined都会转为false,其他会转为true)
console.log(10&&0); //0
console.log(!window.abc); //true
2,js中= =和= = =区别
(1)===:值相等且类型相同。
(2)===:两边值类型不同的时候,要先进行类型的转换,再比较。
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
7)undefined和null比较
undefined == null //true undefined和null 比较返回true,二者和其他值比较返回false
Number(null) //0