【前端笔记】谈谈javascript中的数组、字符串和值的引用

453 阅读3分钟

这是我参与8月更文挑战的第15天,活动详情查看:8月更文挑战

前言

大家好哇,今天来记录一下javascript的数组、字符串和值的引用,内容主要参考《你不知道的JavaScript》(中卷),同时会加上自己的思考,以及实践的例子,有道是好记性不如烂笔头,读了书一定要勤做笔记,这样不仅记的牢固,也能提升自己的水平。

另外提前说明哦,这是一篇前端笔记类的文章,属于个人记录。各位高人请绕道勿喷,谢谢~

正文

数组

使用delete运算符删除数组中某下标元素之后,该下标不被删除,元素被空白单元(empty)所替代,所以数组的length属性不会发生改变。如:

同样的,我们可以新建含有空白单元的数组,如:

数组属于对象的一种,所以它也能存放键值对,不过键值对不计入数组的length,但是如果键能被强转为int(不含小数),则计入数组的length,并且键会被当做index下标。

类数组: 比如arguments和获取到的DOM元素列表都是类数组,类数组实际上是一组通过数字索引的值。通常使用 Array.prototype.slice.call(arguments) 或者 Array.from(arguments) 来实现类数组转化为数组。

字符串

字符串有length属性, 取字符串n下标处的某字符可以用str[n],但正确方法应该是str.charAt(n)

字符串不可变, 字符串的成员函数不会改变其原始值,而是创建返回一个新的字符串,不像数组的成员函数都是在其原始值上操作。

字符串可借用数组的成员函数,如:

Array.prototype.join.call(str)表示str借用数组的join方法。

值和引用

js在赋值/传递时,简单值通过复制的方式来赋值/传递,复合值通过引用复制的方式来赋值/传递。

简单值:null,undefined,字符串,数字,布尔,ES6中的symbol。

复合值:对象(包括数组和封装对象),函数。

一个复合值可以有多个引用,每个引用对其做出更改,会影响所有的引用结果,因为这些引用指向的是同一个值。而简单值只会有一个引用,所以更改也只作用于当前的引用。

形参也是引用的一种,如foo(x),传入的b若是复合值,传入的只是引用,相当于x=b,而不是foo(a)

let a = [1,2,3]
foo(a)
function foo(x){
    x.push(4) 
    console.log(a) // [1,2,3,4]
    x=[] //相当于给x赋值了新的值,如果是x.length = 0才是不改变引用值,清空了引用值的这个数组
    console.log(a) // [1,2,3,4]
    x.push(5,6,7,8)
    return x // [5,6,7,8]
}

函数传入简单值类型的变量a,并不会对a做出更改,比如

let a = 1
foo(a)
function foo(x){
    x = x*2
    console.log(x) // 2
    console.log(a) // 1
}

若要传入函数的复合值不改变,仅函数内的x改变,则应拷贝一份该复合值。

若要传入函数的简单值改变,则应将其封装至复合值内再进行传入。

后记

你好哇,我是南极大冰块,一个技术与颜值成正比的前端工程师,崇尚一针见血的搞定前端问题,希望我的博客有帮助到了你。

关注我,前端路途一起走。嘿哈~😛