分支结构中的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获取到的值,这一操作都是深拷贝,不会对原来数据产生影响。

 

 

变量提升&window全局对象污染&重复声明

使用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进行释放内存。

posted on 2022-04-10 22:15  叛逆的缪斯  阅读(31)  评论(0编辑  收藏  举报