JS高级程序设计(4-5章)-笔记

隔离级
• 阅读 1457

写在前面

本文记录的是我不熟悉或者我认为值得注意的地方,并不是书上知识点的概括


第4章 变量、作用域和内存问题

对象是按引用传递的(我理解的是传值其实传的是一个指针,该指针指向内存中的某个对象)。举例如下:

const a = {name: 'aaa'}
const b = a // 这时候a和b其实指向的是同一个对象
console.log(b.name)  // aaa
b.name = 'bbb'
console.log(b.name)  // bbb
console.log(a.name)  // bbb 在改变b时a也被改变了

对于简单的对象(属性的值都为基本数据类型),赋值时采用const b = {...a}或者const b = Object.assign({}, a)可以使得b中的对象是一个新对象

Lodash提供了cloneDeep()函数用于深拷贝

对象按引用传递是因为这样比较节约内存(毕竟多个对象其实只存了一份嘛),弊端就是容易引起不被希望的变化。


JS具有自动垃圾回收机制,开发人员不用关心内存使用问题,其原理是找出不再继续使用的变量,释放其占用的内存

最常用的回收方式是标记清除,另一个不太常见的是引用计数

引用计数中,无法处理循环引用(对象a中包含指向b的指针,对象b中也包含指向a的指针),举例如下

function problem() {
    const a = {}
    const b = {}
    a.obj = b
    b.obj = a
}

可以通过在函数结尾断开引用来解决循环引用的问题,如下

function problem() {
    const a = {}
    const b = {}
    a.obj = b
    b.obj = a
    // 别的啥啥操作
    
    // 设为null即可
    a.obj = null
    b.obj = null
}

优化内存占用:无用的数据将其值设为null


第5章 引用类型

引用类型的值(对象)是引用类型的一个实例

新对象是new操作符后面跟一个构造函数来创建的


数组的sort()方法默认是按从小到大排序,会根据每一项的toString()方法得到的字符串进行排序。由于是比较的是字符串,在大多数情况下,排序结果不是我们期望的(比如'10'<'5'),我们需要自己去写一个排序函数传给sort()

数组的concat()可以接受多个参数,如下

const a = [1, 2]
const b = a.concat(3, [4, 5])
console.log(b) // [1, 2, 3, 4, 5]

数组的splice()用于在数组中插入一个或者多个值,如下

const a = [1, 4, 5]
a.splice(1, 0, 2, 3) // 接收的参数依次为 index,要删除的元素个数,要插入的元素们
console.log(a) // [1, 2, 3, 4, 5]

所以数组的splice()也可用于替换数组中的某些项,如下

const a = [1, 2, 3, 4, 5]
a.splice(1, 2, 22, 33)
console.log(a) // [1, 22, 33, 4, 5]

由于函数也是对象,所以函数名其实是一个指向函数对象的指针

定义一个函数可以用函数声明 function funcName() {}或者函数表达式 const func = function() {}, 建议用函数表达式定义函数,好处是定义之后不可被修改,也不会存在函数声明提升

函数内部有两个特殊对象,argumentsthisarguments是一个类数组对象,包含着所有传入函数中的参数,this指向的是函数执行的环境对象


字符串的toLocaleLowerCase()是针对地区作了特殊处理的(不同地区对于某些值的转换规则会有些不一样),相对于toLowerCase()来说更安全


完。

