1. JavaScript组成
- 核心ECMAScript
- 文档对象模型DOM
- 浏览器对象模型BOM
1.2.1 ECMAScript
定义语言的基础
规定了语言的组成部分:语法、类型、语句、关键字、保留字、操作符、对象
js nodejs 都实现了ECMAScript
1.2.2 DOM
文档对象模型 Document Object Model
针对XML但经扩展用于HTML的应用程序编程接口(API)
把整个页面映射为多层节点结构,每个节点包含不同类型的数据。
借助DOM API,可删除,添加,替换,修改任何节点
1.2.2.2 DOM级别
DOM1:
- DOM核心:如何映射文档结构,简化对文档任意部分的访问操作
- DOM HTML
DOM2:
- 鼠标和用户界面事件,范围,便利(迭代DOM文档的方法)
- 对css的支持
DOM3:
- 引入统一方式加载和保存文档
- DOM验证
1.2.3 BOM
访问和操作浏览器窗口和子窗口frame,通常把任何特定于浏览器的扩展都归于BOM范畴。
- 弹出浏览器窗口的能力
移动,缩放,关闭浏览器的能力
navigator:提供浏览器的详尽信息
location:提供浏览器加载页面的详尽信息
screen:提供关于用户屏幕分辨率的详尽信息
performance:提供浏览器内存占用,导航行为,时间统计的详尽信息
cookies:
XHLHttpRepuest ActiveXObject
2. HTML中的JavaScript
2.1
- async 异步脚本 脚本不需等待其他脚本,不阻碍文档渲染,异步加载 立即下载脚本,但不妨碍页面其他操作 一定在load事件前执行
- charset 代码字符集,浏览器不在乎它的值
- crossorigin 配置相关请求的CORS设置。默认不适用CORS设置。corossorigin="anonymous"配置文件请求不必设置凭据标志。corossorigin="use-crednetials"设置凭据标志
- defer 延迟脚本 脚本可延迟到文档完全解析和显示后执行。立即下载,延迟执行
- integrity 允许对接收到的资源的签名与指定的加密签名验证资源完整性
- src 文件路径url
- type 语言内容类型MIME类型。这个值始终是“text/javascript"
不存在defer,saync属性,浏览器会按script在页面中的先后顺序依次解析,第一个解析完后,第二个才会被解析。
对不推迟执行的脚本,必须解释完位于js标签内的的全部代码,才能继续渲染页面
在解释外部js文件时,页面会被阻塞(阻塞时间包含文件下载时间)
可跨域取得相应资源,不受同源策略限制。
放在head中,必须等JavaScript都被下载,解析,执行完后才呈现页面
把脚本放在页面底部
2.1.4 动态加载脚本
let script =document.createElemnet('script')
script.src='aa.js'
document.head.apendChild(script)
会严重影响性能
在XHTML中的用法
XHTML模式会在页面的MIME类型被指定为application/xhtml+xml时触发。
a < b中的 < 在XHTML中被当作新标签解析。但作为标签,< 后不能跟空格,
解决:
-
< 替换 <
-
用CData片段包含JavaScript,包含不需要解析的任意个数的文本内容
2.3 文档模式
通过文档类型 doctype切换实现
主要体现在css渲染方面,但对js也会有一些副作用。
-
混杂模式 :省略doctype声明 未发现文档类型声明,默认开启混杂模式,
-
标准模式
开启标准模式: -
标准准模式(处理图片间隙,表格中使用)
2.4 元素
js被禁用时出现
3. 语言基础
3.1 语法
区分大小写
标识符:
- 第一个字符必须是字母,下划线(_),美元符号($)
- 剩余字符可以说字母,下划线,美元符,数字
- 按惯例使用驼峰式命名
注释
C语言风格
严格模式 strict mode
js不同解析和执行模式,ECMAScript3中的不确定行为得到处理,不安全的操作会抛出错误
整个脚本启用,顶部添加
“use strict”;
指定函数在严格模式下执行
语句
末尾;
语句块{}
关键字
break do instanceof typeof case else new var catch finally return void continue for switch while debugger* function this with default if throw
delete in try
保留字
abstract boolean byte char class const debugger double enum export extends final float goto implements import int interface long native
3.3 变量
var
不初始化时,变量保存undefined
函数作用域,在函数退出时被销毁
函数内定义时省略var,可创建一个全局变量(不推荐,全局变量很难维护)
严格模式下不能定义eval,arguments的变量
声明提升,自动提升到函数作用域的顶部
let
块作用域
不允许出现冗余声明
不会在作用域中被提升
在全局作用域中生命的变量不会成为window对象的属性
- 条件声明:不确定前面是否声明过同名变量,可假定它还没声明。
不可能检查前面受否已经使用let声明过同名变量,不可能在没有声明的情况下声明它
不能使用let进行条件声明
<script>
var name="cjr"
let age=23
<script>
<script>
//不需要检测前面是否声明过同名变量
var name="sxl"
//
let age=20
- for循环中的let
let之前for循环中的变量会渗透到for循环外部
for(var i=0;i<=5;i++){
}
//
console.log(i) //6
for(let i=0;i<=5;i++){
}
//
console.log(i) //报错
var 对迭代变量的奇特声明和修改
for(var i=0;i<5;i++){
setTimeout(()=>{console.log(i),0} //5,5,5,5,5,5
}
是因为在退出循环时,迭代变量保存的是导致循环退出的值:5。在之后执行超时
逻辑时,所有的i 都是同一个变量,因而输出的都是同一个最终值。
而在使用let 声明迭代变量时,JavaScript 引擎在后台会为每个迭代循环声明一个新的迭代变量。
每个setTimeout 引用的都是不同的变量实例,所以console.log 输出的是我们期望的值,也就是循
环执行过程中每个迭代变量的值。
const
const声明变量时必须初始化,尝试修改const声明的变量会报错
声明风格最佳实践
不使用var
优先使用const,
3.4 数据类型
typeof操作符
是一个操作符,不是函数,不需要参数(也可以使用参数)
let aa="cjd"
typeof aa //string
typeof(aa) //string
typeof 11 //number
undefined类型
只有一个值,undefined
声明但为初始化
给定变量为声明 调用typeof 也返回undefined
undefined是一个假值,检测时需注意自己检测的是undefined,而不仅仅是一个假值
null类型
只有一个值 null
表示一个空对象的指针
定义的对象 用来保存对象,初始化为null
Boolean类型
true false
true不等于1
Boolean() //将其他类型的值转换为布尔值
let message="hello"
let messageAsBoolean=Boolean(message)
数据类型
转换为true的值
转换为false的值
Boolean
true
false
String
非空字符串
“”
Number
非零数值
0,NaN
Object
任意对象
null
Undefined
N/A(不存在)
undefined
if等流程语句会自动执行其他类型到布尔值的转换
Number
- 八进制
第一位必须为0,跟0-7
070 > 56;
严格模式下无效
- 十六进制
数值前缀为0x(区分大小写),数字不区分大小写
0x 跟0-9 A-F(也可小写)
在算术计算时,始终被转成十进制
- 浮点数
保存浮点数的内存空间为整数的两倍,1. 10.0将被转换为整数
对于极大极小的数,用e/E(科学计数法)表示。
3.12e7 31200000 3.12乘10 7
浮点数的最高精度17位小数
范围
Infinity
NaN
isNaN() 任何不能被转换为数值的值使函数返回true
数值转换
Number() 转string时必须全部为数字才能转为有效数字
转型函数,可用于任何数据类型
转换规则:
布尔值,true 转换为1,false 转换为0。
数值,直接返回。
null,返回0。
undefined,返回NaN。
字符串,应用以下规则。
如果字符串包含数值字符,包括数值字符前面带加、减号的情况,则转换为一个十进制数值。
因此,Number(“1”)返回1,Number(“123”)返回123,Number(“011”)返回11(忽略前面
的零)。
如果字符串包含有效的浮点值格式如"1.1",则会转换为相应的浮点值(同样,忽略前面的零)。
如果字符串包含有效的十六进制格式如"0xf",则会转换为与该十六进制值对应的十进制整
数值。
如果是空字符串(不包含字符),则返回0。
如果字符串包含除上述情况之外的其他字符,则返回NaN。
对象,调用valueOf()方法,并按照上述规则转换返回的值。如果转换结果是NaN,则调用
toString()方法,再按照转换字符串的规则转换。
parseInt() 必须以数字开头
从第一个非空字符开始转换,如第一个字符不是数值,+,-,立即返回NaN。碰到字符串尾,非数值字符结束。
es5不具备解析八进制的功能
第二个参数:基数 ,多少进制
paeseFloat()
只解析十进制
string
1. 字符字面量
转义序列
字面量
含义
换行
将一个值转换为字符串
toString()
null undefined没有
参数:基数
String()
能将任意类型的值转换为字符串
模板字符串
``
5. 插值
${}
7.原始字符串
String.raw`?`
Symbol类型
符号类型
确保对象属性使用唯一标识
-
基本用用法
let sym=Symbol()
let otherSym=Symbol()
smy == otherSmy //falselet fooSmybol=Symbol(‘foo’)
-
使用全局符号注册表
let sym=Symbol.for(‘foo’)
let otherSym=Symbol.for(‘foo’)
smy === otherSmy //trueSymbol.keyFor(‘sym’)
-
符号作为属性
Object类型
new Object()
Object类型是他实例的基础。Object类型所具有的任何属性,方法同样存在具体的对象中。
object实例的属性方法:
- Constructor 构造函数,创建当前对象的函数
- hasOwnProperty(propertyName) 判断当前实例对象(不是原型)上是否存在给定的属性
- isProtyotypeOf(object) 判断当前对象是否为另一个对象的原型
- propertyIsEnumerable(propertyName) 判断给定的属性是否柯贝for-in语句枚举
- toLocalString()
- toString() 返回对象的字符串表示
- valueOf()
3.5 操作符
3.5.1 一元操作符
- ++ / –
前缀版:
变量的值会在语句被求值前改变
后缀版:
递增递减在语句被求值后才改变
规则:
不限于整数
对于字符串,如果是有效的数值形式,则转换为数值再应用改变。变量类型从字符串变成数值。
对于字符串,如果不是有效的数值形式,则将变量的值设置为NaN 。变量类型从字符串变成
数值。
对于布尔值,如果是false,则转换为0 再应用改变。变量类型从布尔值变成数值。
对于布尔值,如果是true,则转换为1 再应用改变。变量类型从布尔值变成数值。
对于浮点值,加1 或减1。
如果是对象,则调用其(第5 章会详细介绍的)valueOf()方法取得可以操作的值。对得到的
值应用上述规则。如果是NaN,则调用toString()并再次应用其他规则。变量类型从对象变成
数值。
- + / -
3.5.2 位操作符
- 有符号整数
32位表示数值的符号
负数:二进制补码- 绝对值的二进制码
- 反码:
- 反码加1
- 按位非NOT
波浪线 ~
返回数值的反码:操作数的负值减1
num
- num-1 - 按位与AND
&
都是1时才返回1 - 按位或 OR
有一个1就返回1 - 按位异或XOR
只有一个1才返回1 - 左移
<< - 有符号右移
3.5.3布尔操作符
- 非 !
如果操作数是对象,则返回false。
如果操作数是空字符串,则返回true。
如果操作数是非空字符串,则返回false。
如果操作数是数值0,则返回true。
如果操作数是非0 数值(包括Infinity),则返回false。
如果操作数是null,则返回true。
如果操作数是NaN,则返回true。
如果操作数是undefined,则返回true。 - 与 &&
如果第一个操作数是对象,则返回第二个操作数。
如果第二个操作数是对象,则只有第一个操作数求值为true 才会返回该对象。
如果两个操作数都是对象,则返回第二个操作数。
如果有一个操作数是null,则返回null。
如果有一个操作数是NaN,则返回NaN。
如果有一个操作数是undefined,则返回undefined。
逻辑与操作符是一种短路操作符,意思就是如果第一个操作数决定了结果,那么永远不会对第二个
操作数求值。对逻辑与操作符来说,如果第一个操作数是false,那么无论第二个操作数是什么值,结
果也不可能等于true。 - 或 ||
如果第一个操作数是对象,则返回第一个操作数。
如果第一个操作数求值为false,则返回第二个操作数。
如果两个操作数都是对象,则返回第一个操作数。
如果两个操作数都是null,则返回null。
如果两个操作数都是NaN,则返回NaN。
如果两个操作数都是undefined,则返回undefined。
同样与逻辑与类似,逻辑或操作符也具有短路的特性。只不过对逻辑或而言,第一个操作数求值为
true,第二个操作数就不会再被求值了。
3.5.4 乘性操作符
- *
如果操作数都是数值,则执行常规的乘法运算,即两个正值相乘是正值,两个负值相乘也是正
值,正负符号不同的值相乘得到负值。如果ECMAScript 不能表示乘积,则返回Infinity 或
-Infinity。
如果有任一操作数是NaN,则返回NaN。
如果是Infinity 乘以0,则返回NaN。
如果是Infinity 乘以非0 的有限数值,则根据第二个操作数的符号返回Infinity 或-Infinity。
如果是Infinity 乘以Infinity,则返回Infinity。
如果有不是数值的操作数,则先在后台用Number()将其转换为数值,然后再应用上述规则。 - 除 /
如果操作数都是数值,则执行常规的除法运算,即两个正值相除是正值,两个负值相除也是正
值,符号不同的值相除得到负值。如果ECMAScript不能表示商,则返回Infinity 或-Infinity。
如果有任一操作数是NaN,则返回NaN。
如果是Infinity 除以Infinity,则返回NaN。
如果是0 除以0,则返回NaN。
如果是非0 的有限值除以0,则根据第一个操作数的符号返回Infinity 或-Infinity。
如果是Infinity 除以任何数值,则根据第二个操作数的符号返回Infinity 或-Infinity。
如果有不是数值的操作数,则先在后台用Number()函数将其转换为数值,然后再应用上述规则。 - 取模操作符 %
如果操作数是数值,则执行常规除法运算,返回余数。
如果被除数是无限值,除数是有限值,则返回NaN。
如果被除数是有限值,除数是0,则返回NaN。
如果是Infinity 除以Infinity,则返回NaN。
如果被除数是有限值,除数是无限值,则返回被除数。
如果被除数是0,除数不是0,则返回0。
如果有不是数值的操作数,则先在后台用Number()函数将其转换为数值,然后再应用上述规则。
3.5.5 指数操作符
Math.pow() **
Math.pow(3,2) //9 不推荐使用
3**2
3.5.6 加性操作符
- 加法操作符
加法操作符(+)用于求两个数的和,比如:
let result = 1 + 2;
如果两个操作数都是数值,加法操作符执行加法运算并根据如下规则返回结果:
如果有任一操作数是NaN,则返回NaN;
如果是Infinity 加Infinity,则返回Infinity;
如果是-Infinity 加-Infinity,则返回-Infinity;
如果是Infinity 加-Infinity,则返回NaN;
如果是+0 加+0,则返回+0;
如果是-0 加+0,则返回+0;
如果是-0 加-0,则返回-0。
不过,如果有一个操作数是字符串,则要应用如下规则:
如果两个操作数都是字符串,则将第二个字符串拼接到第一个字符串后面;
如果只有一个操作数是字符串,则将另一个操作数转换为字符串,再将两个字符串拼接在一起。
如果有任一操作数是对象、数值或布尔值,则调用它们的toString()方法以获取字符串,然后再
应用前面的关于字符串的规则。对于undefined 和null,则调用String()函数,分别获取
“undefined"和"null”。 - 减法操作符(-)也是使用很频繁的一种操作符,比如:
let result = 2 - 1;
与加法操作符一样,减法操作符也有一组规则用于处理ECMAScript 中不同类型之间的转换。
如果两个操作数都是数值,则执行数学减法运算并返回结果。
如果有任一操作数是NaN,则返回NaN。
如果是Infinity 减Infinity,则返回NaN。
如果是-Infinity 减-Infinity,则返回NaN。
如果是Infinity 减-Infinity,则返回Infinity。
如果是-Infinity 减Infinity,则返回-Infinity。
如果是+0 减+0,则返回+0。
如果是+0 减-0,则返回-0。
如果是-0 减-0,则返回+0。
如果有任一操作数是字符串、布尔值、null 或undefined,则先在后台使用Number()将其转
换为数值,然后再根据前面的规则执行数学运算。如果转换结果是NaN,则减法计算的结果是
NaN。
如果有任一操作数是对象,则调用其valueOf()方法取得表示它的数值。如果该值是NaN,则
减法计算的结果是NaN。如果对象没有valueOf()方法,则调用其toString()方法,然后再
将得到的字符串转换为数值。
3.5.7 关系操作符
小于(<)、大于(>)、小于等于(<=)和大于等于(>=),
用法跟数学课上学的一样。这几个操作符都返回布尔值
如果操作数都是数值,则执行数值比较。
如果操作数都是字符串,则逐个比较字符串中对应字符的编码。
如果有任一操作数是数值,则将另一个操作数转换为数值,执行数值比较。
如果有任一操作数是对象,则调用其valueOf()方法,取得结果后再根据前面的规则执行比较。
如果没有valueOf()操作符,则调用toString()方法,取得结果后再根据前面的规则执行比较。
如果有任一操作数是布尔值,则将其转换为数值再执行比较。
在使用关系操作符比较两个字符串时,会发生一个有趣的现象。很多人认为小于意味着“字母顺序靠前”,而大于意味着“字母顺序靠后”,实际上不是这么回事。对字符串而言,关系操作符会比较字符串中对应字符的编码,而这些编码是数值。比较完之后,会返回布尔值。问题的关键在于,大写字母的编码都小于小写字母的编码
3.5.8 相等操作符
1. 相等,不相等 ==
先转换再比较
2. 全等,不全等 ===
仅比较不转换
-
等于和不等于
ECMAScript 中的等于操作符用两个等于号(==)表示,如果操作数相等,则会返回true。不等于操作符用叹号和等于号(!=)表示,如果两个操作数不相等,则会返回true。这两个操作符都会先进行类型转换(通常称为强制类型转换)再确定操作数是否相等。
在转换操作数的类型时,相等和不相等操作符遵循如下规则。
如果任一操作数是布尔值,则将其转换为数值再比较是否相等。false 转换为0,true 转换为1。
如果一个操作数是字符串,另一个操作数是数值,则尝试将字符串转换为数值,再比较是否相等。
如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法取得其原始值,再根据前面的规则进行比较。
在进行比较时,这两个操作符会遵循如下规则。
null 和undefined 相等。
null 和undefined 不能转换为其他类型的值再进行比较。
如果有任一操作数是NaN,则相等操作符返回false,不相等操作符返回true。记住:即使两
个操作数都是NaN,相等操作符也返回false,因为按照规则,NaN 不等于NaN。
如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true。否则,两者不相等。 -
全等和不全等
全等和不全等操作符与相等和不相等操作符类似,只不过它们在比较相等时不转换操作数。全等操作符由3 个等于号(===)表示,只有两个操作数在不转换的前提下相等才返回true
3.5.9 条件操作符 (三目运算符)
:
3.5.10赋值操作符
简单赋值用等于号(=)表示,将右手边的值赋给左手边的变量,
3.5.11 逗号操作符
,
ES6链判断运算符(?.)和Null判断运算符(??)
语句
if
if(){
}else{}
if(){
}else if(){
}else{}
do-while
循环体内的代码至少执行一次
do{
}while()
while
while(){
}
for
while无法实现的逻辑,for也无法实现
for(var i=0;i<10;i++){
}
while循环的简化
for-in
迭代语句,枚举对象的非符号键属性
//与 for 循环一样,这里控制语句中的 const 也不是必需的。但为了确保这个局部变量不被修改,推荐使用 const。
for(const kk in window){
console.log(kk)
}
ECMAScript 中对象的属性是无序的,因此 for-in 语句不能保证返回对象属性的顺序。
如对象值为null,undefined。for-in抛出错误,或不在执行循环体
如果for-in 循环要迭代的变量是null 或undefined,则不执行循环体。
for-of
迭代语句,用于遍历可迭代对象的元素
for (const el of [2,4,6,8]) {
document.write(el);
}
区别:
for…of适用遍历数/数组对象/字符串/map/set等拥有迭代器对象的集合.但是不能遍历对象,因为没有迭代器对象.与forEach()不同的是,它可以正确响应break、continue和return语句
for-of循环不支持普通对象,但如果你想迭代一个对象的属性,你可以用for-in循环(这也是它的本职工作)或内建的Object.keys()方法:
for-await-of
支持生成期约(promise)的异步可迭代对象
label
label:statement
start:for(var i=0;i<8;i++){
for(var i=0;i<9;i++){
if(i==3){
break start}}
console.log(i)
}
标签将由break,continue语句引用。与循环语句配合使用
break continue
break退出循环执行循环后面的语句
continue退出本次循环,从循环顶部继续执行
var num=0;
outer:
for(var i=0;i<10;i++){
for(var j=0;j<10;j++){
if(i==5&& j==5){
break outer;
}
num++;
}
}
switch
switch ("hello") {
case "hello":
alert()
break;
case "good":
break;
default:
alert()
}
函数
参数
arguments对象
函数重载
4. 变量,作用域,内存
4.1 基本类型,引用类型
数据类型详细介绍
基本数据类型:Undefined,Null,Boolean,Number,String,Symbol
按值访问,操作的就是储存在变量中的值
引用类型:
复制值时,实际是一个指针,指向存储在堆中的一个对象。两个变量引用同一个对象。
动态属性
储存方式不同
复制
原始值:副本
引用值:
传递参数
都是按值传递
function setName(obj){
obj.name="nn";
obj=new Object();
obj.name="cc"';
}
var person=new Object()
setName(preson);
对象传递到函数后被复制给obj,函数内部,obj={},即使传入的是一个对象,obj也会按引用来访问。
如是按引用传递,那函数内部重写obj,这个变量引用的是一个局部对象
类型检测
typeof “jj”
[] instanceof Array
作用域链
4.2 执行上下文和作用域
上下文在其全布代码执行完毕后会被销毁。
作用域链决定了各级上下文中的代码在访问变量和函数时的顺序。
内部上下文可通过作用域链访问外部上下文中的一切,但外部上下文无法访问内部的任何东西。
函数参数被认为v是当前上下文中的变量。
作用域增强
try/catch
with
4.3 垃圾回收
标记清除
主流垃圾收集算法
当变量进入上下文,比如在函数
内部声明一个变量时,这个变量会被加上存在于上下文中的标记。而在上下文中的变量,逻辑上讲,永
远不应该释放它们的内存,因为只要上下文中的代码在运行,就有可能用到它们。当变量离开上下文时,
也会被加上离开上下文的标记。
计数引用
但很快就遇到了严重的问题:循环引用
4.3.4 内存管理
-
隐藏类和删除操作
-
内存泄漏
全局变量
定时器
闭包
- 静态分配与对象池
5. 基本引用类型
5.1 Date类型
var now=new Date()
不传参数:当前日期时间
创建特定时间日期对象:传入表示该日期的毫秒数
Date.parse()
参数:表示日期的字符串
返回:相应日期的毫秒数
这个方法的实现因地区而异
美国浏览器支持的格式:
- “月/日/年”,如"5/23/2019";
- “月名 日, 年”,如"May 23, 2019";
- “周几 月名 日 年 时:分:秒 时区”,如"Tue May 23 2019 00:00:00 GMT-0700";
- ISO 8601 扩展格式“YYYY-MM-DDTHH:mm:ss.sssZ”,如 2019-05-23T00:00:00(只适用于
兼容 ES5 的实现)。如传入的字符串不能表示日期,返回NaN
直接将表示日期的字符串传给Date(),默认调用Date.parse()
Data.UTC()
参数:年,月(0,1),天(1)[,小时(0),分种,秒,毫秒]
方法
toLocalString() 返回与浏览器运行的本地环境一致的日期和时间。
toString() 带时区信息的日期时间
时间日期组件的方法
RegExp类型
匹配规则
匹配模式:
- g:全局模式,应用于所有字符串
- i:不区分大小写模式
- m:多行模式
/aa/gi
元字符
( [ { ^ $ | ) ] } * + .
实例属性
global:是否设置g标志
igonoreCase:
lastIndex:开始搜索下一匹配项的字符位置
multiline:
source:
实例方法
exec()
参数:要应用模式的字符串
返回数组:
index:匹配项在字符串中的位置
input:应用正则匹配的字符串
第一项是与整个模式匹配的字符串,
其他项是与模式中捕获组匹配的字符串
设置了g:每次调用exec()都会在字符串中继续查找新匹配项
不设置:同一字符串多次调用始终返回一个匹配项信息
test()
模式与参数匹配返回true
构造函数的属性
Function类型
函数实际是对象,函数名实际是指向对象的指针,不与某个函数绑定
函数重载
函数声明和函数表达式
解析器会率先执行函数声明,函数表达式必须等到解析器执行到她所在的代码行,才会被真正解释执行
函数的属性和方法
length:函数希望接收的参数个数
prototype:
在特定作用域中调用函数,设置函数体内this的值
严格模式下,this不会转为windows
apply:运行函数的作用域,参数(array,arguments)
call:
bind:
5.3 原始值包装类型
Boolean
new Boolean(false) //true falseObject对象,在布尔表达式中会自动转换为true
永远不要使用 原始布尔值和布尔对象的差别很大
Number
toString()
参数:几进制
返回:相应基数形式的数值字符串
toFixed()
按指定小数位返回数值的字符串表示 ,四舍五入
toExponential()
参数:小数位数
返回以科学计数法表示的数值字符串。
toPrecision()
参数:结果数字中的总位数
let num=10;
num.toString(2); //1010
num.toFixed(2) //"10.00"
(10).toString()
num.toExponential(1) //"1.0e_1"
num.toPrecision(1) //"1e+1"
num.toPrecision(2) //"10"
Number.isInteger() //辨别一个数值是否是整数
小数位的0的数是整数
String
字符方法
charAt()
以单字符串的形式返回给定索引位置的字符
参数:基于0的字符位置
"abc".charAt(2) //c
charCodeAt()
字符编码
返回指定索引位置的码元值
"abc".charCodeAt(2) //99等于16进制63,c的编码U+0063
fromCharCode()
字符串解码
String.fromCharCode(97,98) //ab
这个对应关系在扩展到 Unicode 增补字符平面时就不成立了。问题很简单,即 16 位只能唯一表示65 536 个字符。这对于大多数语言字符集是足够了,在 Unicode 中称为基本多语言平面(BMP)。为了表示更多的字符,Unicode 采用了一个策略,即每个字符使用另外 16 位去选择一个增补平面。这种每个字符使用两个 16 位码元的策略称为代理对。
"ab??".length //4
console.log([..."ab?de"]); // ["a", "b", "?", "d", "e"]
codePointAt()
接收 16 位码元的索引并返回该索引位置上的码点(code point)。码点是 Unicode 中一个字符的完整标识。比如,“c"的码点是 0x0063,而”??"的码点是 0x1F60A。码点可能是 16 位,也可能是 32 位,而 codePointAt()方法可以从指定码元位置识别完整的码点。
fromCodePoint()
这个方法接收任意数量的码点,返回对应字符拼接起来的字符串:
字符串操作方法
concat()
将一个或多个字符串拼接起来
不会修改调用它们的字符串
let string1="hello"
let result=string1.concat("word","!")
slice()
根据下标截取字串
返回:调用它们的字符串的一个子字符串
参数:字串开始的位置,[子字符串最后一个字符后面的位置(即该位置之前的字符会被提取出来)]
省略第二个参数都意味着提取到字符串末尾
参数为负数:将负值与字符串的长度相加
不会修改调用它们的字符串,而只会返回提取到的原始新字符串值
substr()
根据长度截取字串
返回:调用它们的字符串的一个子字符串
参数:字串开始的位置,[返回字符个数]
省略第二个参数都意味着提取到字符串末尾
参数为负数:将第一个负值与字符串的长度相加,将第二个负值转换为0
不会修改调用它们的字符串
substring()
- 根据下标截取字串
- 返回:调用它们的字符串的一个子字符串
- 参数:字串开始的位置,[子字符串最后一个字符后面的位置(即该位置之前的字符会被提取出来)]
省略第二个参数都意味着提取到字符串末尾
参数为负数:把所有负值转换为0 - 会将较小的参数作为起点,将较大的参数作为终点。
- 不改变原始字符串
字符串位置方法
indexOf()
返回位置(如果没找到,则返回-1)
参数:要查找的字符串,[开始搜索的位置]
lastIndexOf()
参数:要查找的字符串,[开始搜索的位置]
字符串包含方法
includes()
- 整个字符串内查找
返回一个表示是否包含的布尔值
可选的第二个参数,表示开始搜索的位置
startsWith()
-
字符串开头是否是
可选的第二个参数,表示开始搜索的位置let mess=“foobar”
mess.starrWith(“f00”) //true
mess.starrWith(“f00”,1) //false
endsWith()
- 字符串末尾是否是
收可选的第二个参数,表示应该当作字符串末尾的位置。如果不提供这个参数,
那么默认就是字符串长度。如果提供这个参数,那么就好像字符串只有那么多字符一样
trim()
删除前置后置空格,返回副本
trimLeft()
trimRight()
repeat()
参数:表示要将字符串复制多少次
padStart() padEnd()
复制字符串,小于指定长度,在相应一边填充,默认空格
参数:长度,[填充字符串]
let str="foo"
str.padStart(4,".") //"....foo"
迭代与解构
迭代字符串的每个字符
var message="abc"
let stringIterator=message[Symbol.iterator]()
stringIterator.next()
//for循环
解构
var message="abc"
[...message]
大小写转换
转为小写
toLowerCase()
toLocalLowerCase()
转为大写
toUpperCase()
toLocaleUpperCase()
字符串模式匹配方法
match()
本质与exec()相同
参数:正则表达式,RegExp对象
返回数组
let text = "cat, bat, sat, fat";
let pattern = /.at/;
// 等价于pattern.exec(text)
let matches = text.match(pattern);
console.log(matches.index); // 0
console.log(matches[0]); // "cat"
console.log(pattern.lastIndex)