1.数据类型
string,number,boolean,null,underfined,object,symbol(符号,es6新增)
typeof 数据,返回当前数据的数据类型,
typeof 'aa'; //返回"string"
typfof 11; //返回"number"
typeof true; //返回"boolean"
typeof undefined; //返回"undefined"
typeof {}; //返回"object"
typeof null; //返回object,这是个历史遗留问题,bug
typeof Symbol(); //返回"symbol"
if(typeof aa==='undefined){},会先进行typeof运算检查aa是否存在,aa不存在的情况下typeof aa返回undefined。
undefined和undeclared是两码事儿,undefined是值的一种表现形式,undeclared表示变量没有被声明,会报错ReferenceError: a is not defined
2.数组
var a=[1,,2];
var b=[1,undefined,2]
console.log(a,b);//[1, empty, 2] , [1, undefined, 2]
a是稀疏数组,空值a[1]为undefined,但是和b[1]的值还是有区别的
var a=[];
a['name']='tom';
a.length;//0
a['5']='16';
a.length;//6
数组也是对象,包含键值对,也可以包含字符串的键值(key),但是字符串当key时,数组长度不变,如果是数字类的字符串,会将数字类字符串转化为数字,从而数组长度改变
var a="tom";
var b=['t','o','m'];
var c=Array.prototype.join.call(a,'-'); //t-o-m
var d=Array.prototype.map.call(a,function(v){
return v.toUpperCase()+'.';
}).join('') //T.O.M.
var e=Array.prototype.reverse.call(a); //Cannot assign to read only property '0' of object '[object String]'
//变通方法:将字符串转化为数组,数组中反转将数组转化为字符串
var f=a.split('').reverse().join(''); //mot
数组函数处理字符串很方便,虽然字符串没有这些函数,但是可以借用数组的非变更方法处理字符串,字符串的值是不可变的
3.数字
var a=1.5634;
a.toFixed(2);//1.56
11.toFixed(2); //Invalid or unexpected token
(11).toFixed(2); //11.00
11..toFixed(2); //11.00
1.13.toFixed(1); //1.1
tofixed表示小数点保留的位数,能直接在数字上用此方法,会当成数字常量的一部分
es6新增:0b(二进制),0o(八进制),es5:0x(十六进制)
01+0.2===0.3//false
二进制浮点数中0.1,0.2并不是很精确,结果是0.3比较接近的数字0.30000000000000004,
4.null,undefined,NAN
null:值空值(empty value),曾赋过值,但是目前没有值
undefined:没有值,(missing value),从未赋值
NAN:not a number,无效数值,失败数值,坏数值,var a=2/'b';
NAN!=NAN;//唯一一个不等于自身的,结果为true
Infinity:无穷数,有正负,js使用有限数字表示法运算结果可能溢出,此时结果为infinity或者-infinity,如果超出范围就近取整
var a=Number.MAX_VALUE;//1.7976931348623157e+308
a+a;//Infinity
a+Math.pow(2,970);//Infinity
a+Math.pow(2,969);//1.7976931348623157e+308
5.值和引用
var a=1;
var b=a;
b++;
a;//1
b;//2
var c={name:'tom'};
var d=c;
d['age']=18;
c;//{name: "tom", age: 18}
d;//{name: "tom", age: 18}
简单值:通过值复制的方式赋值或传递,包含:string,number,Boolean,null,undefined,symbol
c,d分别指向统一复合值的不同引用,所以他们更改的是同一值,随后指向更改后的值
var a={name:'tom'};
var b=a;
a; //{name: "tom"}
b; //{name: "tom"}
b={name:'jerry'};
a; //{name: "tom"}
b; //{name: "jerry"}
由于引用指向的是值本身而非变量,所以一个引用无法更改另一个引用的指向,b={name:'jerry'}后,并不影响啊指向{name:'tom'}
function getObj(x){
x['age']=18;
console.log(x);//{name: "tom", age: 18}
x={name:'jerry'};
x['age']=20;
console.log(x);//{name: "jerry", age: 20}
}
var o={name:'tom'};
getObj(o);
console.log(o);//{name: "tom", age: 18}
向函数传递o的时候,实际是将引用a的一个复本赋值给x,而a仍指向tom这个对象,但x=jerry并不影响a的指向,不能通过引用x改变引用a的指向,函数传递的是引用
多个对象是对同一object的引用,改变对象属性时,多个对象都改变;对某一对象重新赋值(=),改变的只是某一对象
赋值或参数传递是通过引用还是值复制完全由值类型传递。