一,变量和作用域

  1, js变量可以保存两种类型,基本类型、引用类型和symbol类型,基本类型有5种:undefined、null、boolean、number、string,它们都有以下的特征

    • 基本类型在内存中占据固定大小的空间,因此被保存在栈内存中
    • 从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本
    • 引用类型的值是对象,保存在堆内存中
    • 包含引用类型的变量只是一个指向该对象的指针
    • 复制引用类型,只是复制了指针,其实两个变量都指向同一个对象。
    • 确定基本类型的种类可以使用typeof操作符,确定是哪种引用类型可以使用instanceof操作符,也可以使用Object.prototype.toString.call()来进行处理 

  2,所有变量都存在一个执行环境,这个执行环境决定了变量的生命周期和访问区间

    • 执行环境分为全局和函数执行环境
    • 每次进去一个新的执行环境,都会创建一个用于搜索变量和函数的作用域链
    • 变量的执行环境有助于确定何时释放内存   

二,引用类型

  1,Object类型

    创建Object实例的方法有三种,

      Object.create

      new Object()

      对象字面量

    一般用点表示法来访问对象属性,不过也可以用方括号来访问,方括号的优点是可以通过变量来访问属性。

  2,Array类型

    创建Array实例有两种方法

      new Array()  或者 省略new   Array(),如果只有一个参数并且为数值,则创建一个数值长度的数组,每一项为undefined,如果为其他类型,则创建一个只有那个值的一项的数组。

      数组字面量方式  [1,2,3]

    数组的length属性是可以设置的,通过设置length可以从数组的末尾移除项或者向数组中添加新项,添加的新项都为undefined

    检测数组:  value instanceof Array : 使用instanceof的问题在于,它假定的只有一个全局执行环境,如果页面中包含多个框架,那实际上就有两个以上不同的全局执行环境,从而存在两个以上的Array构造函数,如果从一个框架传数组到另一个框架,那么这两个数组分别有不同的构造函数。这里可以使用Array.isArray()来进行检测。

    转换方法:

      toString():返回数组每个值的字符串拼接成的以逗号分隔的字符串。

      valueof(): 返回的还是数组本身

      toLocalString() :和toString返回的一样。

      join() :  默认也是返回数组每个值的字符串拼接的以逗号分隔的字符串,可以自定义分隔符。

    栈方法和队列方法:

      push: 后进   , 修改原数组,返回新数组的长度。

      pop: 后出,  修改原数组,返回移除的项

      unshift: 先进 , 修改原数组,返回新数组的长度

      shift : 先出,修改原数组,返回移除的项

    重排序:

      reverse() : 反转数组,改变原数组    返回值为排序之后的数组

      sort() :  调用数组每一项的toString 方法,然后比较得到的字符串。  返回值为排序之后的数组。会改变原数组。

    操作方法:

      concat() : 合并数组, 返回值为合并之后的数组,不改变原数组,

      slice() : 参数为起始的位置和  结束位置,结束位置不包含在内。  返回起始位置到不包含结束位置的数组,  不改变原数组。

      splice() :  用做删除的话:   第一个参数为起始位置,第二个参数为删除的项数。

             用做插入和替换的话: 第一个参数为起始位置,第二个参数为删除的项数, 剩余的参数为插入的项数。

    位置方法:

      indexOf() :  接受两个参数, 要查找的项和开始查找的位置,从数组的头部开始查找

      lastIndexOf() : 和indexof一样, 不同的是从数组的尾部开始查找

    迭代方法: (every,filter, forEach, some,map    :传入的函数都接受三个参数,item index 和 该数组)

      every() : 对数组的每一项都运行函数,如果都为true,则返回true

      some() : 对数组的每一项都运行函数,如果其中一项为true,则返回true

      filter() : 对数组的每一项都运行函数,返回 运行函数为true的 项组成的数组。

      forEach () : 对数组的每一项运行函数,没有返回值。

      map() : 对数组的每一项运行函数, 返回值为  运行函数结果所组成的数组。

      forEach和map的区别是, forEach没有返回值,map有返回值,可以链式调用, forEach一旦运行了不能跳出循环。

    归并方法:

      reduce() :  接收的函数有四个参数,前一个值,当前的值,项的索引和数组对象。

      reduceRight() :  和reduce相同,这个是从后到前执行。

  3,Date类型

    创建一个日期对象:  new Date()

      方法:

        getTime() :  获取日期的毫秒数

        getFullYear() : 获取四位数的年份

        getMonth() :  返回月份,从0开始

        getDate() : 返回天数,1-31

        getDay() : 返回星期几,0表示星期天,6为星期六

        getHours()   getMinutes()   getSeconds()  getMilliseconds()

  4,RegExp类型

    1,字面量创建:var reg = /pattern/ flags

      flags:

        g:表示全局模式,

        i:表示不区分大小写

        m:表示多行模式  

    2,构造函数创建:(接收两个参数,一个是要匹配的字符串,另一个是标志字符串) 两个参数必须都是字符串

    3,实例方法

      exec() : 返回包含第一个匹配项信息的数组,包含index和input,还包含了其他捕获组匹配的字符串。如果设置 了全局标志g,则每次调用exec都会从上一次的位置查找,如果没有全局的标志,则始终返回第一个匹配项的信息。

      test() :  参数为字符串,如果该字符串与该正则模式匹配,则返回true,否则返回false

      toString() toLocaleString(): 返回该正则的字面量

      valueOf() : 返回该正则表达式本身

    4,RegExp构造函数属性

      从构造函数可以得到当前作用域中所有exec()和test()执行的更多信息。

      有9个用于存储捕获组的构造函数属性。  $1 - $9

  5,Function类型

    函数实际上是对象,每个函数都是Function类型的实例,都有属性和方法。由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。

    因为函数名为指针,所以函数没有重载,后面的函数会覆盖前面的函数。

    函数声明会声明提前,函数表达式不会,其他的两个是等价的。

    函数的内部属性:

      1,agruments

      2,this  

    函数属性和方法:

      length 和 prototype:  length表示希望接收的参数的个数。  prototype是函数的原型对象。

      apply 和 call : 设置函数中this的指向。 第一个参数为指向的作用域, 其余的参数,apply为数组,call为展开的参数。

      bind : 创建一个函数的实例,this值会绑定到传给bind()函数的值。

  6,基本包装类型

    在读取基本类型的时候,后台会创建一个相应的基本包装类型的对象,从而能让我们能调用方法来操作这些数据。

       var str = 'hello world'; var s = str.substring(2);

       var str = new String('hello world');  var s = str.substring(2);  str = null;

      1, Boolean类型 (不建议使用)

      2,Number类型 :  var n = new Number(10)    ;

        重写了valueOf,返回对象表示的基本类型的数值, 也重写了toString和toLocaleString,返回字符串形式的数值。

          toString() :传递一个表示基数的参数,返回对应进制的字符串形式。  var n = 10;   n.toString(2)  //1010 ......

          toFixed() :  按照参数指定的小数位,返回带有小数点的数值字符串

          toExponential() :  返回以指数表示法表示的数值的字符串形式。

        toPrecision() :  会根据处理的数值,看是调用toFixed 还是调用toExponential

      3,String类型 :

         length属性返回实例的字符数量。

        1,字符方法:

          charAt():  返回指定位置的字符      <-->     还可以用方括号[index] 来返回指定位置的字符

          charCodeAt() : 返回指定位置的字符编码

             concat() :  拼接字符串, 返回拼接得到的字符串,不改变原字符串。 还可以使用“+”操作符来进行多个字符串拼接。

          slice () :  接收两个参数,start开始和end结束,截取的字符串不包括end,支持负数

          substring () :  和slice一样, 只是end 如果为负数的话,会被自动转换为0,  如果end比start小, 则转换start和end

          substr() : 两个参数, start开始位置和 length要截取的长度

          indexOf () :  从字符串中搜索指定的字符串,如果没有找到则返回-1,找到的话就返回下标位置, 第二个参数为从哪个位置开始搜索。

          lastIndexOf() : 和indexOf 类似, 不同的是从字符串的尾部开始查找。

          trim() :   返回删除了前置和后置空格的新字符串, 不改变原来的字符串。

          toLowerCase(), toUpperCase() , toLocaleLowerCase(), toLocaleUpperCase()  ,  通用方法和针对地区的方法。

         匹配方法:

          match() : 本质上和正则的exec() 方法相同,接收一个正则的参数。 返回值为一个数组,包含着匹配项的信息。

          search() : 参数为一个正则。 返回字符串中第一个匹配项的索引,如果没有匹配项,则返回-1,

          replace():  接收两个参数, 第一个参数为一个正则或一个字符串,第二个参数为一个字符串或一个函数,如果第一个参数为字符串,则只能替换第一个子字符串, 如果想匹配所有的子字符串,则必须为一二正则,而且要指定全局g标志。如果第二个参数为一个字符串,则可以使用一些特殊的字符序列,比如$1......,获取到正则表达式操作得到的值。 第二个参数也可以是一个函数。在只有一个匹配项的情况下,该函数有3个参数。模式的匹配项、模式匹配项在字符串中的位置和原始字符串。

          split() : 基于指定的分隔符将字符串分割为多个子字符串的数组, 可以有第二个参数,用于指定数组的大小,确保返回的数组不会超过指定的大小。

          localCompare(): 比较两个字符串,如果字符串在字母表中排在字符串参数的前面,则返回负数,相等则返回0,后面则返回正数。

          fromCharCode()  : 将字符编码转换成一个字符串。

  7,单体内置对象 (Global 和 Math)  在浏览器中 window ==== global

    Global:

      1,url编码方法

        encodeURI()  encodeURIComponent()   decodeURI() decodeURIComponent()  :   encodeURIComponent会对所有的非标准字符进行编码

      2,eval方法

        当解析器发现代码中的eval方法时,会将传入的参数当做js语句来解析,将执行结果插入到原位置。

      3,window对象的属性

        undefined  NaN  Infinity   Object  Array   Function   Boolean   String  Number  Date   RegExp  Error  EvalError  RangeError   ReferenceError  SyntaxError  TypeError   URIError

    Math对象

      1,属性

        Math.E .......

      2,方法

        min() 和 max()  :  取最小值和最大值,  如果想找到数组中的最小最大值的话,可以使用  Math.min.apply(Math, Arr)

        Math.ceil()  :   向上取整  ;   Math.floor() :  向下取整;  Math.round() :  四舍五入 

        Math.random() :   返回一个大于0 小于1 的随机数

