分支结构中的switch
switch(值&条件表达式){
case 值:
操作;
break;
case 值:
操作;
break;
...
default:
默认操作
}
switch根据值或条件表达式来找对应的值,然后再来执行操作。如果所有的值都没有对应上,则执行default中的默认操作。
循环结构 do...while,相对于while先执行然后再判断。所以至少执行一次。
按值传递
var a = 1; var b = a; b = 3; console.log(a, b); //=>a=1,b=3 深拷贝, 修改其中一个变量的值,不会影响到另一个变量的值 var c = { name: 'sunck' }; var d = c; d.name = 'sunck.com'; console.log(c, d); //浅拷贝 c和d两个对象的name属性都成为了sunck.com
像下文数组中的slice和contact获取到的值,这一操作都是深拷贝,不会对原来数据产生影响。
变量提升& :
使用var关键字声明变量的时候,浏览器默认会将变量的定义提前到当前作用域(函数作用域,或则全局作用域)的最前面,但是值的定义会在引用数据类型定义的前面,而赋值留在当前,如果代码中遇到没有用var 关键字就给变量赋值的,会污染上一层作用域。
而重复声明是指一个变量重复定义,后面的值会覆盖前面的值。
for in 、forEach 、for of 这三种方式可以遍历对象;
for in 的书写格式
// 创建哈希数组 let arr = [];
arr["姓名"] = '周笔畅'; arr["职业"] = '歌手'; arr["年龄"] = 37; console.log(arr); for (let i in arr) { // 遍历属性名和属性值 i为属性名 arr[i]为属性值 console.log(`${i}:${arr[i]}`); }
但是如果for in遍历的是一个普通数组的话,会把下标作为属性名,而对应的数据作为属性值。
forEach( )方法中的参数
// forEach 迭代(遍历) 数组 var arr = [1, 2, 3]; var sum = 0; arr.forEach(function(value, index, array) { console.log('每个数组元素' + value); console.log('每个数组元素的索引号' + index); console.log('数组本身' + array); // 累加求和 sum += value; }) console.log(sum);
for of 的使用格式
// demo1 初体验 var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9], sum = 0; for (var element of arr) { sum += element; } console.log(sum); // demo2 用for/of 遍历属性名连接成的字符串 var o = { x: 0, y: 1, z: 2 } keys = ''; for (var k of Object.keys(o)) { keys += k; } console.log(keys); //=> 'xyz' // demo3 用for/of 遍历属性值 var oSum = 0; for (var k of Object.values(o)) { oSum += k; } console.log(oSum); //=>3 // demo4 用两个变量来接属性名和属性值 var pairs = ''; for (var [v, k] of Object.entries(o)) { pairs += v + k; } // demo5 查找字符串中字母出现的频率 console.log(pairs); var frequency = {}; for (var letter of 'mississippi') { if (frequency[letter]) { frequency[letter]++; } else { frequency[letter] = 1; } } console.log(frequency);
数组相对于变量可以存储更多的数据,数据也可以数组;它的创建有字面量法,使用构造函数创建,但是使用构造函数创建如果参数只为一个数字,则会创建一个那个数长度的空数组。
哈希数组:可以自定义下标(本质是设置数组对象的属性名和属性值),但是就没有数组长度了。
访问数组元素:arr[ '自定义属性名' ]
遍历哈希数组可以使用for in 。
哈希数组原理:将字符串,计算出一个尽量不重复的数字(地址值),如果字符串内容相同,则计算出的数字也一定是相同的
添加元素:将自定义下标交给hash算法,得到一个数字(地址值),把我的元素保存到了这个地址值之中
读取元素:将指定的自定义下标交给hash算法,得到一个和添加时完全相同的数字(地址值),根据地址值找到之前保存的东西
拓展:js里面一切的东西都是对象:除了undefined和null
常见的数组的方法(部分)
API | 数组中的API作用 |
---|---|
(非破坏性方法)arr.join( ) | 将数组中的数据进行拼接,小看括号里面的参数(字符串)就是连接的字符。 |
(非破坏性方法) arr.concat( ) | 将数组中的内容进行无缝拼接,里面可以是一串数据(数据之间用逗号分隔),或直接是一个数组。 |
(非破坏性方法)arr.slice() | 将数组进行切片,含头不含尾,如果第二个参数不写,则表示到末尾结束(包含末尾元素),如果是-n,则表示截取到倒数第n个元素为止(第n个取得到)。 |
arr.splice( ) | 删除:var dels=arr.splice(starti,n);//返回一个删除的元素形成的数组 插入:arr.splice(starti,0,值1,....);//1.新插入的元素占领位置,其余元素往后面移动;2.因为没有删除元素,所以返回的是一个空数组;3.不要直接插入元素,不然会形成一个部分二维数组。 替换:arr.aplice( starti,n,值1,... ) |
arr.reverse( ) |
释放引用类型(
):浏览器有两种垃圾回收的方法:标记清除法、引用计数法
标记清除法:函数中的变量,在函数执行完之后就会被销毁释放内存。
引用计数法:看对数据的引用次数是否为0,如果为0,就会回收;像定义了全局变量但是从来未使用的那种,就要手动设置为null进行释放内存。