A.数据类型/值类型
原始值(栈数据 stack:先进后出):
NumberStringBooleanundefinednull(表示占位)引用值(堆数据 heap:先进先出):对象
objectarrayfunctiondataRegExp...
原始和引用值的不同:赋值形式不同,原始值是不可改变的值
var a=1;
var b=a;//b 自己创建了一个房间,并把 a 的值拿过来
a=2;//a 改变的是自己房间里面的数据
document.write(b);// b不会因为a的改变而改变
//1
var arr=[1,2];
var arr1=arr;//arr 给了 arr1 数据地址的钥匙
arr.push(3);//钥匙指向的房间里面发生变化
document.write(arr1)//1,2,3
var arr=[1,2];
var arr1=arr;
arr=[3,4]//arr 更换了的房间,并拿到新钥匙
document.write(arr1);//3,4
B.数据类型转换
1. 显式类型转换
Number()
parseInt(demo,radix);将该基低下的数字转为10进制
parseInt(12,8)//10
parseFloat()
String()
Boolean()
toString(radix);//undefined和null不能用
10..toString(8)//12
2. 隐式类型转换
isNaN()先将数据转换为number类型,然后在判断是不是NaN
isNaN("123")//false
isNaN("abc")//true
isNaN(undefined)//true;
isNaN(null)//false;
++/-- 、+/-(正负):数字类型转换
var a="123";
a ++; //124
+'123'//123
+(加):如果都是数字(若是布尔先转为数字)进行数学计算,若不是调用String()
1 + '123'//'1123'
[123] + 123//'123567'
'123'+NaN//'123NaN'
1 + NaN//NaN
1 + undefined//NaN
1 + undefined + NaN//NaN
-、*、/、%(剪、乘、除、余):数字类型转换
1-'123'//-122
[6] % [4]//2
'2' * [2]//4
'2' * '2'//4
&& ||:Boolean()
< > <= >=:有数字的比较,转换为数字;字符串比较,比较编码顺序。
== !=:
'123' == 123 // true
[123] == 123 //true
true == '1'// true
1 == true // true
'1' == true // true
2 == true // false
'2' == true //false
//我粗爆的理解:将右值隐式转换为左值类型再比较。若,右值是布尔值,那么先转为数字,再转为左值类型进行比较。
//特例:
undefined == null//true;
NaN == NaN//false
//NaN是唯一不等于自身的
不发生类型转换:=== !==
C.数据类型判断
1. typeof
区分【原始值】和【对象】,并检查【原始值】类型,返回一个字符串。返回值
'string''number''boolean''undefined''function'和'object'
typeof(2)//'number'
typeof('123')//'string'
typeof(false)//'boolean'
typeof(function(){console.log(1)})//'function'
typeof([1,2,3])//'object'
typeof(null)//'object'
typeof(defined)//'undefined'
typeof(a)//'undefined' (a未定义)返回字符串
注意:
typeof(null)返回'object'
例子1
var str=false+1;
//str = 1
document.write(str);//1
var demo=false==1;
//demo = false
document.write(demo);//false
//-true+(undefined)+"" =>-1+(undefined)+""=>NaN+""=>"NaN"
if(typeof(a)&&-true+(undefined)+""){
//"undefined" && "NaN" => "NaN"
document.write('我在哪里?');
//我在哪里?
}
//先计算*:"11"*2=22
if(11+"11"*2==33){
document.write('我在干什么?');
//我在干什么?
}
!!" "+!!""-!!false||document.write('我是谁?');
//true+false-false=>1 || 不运行
//Boolean("")=>false;Boolean(" ")=>true