点赞
收藏
评论区
推荐文章
徐小夕 徐小夕
4年前
《javascript高级程序设计》核心知识总结
此文是对js高级程序设计一书难点的总结,也是笔者在看了3遍之后的一些梳理和感想,希望能借此巩固js的基础和对一些核心概念有更深入的了解。摘要js基本的数据类型和关键点变量,作用域和内存问题垃圾回收机制面向对象的程序设计实现类与继承的经典方式BOM和DOM对象DOM扩展与高级API介绍高级编程技巧跨文档消息传递和aja
Easter79 Easter79
3年前
this到底指向啥?看完这篇就知道了!
JS中的this是一个老生常谈的问题了,因为它并不是一个确定的值,在不同情况下有不同的指向,所以也经常使人困惑。本篇文章会谈谈我自己对this的理解。this到底是啥其实this就是一个指针,它指示的就是当前的一个执行环境,可以用来对当前执行环境进行一些操作。因为它指示的是执行环境,所以在定义这个变量时,其实是不知道它真正的值的,只
御弟哥哥 御弟哥哥
4年前
彻底理解js的执行上下文,以及变量对象
在js中,执行上下文(ExecutionContext)是非常重要的一种对象,它保存着函数执行所需的重要信息,其中有三个属性:变量对象(variableobject),作用域链(scopechain),this指针(thisvalue),它们影响着变量的解析,变量作用域和函数this的指向。上下文栈(ExecutionContextS
Kevin501 Kevin501
4年前
Go语言中new()和make()的区别
1.Go语言中的值类型和引用类型值类型:int,float,bool,string,struct和数组(数组要特别注意,别搞混了)变量直接存储值,分配栈区的内存空间,这些变量所占据的空间在函数被调用完后会自动释放。引用类型:slice,map,chan和值类型对应的指针变量存储的是一个地址(或者理解为指针),指针指向内存中真
Wesley13 Wesley13
3年前
ES6模块与CommonJS模块有什么区别?
ES6Module和CommonJS模块的区别:CommonJS是对模块的浅拷贝,ES6Module是对模块的引用,即ES6Module只存只读,不能改变其值,具体点就是指针指向不能变,类似constimport的接口是readonly(只读状态),不能修改其变量值。即不能修改其变量的指针指向,但可以改变变量内部指针指向,可以对comm
Stella981 Stella981
3年前
JavaScript易错知识点整理
前言本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由浅入深的介绍和讲解,其中也涉及了一些ES6的知识点。JavaScript知识点1.变量作用域vara1;functio
Stella981 Stella981
3年前
JavaScript的深拷贝和浅拷贝
一、数据类型数据分为基本数据类型(String,Number,Boolean,Null,Undefined,Symbol)和对象数据类型。、1.基本数据类型的特点:直接存储在栈(stack)中的数据2.引用数据类型的特点:存储的是该对象在栈中引用,真实的数据放在堆内存里。引用数据类型在栈中存储了指针,该指针指向堆中该实
Stella981 Stella981
3年前
JavaScript的 基本数据类型
第一:Javascript对象是第二:Javascript中第三:Javascript的对象是数据;第四:JavaScript中的对象可以简单理解成"名称:值"对(name:value)。名称(name):"名称"部分是一个JavaScript字符串参考https://www
Wesley13 Wesley13
3年前
C89和C99标准比较
1、增加restrict指针C99中增加了公适用于指针的restrict类型修饰符,它是初始访问指针所指对象的惟一途径,因此只有借助restrict指针表达式才能访问对象。restrict指针指针主要用做函数变元,或者指向由malloc()函数所分配的内存变量。restrict数据类型不改变程序的语义。如果某个函数定义了两个restrict指针变
Stella981 Stella981
3年前
Python C 扩展的引用计数问题探讨
PythonGC机制对于Python这种高级语言来说,开发者不需要自己管理和维护内存。Python采用了引用计数机制为主,标记清除和分代收集两种机制为辅的垃圾回收机制。首先,需要搞清楚变量和对象的关系:变量:通过变量指针引用对象。变量指针指向具体对象的内存空间,取对象的值。对象,类型已知,每个对象都包
Wesley13 Wesley13
3年前
C++指针学习记录
太久没去blog.com更新文章,导致他们要删掉我的blog,无奈只好把我之前收集的其他的文章搬到这里。先声明,这些文章都是网络上的资料,出处我已经忘记了,不好意思。1管理好自己的指针,在函数作用域内消失时让其消失,或者将其引用给其他外部指针。2函数参数在执行时,编译器会在栈上使用临时变量\_p,退出操作时使\_pp,所以只是值传递时,只
隔离级
隔离级
Lv1
从今后,梦魂千里,夜夜岳阳楼。
文章
3
粉丝
0
获赞
0