JavaScript对象(二)

JavaScript对象(二)


目录


一、数组对象(Arr)

1、数组类型检测
a、Array.isArray(对象名)
b、instanceof: 对象名 instanceof Array

var arr = [];
var obj = {};
// 第1种方式
console.log(arr instanceof Array);	// 输出结果:true
console.log(obj instanceof Array);	// 输出结果:false
// 第2种方式
console.log(Array.isArray(arr));	// 输出结果:true
console.log(Array.isArray(obj));	// 输出结果:false

2、添加或删除数组元素
JavaScript数组对象提供了添加或删除元素的方法,可以实现在数组的末尾或开头添加新的数组元素,或在数组的末尾或开头移出数组元素。方法如下
JavaScript对象(二)
push()和unshift()方法的返回值是新数组的长度,而pop()和shift()方法返回的是移出的数组元素。
案例:要求在包含工资的数组中,剔除工资达到2000或以上的数据,把小于2000的数重新放到新的数组里面

var arr = [1500, 1200, 2000, 2100, 1800];
var newArr = [];
for (var i = 0; i < arr.length; i++) {
  if (arr[i] < 2000) {
    newArr.push(arr[i]); // 相当于:newArr[newArr.length] = arr[i];
  }
}
console.log(newArr);  // 输出结果:(3) [1500, 1200, 1800]

4、数组排序
JavaScript数组对象提供了数组排序的方法,可以实现数组元素排序或者颠倒数组元素的顺序等。排序方法如下
JavaScript对象(二)
需要注意的是:reverse()和sort()方法的返回值是新数组的长度
默认是按字符编码顺序排序;若要按其他顺序排序,需自定义函数

function numberOrder(a,b){
					return a-b
				}

            var arr = [1800,1500,3000,900,1200,2100]
			
			arr.sort(numberOrder)

5、数组的索引
在开发中,若要查找指定的元素在数组中的位置,可以利用Array对象提供的检索方法。检索方法如下
JavaScript对象(二)
默认都是从指定数组索引的位置开始检索,并且检索方式与运算符“===”相同,即只有全等时才会返回比较成功的结果

案例:去除数组中重复的元素

function unique(arr) {
  var newArr = [];
  for (var i = 0; i < arr.length; i++) {
    if (newArr.indexOf(arr[i]) === -1) {  newArr.push(arr[i]); }
  }
  return newArr;
}
var demo = unique(['blue', 'green', 'blue']);
console.log(demo);	// 输出结果:(4) ["blue", "green"]

6、数组转换为字符串
在开发中,可以利用数组对象的join()和toString()方法,将数组转换为字符串。方法如下
JavaScript对象(二)

// 使用toString()
var arr = ['a', 'b', 'c'];
console.log(arr.toString());	// 输出结果:a,b,c
// 使用join()
console.log(arr.join());		// 输出结果:a,b,c
console.log(arr.join(''));		// 输出结果:abc
console.log(arr.join('-'));		// 输出结果:a-b-c

7、其他方法
JavaScript还提供了很多其他常用的数组方法。例如,填充数组、连接数组、截取数组元素等。方法如下
JavaScript对象(二)
slice()和concat()方法在执行后返回一个新的数组,不会对原数组产生影响,剩余的方法在执行后皆会对原数组产生影响

补充:

  ① 返回数组的部分元素:slice(start,end):一个新数组,包含从start到end(不包括该元素)指定的array元素。
  ②删除数组元素:
	   a、splice(start):删除从start开始的数组元素
	   b、splice(start,delCount):删除从start开始的delCount个元素
	   c、splice(start,delCount,value...):删除从start开始的delCount个元素,
	      将value插入到start 开始的位置

二、字符串对象

1、字符串对象的使用
字符串对象必须使用new String()来创建,在String构造函数中传入字符串,这样就会在返回的字符串对象中保存这个字符串

var str = new String('apple');	// 创建字符串对象
console.log(str);			// 输出结果:String {"apple"}
console.log(str.length);		// 获取字符串长度,输出结果:5

2、各种字符串操作

A、charAt(n):返回n位置上的字符
B、charCodeAt(n):返回n位置上字符的ASCII码值
C、concat(s1,s2,s3...):连接多个字符串
D、split('分隔符'):将字符串按给定的分隔符,转换成字符串数组
E、substr(start, length):从start开始提取length个字符构成一个新串
F、substring(from, to):提取from和to(不含to)之间的字符构成一个新串
G、toLowerCase():将串中的大写字符转换为小写,不影响原串,返回一个新串
H、toUpperCase():将串中的小写字符转换为大写,不影响原串,返回一个新串	
I、replace(str1, str2):使用str2替换字符串中的str1,返回替换结果,只会替换第一个str1
J、str[index]:获取指定位置处的字符(HTML5新增)

3、根据字符返回位置
字符串对象提供了用于检索元素的属性和方法,字符串对象的常用属性和方法如下
JavaScript对象(二)

var str = 'HelloWorld';
str.indexOf('o');	    // 获取“o”在字符串中首次出现的位置,返回结果:4
str.lastIndexOf('o');  // 获取“o”在字符串中最后出现的位置,返回结果:6

案例:要求在一组字符串中,找到所有指定元素出现的位置以及次数。字符串为 ’ Hello World, Hello JavaScript ’

var str = 'Hello World, Hello JavaScript';
var index = str.indexOf('o');
var num = 0;
while (index != -1) {
  console.log(index);		  // 依次输出:4、7、17
  index = str.indexOf('o', index + 1);
  num++;
}
console.log('o出现的次数是:' + num);  // o出现的次数是:3