小结:    对象在js中被称为引用类型。

      因为有了基本的包装类型,所以js中的基本类型也可以被当做对象来访问,

      在所有的代码执行之前,作用域中就存在了两个内置的对象: window和Math对象。

js高级程序设计 笔记 --- 引用类型的更多相关文章

  1. js高级程序设计笔记之-addEventListener()与removeEventListener(),事件解除与绑定

    js高级程序设计笔记之-addEventListener()与removeEventListener(),事件解除与绑定 addEventListener()与removeEventListener( ...

  2. JS高级程序设计--笔记

    1.JS分三个部分:ECMAScript.DOM.BOM       1)ECMAScript:提供核心语言功能       2)DOM:提供访问和操作网页内容的方法和接口       3)BOM:提 ...

  3. js高级程序设计 笔记 --- 面向对象的程序设计

    1,理解对象 通过对象字面量的方式,创建一个对象,为它添加属性和方法: var obj = { a: 1, b:2, sayA(){ console.log(this.a)}} 1,属性类型: 数据属 ...

  4. JS高级程序设计笔记一

    /*设置自定义属性*/ var div=document.querySelector("#div1"); div.setAttribute("title",&q ...

  5. JS高级程序设计 笔记

    1.instanceof 可以判断实例是否在某个对象的原型上: function A() { this.a = "a"; } function B() { this.b = &qu ...

  6. js高级程序设计 笔记 --- 错误处理、json和ajax

    1,错误处理 1,try-catch语句 try{可能导致错误的代码} catch(error) {在错误发生时该怎么处理} error.message是所有浏览器都支持的属性. finally语句是 ...

  7. js高级程序设计 笔记 --- 表单

    一,基础知识 在html中,表单是form元素,而在js中,表单对应的是HTMLFormElement类型,继承自HTMLElement,其独特的属性和方法有(常见): action:接收请求的URL ...

  8. js高级程序设计 笔记 --- DOM

    DOM是针对HTML和XML文档的一个API.DOM描绘了一个层次化的节点树,允许开发人员添加.移除和修改页面的某一部分. 1,节点层次 DOM可以将任何HTML或XML文档描绘成一个由多层节点构成的 ...

  9. 读书笔记 - js高级程序设计 - 第十五章 使用Canvas绘图

    读书笔记 - js高级程序设计 - 第十三章 事件   canvas 具备绘图能力的2D上下文 及文本API 很多浏览器对WebGL的3D上下文支持还不够好   有时候即使浏览器支持,操作系统如果缺缺 ...

随机推荐

  1. JavaBugCharSequence

    目录 文章背景 目录 问题分析 问题解决 说明 参考文章 版本记录 文章背景 新建一个项目时候,不知道为什么,代码出现java.lang.CharSequence cannot be resolved ...

  2. JavaScript语言精粹 笔记03 继承

    继承伪类对象说明符原型函数化部件 继承 JS不是基于类的,而是基于原型的,这意味着对象直接从其他对象继承. 1 伪类 JS提供了一套丰富的代码重用模式,它可以模拟那些基于类的模式,因为JS实际上没有类 ...

  3. Alpha冲刺(六)

    Information: 队名:彳艮彳亍团队 组长博客:戳我进入 作业博客:班级博客本次作业的链接 Details: 组员1(组长)柯奇豪 - 过去两天完成了哪些任务 1. 基于ssm框架的前后端交互 ...

  4. 【targeting学习笔记】Display Advertising Targeting

    背景:stanford的计算广告学(computational advertising)课程,yahoo的人主讲,课程链接:http://www.stanford.edu/class/msande23 ...

  5. Java如何实现按指定行读取文件

    最近在开发实战中,遇到了一个这样的技术情景: 把log4j生成的日志文件定时刷进MySQL数据库,比如三个小时刷一次,那么每次刷数据的时候,如何控制文件读取是从上一次文件读取结束的地方开始继续读取的? ...

  6. [Delphi]接口认识

    Delphi中的接口用 interface 进行声明.接口是针对行为方法的描述,而不管他实现这种行为方法的是对象还是别的什么东西.因此,接口和类的出发点是不一样的,是在不同的角度看问题. 接口通过GU ...

  7. tomcat异常 Socket bind failed: [730048]

    tomcat从官网站点下载时须注意版本信息: zip格式为window压缩版. tar.gz为linux安装板. installer为window安装板. 解压后的各文件功能与作用: bin:用于放置 ...

  8. 使用Telegraf + Influxdb + Grafana 监控SQLserver服务器的运行状况

    使用Telegraf + Influxdb + Grafana 监控SQLserver服务器的运行状况 前言 本文在Debian9下采用Docker的方式安装Telegraf + Influxdb + ...

  9. Robotlegs2的Starling扩展

    有个老外写了robotleges2的starling扩展,地址是 https://github.com/brean/robotlegs2-starling-viewmap 需要注意的是要先创建一个基于 ...

  10. js webstrom中svn的配置及使用

    js  webstorm中svn的配置及使用 一.webstorm配置svn: 1.在webstorm工具中找到file(文件)-setting(设置)菜单按钮: 2.在左边菜单中找到plus(插件) ...