对象
对象的操作(另一种)
var obj = { 'name': 'jack', age: 18, 'aaa$bbb': 'test', 1: 666 }
增
对象名['键名'] = 值
obj.sex = 1 alert(obj.sex)
删
delete 对象名['键名'] = 值
alert(obj['1']) delete obj['1'] alert(obj['1'])
改
对象名['键名'] = 值
alert(obj['aaa$bbb']) obj['aaa$bbb'] = 888 alert(obj['aaa$bbb'])
查
对象名['键名']
var a = 2 alert(obj[a]) // 因为不存在这个键名 所以报undefined错误
对象的遍历
使用 for in 循环来遍历对象
var obj = { name: 'Jack', age: 18 } for (var key in obj) { console.log(key) } // 会在控制台打印两次内容,分别是 name 和 age
-
for in 循环的遍历是按照对象中有多少成员来决定了
-
有多少成员,就会执行多少次
-
key
是我们自己定义的一个变量,就和 for 循环的时候我们定义的 i 一个道理 -
在每次循环的过程中,key 就代表着对象中某一个成员的 属性名
数据类型赋值区别
var a = 100; // 在栈内存开辟一个独立的空间 var b = a; // 先给b在栈内存开辟一个空间 然后a中的100 给到 b // 两个空间各自独立 alert(a); // 100 alert(b); // 100 b = 200; alert(a); //100 修改b 不影响a alert(b); //200
var a = {name:'zhangsan'} // 栈内存中开辟空间 起名a 堆内存开辟空间 var b = a; // 栈内存开辟空间b 堆内存的地址赋值给a a b就同时指向一个堆内存地址 console.log(a.name)// zhangsan console.log(b['name'])// zhangsan b.name = 'lisi' // 所以修改b 就会影响a console.log(a.name)// lisi console.log(b['name'])// lisi
面试题
var obj = {'name':'rose'}; function test(){ obj.name = 'jack'; obj = {}; obj.name = 'jerry'; console.log(obj.name); } test(); console.log(obj.name); // ver obj = {} 表示 obj 是一个空对象 var obj = {'name':'**'} function test(){ obj.name = '^^' obj = {} obj.name = '@@@' console.log(obj.name) } test() console.log(obj.name)
在堆内存开辟一个空间 0xf001 name:rose 然后把地址给到栈内存的obj
test 函数执行
obj.name = 'jack' 访问全局变量给 0xf001空间内的name 改为 jack
obj = {} 给obj全局变量进行赋值 在堆内存开辟了一个空间 0xf002 然后把这个地址给到栈内存obj
obj 内的地址就变成了 0xf002
obj.name = 'Jerry'
访问全局变量 给0xf002空间 添加一对 name: 'jerry'
console.log(obj.name)访问全局变量 也就访问0xf002这个空间 根据键取到 jerry
函数执行完毕
console.log(obj.name)访问全局变量 也就访问0xf002这个空间 根据键取到 jerry
数组
数组是一个 数据的集合
把一些数据放在一个盒子里面,按照顺序排好
[1, 2, 3, 'hello', true, false]
数组的建立
字面量创建一个数组
-
直接使用
[]
的方式创建一个数组// 创建一个空数组 var arr1 = [] // 创建一个有内容的数组 var arr2 = [1, 2, 3]
内置构造函数创建数组
-
使用 js 的内置构造函数
Array
创建一个数组// 创建一个空数组 var arr1 = new Array() // 创建一个长度为 10 的数组 var arr2 = new Array(10) // 创建一个有内容的数组 var arr3 = new Array(1, 2, 3)
数组的属性
数组的length
-
length 就是表示数组的长度,数组里面有多少个成员,length 就是多少
数组的索引
-
索引,也叫做下标,是指一个数据在数组里面排在第几个的位置
-
索引都是从 0 开始的
-
想获取数组中的第几个就使用
数组[索引]
来获取var arr = ['hello', 'world'] console.log(arr[0]) // hello console.log(arr[1]) // world
冒泡排序
先遍历数组,挨着的两个进行比较,如果前一个比后一个大,那么就把两个交换位置
数组遍历一遍以后,那么最后一个数字就是最大的那个了
然后进行第二遍的遍历,还是按照之前的规则,第二大的数字就会跑到倒数第二的位置
以此类推,最后就会按照顺序把数组排好了
// 冒泡排序 // 18 2 20 33 1 13 var sum = [18, 2, 20, 33, 1, 13]; for (var i = 0; i < sum.length-1; i++) { for (var j = 0; j < sum.length - 1 - i; j++) { if (sum[j] > sum[j + 1]) { var num = sum[j + 1]; sum[j + 1] = sum[j]; sum[j] = num; } } document.write(sum+"<br>"); } document.write("交换完以后"+sum+"<br>");
选择排序
先假定数组中的第 0 个就是最小的数字的索引
然后遍历数组,只要有一个数字比我小,那么就替换之前记录的索引
知道数组遍历结束后,就能找到最小的那个索引,然后让最小的索引换到第 0 个的位置
再来第二趟遍历,假定第 1 个是最小的数字的索引
在遍历一次数组,找到比我小的那个数字的索引
遍历结束后换个位置
依次类推,也可以把数组排序好
var nums = [8, 4, 2, 6, 3, 7, 1, 5, 9]; for (var i = 0; i < nums.length; i++) { var minIndex = i; for (var j = i+1; j < nums.length; j++) { if (nums[j] < nums[minIndex]) { minIndex = j; } } var num = nums[i]; nums[i]=nums[minIndex]; nums[minIndex] = num; document.write(nums + "<br>"); } document.write("交换完以后" + nums);