数据类型
字符串对象和字符串
字符串可隐式转化为字符串对象
var a=new String('a'); var b=new String('a'); a==b; //false,引用不同 a===b; //false,引用不同 a=='a'; //true,内部转换 a==='a';//false,值相同,类型不同 String('a')==='a';//true,显式转换为字符串
是不可变的,其方法是非破坏性的,不能改写其内容。
var a='abc'; a[0]='A'; console.log(a);//结果仍是'abc';
数值型
内部使用浮点数运算
0.1+0.2 !== 0.3; NaN不与任何值相等,判定用 isNaN() 正常数字(除NaN与正负无穷大)判定用isFinite()
null 是字面量,代表没有引用任何对象,是object但是没有对应的类
undefined 是预定义全局变量
object
boolean
object类型都是true
var b=new Boolean(false); !!b;//object对象,true var b=Boolean(false); !!b;//函数内建类型,false;
array
数组赋值是引用赋值,修改被赋值数组也会破坏原数组
要实现非破坏数组,用concat
//浅复制,若遇到数组中有引用部分也会被破坏 var arr=[3,4,5]; var arr2=[].concat(arr); //遍历 var p=console.log; var a=new Array(1,2,3,4,5); p(Object.keys(a),Object.getOwnPropertyNames(a));
删除用delete会留下空隙,用splice(index,num)删除更合适
语句&表达式
switch中case比较是用 === 判定的
do-while
//从右向左打印数字 function printFromRight(n){ do{ console.log(~~n%10); n=~~(n/10);//数字取整 }while(n>0); }
try-catch
var p=console.log; try{ p('start'); null.x; p('here'); }catch(e){//只会有一个catch捕获 p('info: ['+e+']') }finally{ p('end'); }
for vs for each
for...in遍历对象的属性名和值 for each只能遍历属性值
变量&对象
对象和变量的赋值运算,是将对象的引用复制给变量
函数的的参数是对其引用的赋值,实际是值得传递,并不会更改其引用所指向的对象
var p=console.log; function no_swap(a,b){ a^=b; b^=a; a^=b; } var a=6,b=8; no_swap(a,b); p(a,b);//6,8并不改变原对象值 //利用返回值赋值改变 function swap(a,b){ return [b,a]; } [a,b]=swap(a,b); p(a,b);
通过原型链继承的属性无法delete
function MyClass(){} MyClass.prototype.x=5; var obj=new MyClass(); delete obj.x;//返回true但删除失败 p(obj.x);
实现不可变对象
preventExtensions --- 不可新增属性 seal --- 不可新增,删除属性 freeze --- 不可新增、删除、变更属性
JSON
var p=console.log;
//字符串转对象
var s='{"x":1,"y":2,"z":3}';
var obj1=eval('['+s+']');
var obj2=JSON.parse(s);
//对象转字符串
var str2=JSON.stringify(obj);
如有疑问,请文末留言交流或邮件:newbvirgil@gmail.com 本文链接 : https://newbmiao.github.io/2015/02/28/js-data-structure.html