1、数据类型:
1)原始类型: String Boolean Number Null Undefiend
2)引用类型:Object ..........
总结:为什么老生常谈数据类型呢?在开发中他们到底数据类型有什么指引,我从不纠结Null到底是Object类型还是Undefiend类型,没意义的东西不需要花费时间。但是,这里他告诉我们的是:原始类型永远是对象的拷贝,传值不传址;然而,引用类型则传的是引用,改变一个对象的引用会影响对象本身!所以,一定要记住5大原始数据类型。
/** 原始类型操作,传值不传址*/ var str = ‘hello wrolld‘; function changeStr(str) { str = ‘welcome‘; } changeStr(str); console.info(str);
/** 对象引用操作,对象的引用发生改变,那么会改变其他的对象引用*/ var str = { key: ‘hello world‘ }; function changeStr(str) { str.key = ‘welcome‘; } changeStr(str); console.info(str.key);
2、对象属性
1)obj.property
2)obj[property]
总结:从来就没有什么get方法来获取属性值的,都是语言学习多了搞混了。就好像,在Java中经常使用for(String str : list ) ; 然而在Javascript中如果这样使用那么必然错误,Javascript我们应该这样使用 for(var str in list ) ; 有些时候就是一不小心踩雷了!关于对象属性,不要以为上面两种方法是相同的,其实二者差异还是有的,obj.property 那么property必须不能是变量,只是一个obj定义的属性名称,而且这个名称必须符合Javascript变量命名规范,否则你是无法调用的,因为Javascript的对象可以把1作为属性名称,但是他是不符合命名规范的。如果你使用obj[property] 那就不一样了,property是一个变量,这个变量可以是任意的(比如数组遍历的时候是数字,属性遍历的时候可能是字符串等),他也能获取对象对应的属性值。所以,如果知道某个对象的属性我们可以使用obj.property ; 如果我们不知道你们应该采用第二种。
var obj = new Object(); obj.name = ‘maven‘;//必须符合变量的命名规范 obj[1] = ‘git‘;//可以像数组一样建立索引,也就是一个属性 obj[{name:‘svn‘}]=‘cvs‘;// 可以传入任何变量 for (var attr in obj) { console.info(obj[attr]); }
3、删除对象的属性
1) delete obj.property
2) delete obj[property]
总结:网上看了很多资料,说删除一个对象的属性就是把他的值设置为 undefined 或 Null ,说实话,我开始的时候真的相信了,因为,对象不存在就不是undefined吗?后面,当我真正对代码测试才发现被坑了,对象的属性是无法通过赋值来删除的,不信你可以自己用for in 去试试,结果就是这样。尤其是,我在把一个对象转为JSON字符串的时候想要删除对象的一个属性,如果你只是赋值为Null ,那么转为JSON不还是有Null值吗?所以,我们应该采取以上的方式真正的删除对象的属性,让对象的属性不存在,即使使用for in 也无法遍历出来。
var obj = {}; obj.name = ‘key‘; obj.value = ‘mavne‘; obj.age =12; obj.phone= 156; obj.identify = ‘@dfd_dfd‘; console.info(JSON.stringify(obj)) delete obj[‘value‘]; // 删除属性value delete obj.name; // 删除属性 name obj.identify = undefined; // 属性依旧存在,但是如果采用以下方法获取JSON字符串是不会得到identify属性的 obj.age = null;// 属性依旧存在,实质删除了属性对应的值,转为JSON字符串时还是有这个属性 console.info(JSON.stringify(obj))
4、删除数组中指定的元素
1)arrayObj.pop(); //移除最后一个元素并返回该元素值
2)arrayObj.shift(); //移除最前一个元素并返回该元素值,数组中元素自动前移
3)arrayObj.splice(deletePos,deleteCount); //删除从指定位置deletePos开始的指定数量deleteCount的元素,返回所移除的元素
4)delete array[property];//删除指定位置的元素,如果删除则返回true,否则返回false
总结:到底数组的是对象还是对象是数组呢?说实话,二者真的好像,我还是有点赞同数组是对象一说,因为Java里面是在这样说的,一切万物皆对象,估计也包括数组吧!然而,Javascript如果想要删除数组中指定的元素,可以是使用如上四种方法,前面两种限制条件太多,很少使用,后面两种的差异是,arrayObj.splice(deletePos,deleteCount);可以删除多个元素,而且是以删除元素的数组形式返回,而delete array[property]只能一次性删除一个元素,而且返回的是Boolean形式的值。当然二者都是基于数组自身的操作,换句话会说:他们的操作会改变数组本身。另外,Java删除集合中指定元素时,如果是在循环中删除还要用迭代器,否则会报错,而Javascript在循环中删除是不会出现这种错误,所以循环中删除也是没问题的。
var array = new Array(); array[0] = {name:‘k1‘,value:‘dd‘} array[1] = {name:‘k2‘,value:‘dd‘} array[2] = {name:‘k3‘,value:‘dd‘} array[3] = {name:‘k4‘,value:‘dd‘} array[4] = {name:‘k5‘,value:‘dd‘} array[5] = {name:‘k6‘,value:‘dd‘} for(var i = 0 ; i < array.length ; i++){ console.info(i); if( i == 2){ var obj = array.splice(i,1); // 数组自带删除元素的方法,返回一个数组 console.info(obj[0].name); //delete array[i]; 删除对象属性的方法,把数组看成一个对象,然后进行删除属性操作,返回一个Boolean值 } } for(var obj in array){ console.info(array[obj]); }