js高级程序设计 笔记 --- 引用类型
一,变量和作用域
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高级程序设计 笔记 --- 引用类型的更多相关文章
- js高级程序设计笔记之-addEventListener()与removeEventListener(),事件解除与绑定
js高级程序设计笔记之-addEventListener()与removeEventListener(),事件解除与绑定 addEventListener()与removeEventListener( ...
- JS高级程序设计--笔记
1.JS分三个部分:ECMAScript.DOM.BOM 1)ECMAScript:提供核心语言功能 2)DOM:提供访问和操作网页内容的方法和接口 3)BOM:提 ...
- js高级程序设计 笔记 --- 面向对象的程序设计
1,理解对象 通过对象字面量的方式,创建一个对象,为它添加属性和方法: var obj = { a: 1, b:2, sayA(){ console.log(this.a)}} 1,属性类型: 数据属 ...
- JS高级程序设计笔记一
/*设置自定义属性*/ var div=document.querySelector("#div1"); div.setAttribute("title",&q ...
- JS高级程序设计 笔记
1.instanceof 可以判断实例是否在某个对象的原型上: function A() { this.a = "a"; } function B() { this.b = &qu ...
- js高级程序设计 笔记 --- 错误处理、json和ajax
1,错误处理 1,try-catch语句 try{可能导致错误的代码} catch(error) {在错误发生时该怎么处理} error.message是所有浏览器都支持的属性. finally语句是 ...
- js高级程序设计 笔记 --- 表单
一,基础知识 在html中,表单是form元素,而在js中,表单对应的是HTMLFormElement类型,继承自HTMLElement,其独特的属性和方法有(常见): action:接收请求的URL ...
- js高级程序设计 笔记 --- DOM
DOM是针对HTML和XML文档的一个API.DOM描绘了一个层次化的节点树,允许开发人员添加.移除和修改页面的某一部分. 1,节点层次 DOM可以将任何HTML或XML文档描绘成一个由多层节点构成的 ...
- 读书笔记 - js高级程序设计 - 第十五章 使用Canvas绘图
读书笔记 - js高级程序设计 - 第十三章 事件 canvas 具备绘图能力的2D上下文 及文本API 很多浏览器对WebGL的3D上下文支持还不够好 有时候即使浏览器支持,操作系统如果缺缺 ...
随机推荐
- 回顾2017系列篇(五):人工智能给UI/UX设计带来的影响
如今,我们正处于设计新纪年的转折点上,用机器人和人工智能方面的专家说法表达即“The end is near(终点近了)”.但这并不意味着世界末日,但未来机器人将毫无疑问地接管一部分目前被人类占领的工 ...
- c#反射泛型方法
private void GetByEnumType() { var EnumType = Context.Request["EnumType"] ?? ""; ...
- 无归档情况下使用BBED处理ORA-01113错误
在丢失归档情况下,恢复时常会遇到ora-01113错误,以下实验模拟表空间offline,然后在丢失归档文件的情况下使用BBED修改文件头信息,最后恢复数据文件: 数据库版本: SQL> sel ...
- jenkins持续集成之Global Tool Configuration的配置
Global Tool Configuration的配置过程: 1.点击系统管理2.点击 Global Tool Configuration3.必须配置: jdk git ant maven 1.点击 ...
- 全面剖析Smarty缓存机制二[清除缓存方法]
前段时间,写了一篇 Smaryt缓存机制的几种缓存方式 ,详细介绍了三种缓存方式:全局缓存.部分缓存.局部缓存,以及通过is_cache()判断是否存在缓存来进行缓存生成.本来这篇早该完成,由于时间关 ...
- Java SimpleDateFormat用法
? Java中怎么才能把日期转换成想要的格式呢,或把字符串转换成一定格式的日期,如把数据库中的日期或时间转换成自己想要的格式,JAVA中提供了SimpleDateFormat类可以实现,以下是Si ...
- python 函数星号参数说明
转自: python 函数参数的传递(参数带星号的说明) python中函数参数的传递是通过赋值来传递的.函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何 ...
- 编写高质量代码改善C#程序的157个建议——建议64:为循环增加Tester-Doer模式而不是将try-catch置于循环内
建议64:为循环增加Tester-Doer模式而不是将try-catch置于循环内 如果需要在循环中引发异常,你需要特别注意,应为抛出异常是一个相当影响性能的过程.应该尽量在循环当中对异常发生的一些条 ...
- 如何解决Android开发中的【java.lang.unsatisfiedlinkerror findLibrary returned null.】 错误
将脉可寻的功能加入到自己的APP中时,需要在libs文件中添加.so文件和jar包 但是,加入.so文件后,仍然报错 在一番折腾之后,终于解决了,然而解决的方法很奇异- -. 在libs下新建一个ar ...
- 第十六章 IIC协议详解+UART串口读写EEPROM
十六.IIC协议详解+Uart串口读写EEPROM 本文由杭电网友曾凯峰根据小梅哥FPGA IIC协议基本概念公开课内容整理并最终编写Verilog代码实现使用串口读写EEPROM的功能. 以下为原文 ...