美文网首页
2018-10-18 js进阶学习笔记

2018-10-18 js进阶学习笔记

作者: 长弓简 | 来源:发表于2018-10-23 11:23 被阅读0次

    1.基本类型和引用类型、执行环境、作用域的概念
    a.基本类型值有:undefined, NULL,Boolean,Number,和String
    这些类型分别在内存中占有固定的大小空间,例如:数值型在内存中占有八个字节,布尔值只占有一个字节。他们的值保存在栈空间,我们通过按值Kauai访问的。
    b.引用类型: 对象、数组、函数
    引用类型内存中占有的空间不固定,但是内存地址大小是固定的,因此存储的实际上是数据的内存地址。
    c.在变量复制的时候,基本类型复制的是值本身,而引用类型复制的是地址
    注意:我在实际项目中遇到过这样的疑问,什么情况下的新定义一个变量并给它赋值后,通过改变这个变量,会改变赋值的原值的状态?
    用两段代码表示:1. var num1='zhangsan';
    var num2=num1;
    console.log(num1);//输出zhangsan
    console.log(num2);//输出zhangsan
    num2='lisi';
    console.log(num1);//输出zhangsan
    console.log(num2);//输出lisi
    上面这段代码num1是基本类型String,因此将num1赋给num2的时候是复制的值本身,因此在更改num2的情况下不会影响num1的值。
    2.var num1 = {name:'zhangsan'};
    var num2 = num1;
    console.log(num1.name);//输出zhangsan
    console.log(num2.name);//输出zhangsan
    num2.name='lisi';
    console.log(num1.name);//输出lisi
    console.log(num2.name);//输出lisi
    上面这段代码num1不是基本类型,而是引用类型,这种情况下,object的是存放在堆内存中的,而变量的值是一个路径,因此在这种情况下,复制后,num2是一个指向堆内存中的一个路径,在这种情况下更改num2,就会改变堆内存中的值,因此num1也会随之改变。
    d.函数的参数都是按值传递的

    2.执行环境及作用域
    a.执行环境定义了变量或函数有权访问其他数据。
    b.全局执行环境是最外围的执行环境,在web浏览器中,全局执行环境是Window对象,因此,所有的全局变量的函数都是作为Window的属性和方法创建的
    c.变量没有在函数内声明或者声明的时候没有带var就是全局变量,拥有全局作用域,window对象的所有属性拥有全局作用域;在代码任何地方都可以访问,函数内部声明并且以var修饰的变量就是局部变量,只能在函数体内使用,函数的参数虽然没有使用var但仍然是局部变量。
    d.内部环境可以访问所有的外部环境,但是外部环境不能访问内部环境中的任何变量和函数。
    c.在变量的查询中,访问局部变量要不全局变量快。

    3.内存管理
    js中内存的分配和回收都是自动完成的,内存在不适用的时候会被垃圾回收器自动回收。如果程序简单,内存管理不会对你在成太多的困扰,但是复杂的程序内存管理是很重要的。这节了解内存管理的概念,以及一些注意事项。
    a.内存的生命周期,js环境中分配的内存一般有如下生命周期:(1)内存分配:当我们申明变量、函数、对象的时候,系统会自动为他们分配内存。(2)内存使用:即读写内存,也就是使用变量、函数等。(3)内存回收:使用完毕,由垃圾回收自动不在使用的内存。
    b.垃圾回收算法:对垃圾回收算法来说,核心思想就是如何判断内存已经不在使用了。
    c.JavaScript的内存管理注意事项:(1)避免不必要的定义全局变量:当一个变量被定义在全局作用域中,默认情况下JavaScript引擎就不会将其回收销毁,如此该变量就会一直存在于老生代堆内存中,直到页面关闭。(2)及时解除不再使用的变量引用,即将其赋值为null:在内存回收周期中,收回内存不是立即收回,浏览器每隔一段时间检查一次。(3)合理的使用函数,函数的局部变量在函数执行结束后就会自动释放内存。

    全局函数
    全局函数和属性可用于所有内建的JavaScript对象。全局函数又叫顶层函数或系统函数。
    (1)praseInt()函数可解析一个字符串,并返回一个整数。
    (2)parseFloat()函数可解析一个字符串,并返回一个浮点数
    (3)isNaN()函数用于检查其阐述是否是非数字值。
    (4)String()函数把对象的值转化为字符串
    (5)Number()把对象的值转化为数字。
    (6)eval()函数可计算某个字符串,并执行其中的js代码。该方法只接受字符串作为参数,要计算的字符串中必须含有要计算的js表达式或者要执行的语句。
    (7)escape()对字符串进行编码。返回值:已编码的string的副本。其中某些字符被替换成了十六进制的转义序列。该方法不会对ASCII字母和数字进行编码,也不会对下面这些ASCII标点符号进行编码(* @ - _ + . / 。)其他所有的字符都会被转移序列替换。
    (8)unescape()对有escape()编码的字符串进行解码。
    (9)encodeURI()把字符串编码为URI。URI:Uniform Resource Identifier,同意资源标识符。
    (10)decodeURI()解码某个编码的URI
    (11)decodeURIComponent()解码一个编码的URI组件。
    (12)encodeURIComponent()把字符串编码为URI组件。
    (13)三种编码方式的区别:(a)escape不编码字符有69个:主要是为了防止特殊字符造成计算机错误时候应用。(b)encodeURI不编码字符有82个:防止特殊字符串造成URI的传递错误,一般用于页面跳转的时候。(c)防止URI参数中特殊字符串造成参数读取错误,一般用来传递参数。
    (14)isFinite()检查某个字是否为有穷大的数。如果number是有限数字(或可转换为有限数字),那么返回true。否则,如果number是NaN(非数字),或者是正、负无穷大的数,则返回false。Infinity无穷大(系统定义常量)Infinity无穷小(系统定义常量)

    相关文章

      网友评论

          本文标题:2018-10-18 js进阶学习笔记

          本文链接:https://www.haomeiwen.com/subject/uqcjzftx.html