词法组织
字符集
运用Unicode编写
- ES3 Unicode2.1+
- ES5 Unicode3+
辨别大小写
解释
// 解释
/*
解释
*/
标识符和保留字
必需以字母、下划线、美圆符最先,后续字符可所以字母、数字、下划线、美圆符,即数字不能作为首字符
保留字
可选的分号
Javascript只要在缺少了分号就没法准确剖析代码的时刻才会弥补分号。
平常,一条语句以(、[、/、+、-最先,它极有能够和前一条语句一同剖析。return、break、continue除外
范例、值和变量
数据范例:在编程语言中、能够示意并操纵的值的范例
变量:一个值的标记称号,能够经由过程该称号取得值的援用。
数据范例
平常分类
- 原始范例:数字、字符串、布尔值、null、undefined
- 对象(属性的键值对鸠合)范例:数组、一般对象、函数类、日期类、正则类、毛病类
其他分类
- 能够具有要领的范例和不能具有要领的范例
- 可变范例(数字、布尔值、null、undifined、字符串)和不可变范例(对象、数组)
数字
javascript采纳IEEE 754规范定义的64位浮点花样示意数字,最大值±1.7976931348623157E+308,最小值±5E-324
能够示意的整数局限为-2E+53~2E+53。实际操纵(如数组索引)是基于32位整数。
注重: 小数精度题目,如0.1+0.2 != 0.3 ,须要转成整数盘算,盘算完成再转回小数。发生原因是Number采纳的时IEEE 754 64位双精度浮点数编码,浮点数没法准确示意其值局限内的一切数值,致使十进制转换成二进制时有舍入形式,发生了偏差
花样
- 整形直接量
- 浮点直接量
算术运算
上溢出(正负无穷)运用±Infinity示意,下溢出(无穷接近于0)则返回0(±0)。
NaN和任何值都不相称,包括本身。
二进制浮点数和四舍五入毛病
在javascript运用实数时,经常只是实在值的一个近似示意。
let x=0.3-0.2
let y=0.2-0.1
x==y // false
x==0.1 // false
y==0.1 // true
// 因为舍入偏差,0.3和0.2之间的近似差值实际上不等于0.2和0.1之间的近似差值
文本
字符串是一组由16位值构成的不可变的有序序列。字符串长度是其所含的16位值的个数。
转义字符
布尔值
true或许false
可转换为false的值:undefined、null、0、-0、NaN、”。
null和undifined
- typeof null为object,寄义为非对象
- undifined 未定义值
全局对象
全局属性、全局函数、组织函数、全局对象
包装对象
存取字符串、数字或布尔值的属性时建立的暂时对象叫包装对象。
不可变的原始值和可变的对象援用
可变范例(数字、布尔值、null、undifined、字符串)和不可变范例(对象/援用范例、数组)。
范例转换
转换和相称性
显式范例转换
变量声明
假如给一个未声明的变量赋值(不可设置),实际上会给全局对象建立一个同名属性(可设置),不发起如许用。
建立一个全局变量实际上是给全局对象建立了一个属性。
变量作用域
一个变量的作用域是顺序源代码中定义这个变量的地区。
- 函数作用域、块级作用域。
- 声明提早
范例检测
- typeof 用于基本范例和函数推断
- instanceof用于对象范例推断
-
Object.prototype.toString.apply([])==='[object Array]'
null、undifined失效
表达式和运算符
表达式
表达式分为简朴表达式(常量、变量名)和庞杂表达式(由简朴表达式构成)。
原始表达:
表达式的最小单元,
- 直接量(包括:数字、字符串、布尔,不包括数组、对象)
- 关键字
- 变量
由简朴表达式能够组合成复合表达式
庞杂表达式
- 对象和数组的初始化表达式
- 函数定义表达式
- 属性接见表达式
- 挪用表达式
- 对象建立表达式
运算符
申明:
- 下图根据优先级高到低排序,水平线支解的具有差别的优先级
- A列示意运算符结核性,L(左到右) R(右至左)
- N列示意操纵数的个数
- 范例列示意希冀的操纵数范例以及运算符的效果范例
分类
根据操纵数个数分:一元(+1)、二元(1+2)、三元(?:)
左值
表达式只能出现在赋值运算符的左边。变量、对象属性、数组元素均是左值。
算术表达式
一元算术运算符
作用于一个零丁的操纵数,并发生一个新值,具有很高的优先级,且均为右连系。
-
+
:转换为数字或许NaN,并返回转换后的值 -
-
:和+
一样,然则会转变效果的标记。 -
++
和--
:运算符在操纵数前,操纵数±1并返回盘算后的值;运算符在操纵数以后,操纵数±1,并返回盘算前的值。 -
,
逗号运算符,从左到右一次实行,返回最右侧的值
关联表达式
- in
- instanceof
逻辑表达式
赋值表达式
其他运算符
- ?:
- typeof
- delete
- viod
- ,逗号运算符,从左到右盘算,末了返回最右侧的值
语句
声明语句
- 变量var let
- 函数function
前提语句
switch
switch(expression){
statements
}
// expression中盘算是运用===
轮回
do/while
do{
statements
} while(expression)
// 最少实行一次
for/in
// 将对象中的一切属性复制到一个数组中
var o = {x:1,y:2,z:3};
var a = [], i = 0;
for(a[i++] in o) /* empty */;
跳转
标签语句
mainloop: while(token I= null) {
// 疏忽这里的代码...
continue mainloop; //跳转到下一次轮回
// 疏忽这里的代码...
}
//从标署名最先,以便在报错时退出顺序
compute_sum: if (matrix) {
for(var x = o; x < matrix.length; x++) {
var row= matrix[x];
if (!row) break compute_sum;
for(var y = o; y < row.length; y++) {
var cell= row[y];
if (isNaN(cell)) break compute_sum; sum+= cell;
}
}
success= true;
}
// break语句跳转至此II假如在success== false的前提下抵达这里, 申明我们给出的矩阵中有毛病//否则将矩阵中一切的元素举行乞降
其他语句范例
width
// 暂时扩大作用域链
with(document.form[0]){
name.value=""
}
try/catch
try{
xxxx
}catch(e){
xxx
}finally{
xxx
}
对象
建立对象
- 对象直接量建立的对象原型为Object.prototype
- 经由过程new建立的对象原型为运用的原组织函数的prototype
- Object.create()建立的对象原型为第一个参数,也可设置为null
属性的查询和设置
属性接见毛病
查询属性和原型有关,设置与原型无关(假如设置属性为继续属性,且具有setter要领时,将实行setter,而不是给当前对象建立新的属性)
以下状况给对象O设置属性P会失利
- O中属性P是只读的(defineProperty()要领中有破例)
- O中的P是继续的,且是只读的
- O中不存在属性P,O中没有运用setter要领继续属性P,而且O的可扩大性()是false
检测属性
- in:
x in o
- hasOwnProperty:
O.hasOwnProperty(x)
- propertyIsEnumerable:
o.propertyIsEnumerable(x)
,hasOwnProperty的增强版,本身属性且可罗列 - o.x!==undefined x的值为undefined则须要运用in
属性的特征
- 值 value
- 可写性 writable
- 可罗列性 enumerable
- 可设置性 configurable
猎取本身属性的特征
Object.getOwnPropertyDescriptor({x:1},'x')
// 返回{value:1,writable:true,enumerable:true,configurable:true}
设置属性的特征
// 单个
Object.definePeoperty(o,'x',{
value:1, // 值
writable:true, // 可读
enumerable:true, // 可遍历
configurable:true // 可转变设置
})
// 批量
Object.definePeoperties(o,{
x:{
value:1,
writable:true,
enumerable:true,
configurable:true
},
y:{
value:1,
writable:true,
enumerable:true,
configurable:true
}
})
对象的三个属性
原型
- 查询原型
Object.getPrototypeOf()
- 检测是不是包括某个原型
p.isPrototypeOf(o)
,p是不是是o的原型
类属性
能够经由过程toString猎取对象的类属性
function classof(o){
if(o===null) return 'Null';
if(o===undefined) return 'Undefined';
return Object.prototype.toString.call(o).slice(8,-1);
}
classof({}) // => 'Object'
可扩大性
- 查询可扩大性
Object.isExtensible(o)
- 转换成不可扩大
Object.preventExtensions(o)
- 关闭:转换为不可扩大且一切属性不可设置
Object.seal()
,可运用Object.isSealed()
来检测是不是关闭 - 凝结:转换为不可扩大且一切属性不可设置、一切属性只读
Object.freeze()
,能够运用Object.isFrozen()
来检测是不是凝结
序列化
JSON.stringify(),JSON.parse()具可接受第二个参数,标识须要序列化或复原的属性列表
对象要领
- toJSON()
- valueOf()将对象转换成原始值
数组
建立数组
- 数组直接量
[]
,该语法有可选的末端逗号,故[,,]
只要两个元素而非三个 new Array()
new Array() // 建立一个空数组
new Array(10) // 建立一个长度为10的数组
new Array(5,4,3) // 建立一个已包括数组元素数组
希罕数组
希罕数组并非项的值为undefined,而是不存在
// 三种体式格局建立
// 1
new Array(5)
// 2
a=[]
a[1000]=0
// 3
delete
数组要领
*标识为变异要领
- join
- reverse *
- sort *
- concat
- slice
- splice *,返回删除元素构成的数组
- push/unshift *,返回数组新的长度
- pop/shift * 返回删除元素的值
- toString/toLocalString 有方括号,逗号分开
- forEach
- map
- filter,能够运用来紧缩希罕数组
- every 一切元素挪用剖断函数,均返回true才返回true
- some 一切元素挪用剖断函数,有一个返回true就返回true
- reduce/reduceRight
// 乞降、第二个参数为temp的初始值,不传默许运用数组中的第一个元素
arr.reduce((temp,value,index,arr)=>temp+value, 0)
- indexOf/lastIndexOf
数组范例
推断运用Array.isArray(arr)
推断是不是是数组
函数
组织函数:用于初始化一个新建立的对象的函数
函数定义
两种定义体式格局及区分:
- 函数声明语句,能够在定义前运用(函数声明前置);不能出现在轮回、前提、try/catch/finally、with中
- 函数定义表达式,不能在定义前运用(变量声明前置);能够出现在任何地方
- 函数组织器
函数挪用
四种挪用体式格局:
- 作为函数:this在非严厉形式为全局对象,严厉形式为undefined
- 作为要领:this为要领所属对象
- 作为组织函数:this为新组织的对象
- call()或许apply()间接挪用:this为指定的对象
函数的实介入形参
不定实参函数:能够吸收恣意个数的实参,经由过程arguments(类数组对象)吸收参数
作为定名空间的函数
马上挪用函数
(function(){
}())
闭包
词法作用域,函数内变量作用域是在函数定义时建立的,而不是在挪用时建立,且在函数实行时,定义时的作用域链依旧有用。
函数对象能够经由过程作用域链互相关联起来,函数体内部的变量都能够保留咋子函数作用域内,这类特征叫闭包。
函数属性、要领和组织函数
length 形参个数
arguments 参数对象(类数组对象)
prototype 指向原型对象
apply、bind、call
- apply 将函数作为指定对象thisObj的要领来挪用,通报给它的是指定的参数数组args
function.apply(thisObj,args)
- call 将函数作为指定对象thisObj的要领来挪用,通报给它的是指定的参数,假如thisObj为null,则为全局对象
function.call(thisObj,arg1,arg2,...)
- bing 返回一个新函数,经由过程可选的指定参数,作为指定对象obj的要领挪用该要领,通报给该函数的参数由两部分构成,一部分是通报给bind()的args数组指定的参数,剩下的是传给这个新函数的一切值。
传入bind()的实参都是放在传入原始函数的实参列表最先的位置。
function.call(obj,arg1,arg2,...)
// 示例:
let g=f.bind(obj,1,2)
g(3)
// 等价于
f.call(obj,1,2,3)
toString
Function()组织函数,末了一个实参为函数体
函数式编程
高阶函数
操纵函数的函数,吸收一个或许多个函数作为参数,并返回一个函数。
不完全函数
传入bind()的实参都是放在传入原始函数的实参列表最先的位置。
作用域
分类
- 全局
- 函数,块级(ES6+)
- eval
作用域链
变量对象
用于存储实行高低文中的:
- 变量
- 函数声明
- 函数参数
1.变量初始化阶段
2.代码实行阶段
类和模块
特征:封装、继续、多态、笼统
类名运用大驼峰定名。ES6直接运用class,下面是ES6之前的。
组织函数和类的标识
原型对象是类的唯一标识:当切仅当两个对象继续自同一个原型对象时,它们才属于同一个类的实例。
construsctor
组织函数是类的大众标识,construsctor属性为对象供应了类。
let 0= new F()
0.construsctor===F // => true
javascript中的java式的类继续
建立一个类分为三步:
- 定义一个组织函数,并设置初始化新对象的实例属性
- 给组织函数的prototype对象定义实例要领
- 给组织函数定义类字段和类属性
类的扩大
javascript中基于原型的继续机制是动态的,假如建立对象以后原型的属性发生变化,也会影响到继续这个原型的一切实例,即我们能够经由过程给原型对象增加要领来扩大Javascript类。
类和范例
instanceof:
obj instanceof c
obj.isPrototypeOf(f)
constructor:
x.constructor===Number
组织函数的称号
Object.prototype.toString.call(o)
注重:
- 前两种要领在多个实行高低文无效
- 这三种要领都有一个题目,就是不是一切对象都有constructor属性
鸭式辩型
Javascript中的面向对象手艺
规范转换要领
- toString()
- toLocaleString()
- valueOf()
- toJSON()
要领借用
Object.prototype.xxx=xxx
子类
- 要领链
- 组织函数链
正则表达式的婚配形式
定义
- 直接量
- 组织器
内容
直接量字符
字符类
反复
非贪欲反复在婚配字符后加一个?即可。
挑选、分组、援用
指定婚配位置
修饰符
String要领
- search
- replace
- match
- split
RegExp对象
属性:
- source
- global
- ignoreCase
- multiline
- lastIndex
要领:
- exec
- test
javascript的子集和扩大
迭代
迭代器
Iterator(),返回迭代器
for(let [k,v] in Iterator({a:1,b:2}))
console.log(k+"="+v) // a=1,b=2
特征:
- 只针对自有属性举行遍历,疏忽继续属性
- 第二个参数传true,则只遍历属性名。疏忽值
数组推导*
[expression for (varuable in object) if(conditon)]
函数简写
表达式闭包:假如函数只盘算一个表达式并返回它的值,关键字return和花括号能够省略
let succ=function(x)x+1
多catch从句
E4X
jsx语法