4、根据位置返回字符
案例:使用charAt()方法通过程序来统计字符串中出现最多的字符和次数

var str = 'Apple';
// 第1步,统计每个字符的出现次数
var o = {};
for (var i = 0; i < str.length; i++) {
  var chars = str.charAt(i);	// 利用chars保存字符串中的每一个字符
  if (o[chars]) {	               // 利用对象的属性来方便查找元素
    o[chars]++;
  } else {  o[chars] = 1; }
}
console.log(o);		// 输出结果:{A: 1, p: 2, l: 1, e: 1}
// 第2步, 统计出现最多的字符
var max = 0;		// 保存出现次数最大值
var ch = '';		// 保存出现次数最多的字符
for (var k in o) {
  if (o[k] > max) {
    max = o[k];
    ch = k;
  }
}
// 输出结果:“出现最多的字符是:p,共出现了2次”
console.log('出现最多的字符是:' + ch + ',共出现了' + max + '次');

5、字符串操作方法

var str = 'HelloWorld';
str.concat('!');  // 在字符串末尾拼接字符,结果:HelloWorld!
str.slice(1, 3);   // 截取从位置1开始包括到位置3的范围内的内容,结果:el
str.substring(5);      // 截取从位置5开始到最后的内容,结果:World
str.substring(5, 7);  // 截取从位置5开始到位置7范围内的内容,结果:Wo
str.substr(5);           // 截取从位置5开始到字符串结尾的内容,结果:World
str.substring(5, 7);  // 截取从位置5开始到位置7范围内的内容,结果:Wo
str.toLowerCase();  // 将字符串转换为小写,结果:helloworld
str.toUpperCase();  // 将字符串转换为大写,结果:HELLOWORLD
str.split('l');	  // 使用“l”切割字符串,结果:["He", "", "oWor", "d"]
str.split('l', 3);	  // 限制最多切割3次,结果:["He", "", "oWor"]
str.replace('World', '!'); // 替换字符串,结果:"Hello!"

案例:判断用户名是否合法
用户名长度在3~10范围内,不能出现敏感词admin的任何大小写形式

var name = prompt('请输入用户名');
if (name.length < 3 || name.length > 10) {
  alert('用户名长度必须在3~10之间。');
} else if (name.toLowerCase().indexOf('admin') !== -1) {
  alert('用户名中不能包含敏感词:admin。');
} else {
  alert('恭喜您,该用户名可以使用');
}

三、值类型和引用类型

1、值类型:简单的数据类型(字符串、数值型、布尔型、undefined、null)
2、引用类型:复杂数据类型(对象)。变量中保存的是引用的地址(引用类型的特点是,变量中保存的仅仅是一个引用的地址,当对变量进行赋值时,并不是将对象复制了一份,而是将两个变量指向了同一个对象的引用)
3、举例说明:代码中的obj1和obj2指向了同一个对象

// 创建一个对象,并通过变量obj1保存对象的引用
var obj1 = { name: '小明', age: 18 };
// 此时并没有复制对象,而是obj2和obj1两个变量引用了同一个对象
var obj2 = obj1;
// 比较两个变量是否引用同一个对象
console.log(obj2 === obj1);  // 输出结果:true
// 通过obj2修改对象的属性
obj2.name = '小红';
// 通过obj1访问对象的name属性
console.log(obj1.name);	    // 输出结果:小红

上述代码运行后,obj1和obj2两个变量引用了同一个对象,此时,无论是使用obj1操作对象还是使用obj2操作对象,实际操作的都是同一个对象。如下图
JavaScript对象(二)
当obj1和obj2两个变量指向了同一个对象后,如果给其中一个变量(如obj1)重新赋值为其他对象,或者重新赋值为其他值,则obj1将不再引用原来的对象,但obj2仍然在引用原来的对象

var obj1 = { name: '小明', age: 18 };
var obj2 = obj1;
// obj1指向了一个新创建的对象
obj1 = { name: '小红', age: 17 };
// obj2仍然指向原来的对象
console.log(obj2.name);		// 输出结果:小明

当一个对象只被一个变量引用的时候,如果这个变量又被重新赋值,则该对象就会变成没有任何变量引用的情况,这时候就会由JavaScript的垃圾回收机制自动释放。

当obj1和obj2两个变量指向了同一个对象后,如果给其中一个变量(如obj1)重新赋值为其他对象,或者重新赋值为其他值,则obj1将不再引用原来的对象,但obj2仍然在引用原来的对象

var obj1 = { name: '小明', age: 18 };
var obj2 = obj1;
// obj1指向了一个新创建的对象
obj1 = { name: '小红', age: 17 };
// obj2仍然指向原来的对象
console.log(obj2.name);		// 输出结果:小明

当一个对象只被一个变量引用的时候,如果这个变量又被重新赋值,则该对象就会变成没有任何变量引用的情况,这时候就会由JavaScript的垃圾回收机制自动释放

如果在函数的参数中修改对象的属性或方法,则在函数外面通过引用这个对象的变量访问时的结果也是修改后的

function change(obj) {
  obj.name = '小红';	// 在函数内修改了对象的属性
}
var stu = { name: '小明', age: 18 };
change(stu);
console.log(stu.name);	// 输出结果:小红
上一篇:JavaScript进阶教程(6)—硬核动图让你轻松弄懂递归与深浅拷贝


下一篇:Android项目实战(三十七):Activity管理及BaseActivity的实现