一、写在前面
近来重读《JavaScript高等程序设计》,总结下来,查漏补缺。
二、JS简介
2.1 JS构成
- ECMAscript:以ECMA-262为基础的言语,由浏览器支撑
- DOM:编程接口(API), 将页面映射成节点组织(文档树),供应操纵要领
- BOM:浏览器对象模子,处置惩罚浏览器窗口和框架交互(部份扩大)
2.2 <script>
- 实如今HTML中插进去JS
- 内嵌,外联(优点:可保护,可缓存,顺应将来)
- 引荐放在body中、内容后,收缩内容显现时候(浏览器碰到body显现内容)
参数:
async: 马上下载剧本(外部文件),异步实行
- 不保证按涌现递次实行
- 多个async时,保证互不依靠,发起无修正DOM操纵
- 在页面load前实行,不一定在DOMContentLoaded事宜触发前实行
- charset: 指定代码字符集(很罕用,部份浏览器疏忽该参数)
defer: 下载后耽误实行,文档完整剖析显现后实行
- 耽误剧本,耽误到</html>后实行,页面load前实行
- 最好只要一个耽误剧本(HTML5请求按涌现递次实行,但现实不一定按递次实行,也不一定会在DOMContentLoaded事宜触发前实行)
- language: 标明编写言语(烧毁)
src: 外部文件及地点链接
- src、标签间嵌入内容同时存在,src下载实行,嵌入内容不被剖析
type: 标明内容范例(MIME范例),默许text/javascript
- 其他application/x-javascript,application/javascript,application/ecmascript
2.3 文档形式
- 混淆形式
- 规范形式
2.4 <noscript>
初期浏览器不支撑剧本/剧本被禁用时显现,运用noscript安稳退步
<body>
<noscript>您的浏览器不支撑剧本/剧本被禁用</noscript>
</body>
2.5 PS:
1. async和defer辨别?
蓝色线代表收集读取,赤色线代表实行时候,均针对剧本;绿色线代表 HTML 剖析。
- 默许,同步,递次剖析,剖析到马上加载,加载完马上实行。
- defer,异步,同时加载,html剖析完成后实行(多个,不一定按递次实行,实用外链剧本)(HTML5请求按涌现递次实行,但现实不一定,不一定会在DOMContentLoaded事宜触发前实行)
- async,异步,同时加载,加载完马上实行(多个,乱序实行)
2. XHTML和HTML重要差别?
- 元素必正确嵌套,防备<a><b></a></b>
- 单标签< />、双标签<> </>闭合
- 标署名、属性大小写敏感
- 必须有根元素
三、基础概念
3.1 ECMAScript语法
辨别大小写
标识符:
- 参数,变量,属性,函数名
- 以字母、下划线_、$开首
- 通例为驼峰
- 称号不能为关键字
解释:
- 单行解释 / /
- 块级解释 /* */
- 严厉形式: 编译指导” user strict “
语句:
- 引荐以分号;末端
- if( ) 可省略代码块{ }直接誊写语句,但引荐不省略
关键字:
- break case catch continue debugger default delete
- do else finally for function if in
- instanceof new return switch this throw try
- typeof var void while with
保存字:
- abstract boolean byte char class const debugger double
- enum export extends final float goto implements import
- int interface long native package private protected public
- short static super synchronized throws transient volatile
- 外加let、yield、eval、arguments
3.2数据范例
变量:松懈范例(可修正值的范例),var建立时有作用域
- 只定义未初始化,值为undefined
- 不引荐在部分中定义全局变量
数据范例:
- 简朴(基础)数据范例:number,string,Boolean,undef,null
- 庞杂数据范例:Object
typeof操纵符:
- 值:number,string,boolean,undefined,null,object,function
- 特殊状况: typeof null —> object 被认为是空对象指针
对象:
- 空对象,初始化时obj = null 经由过程 obj != null 来看是不是保存对象援用
- 新建对象:new Object( ) 或 new Object
布尔:
- true false 辨别大小写
数值:
- 八进制(严厉形式下失效),0开首,后续值凌驾7则 079无效,剖析为79
- 十六进制,不辨别大小写,0x开首欧,后续0-9、A-F
- 科学计数法,123e7或123e-7,浮点数最大精度17位小数
- 浮点数举行盘算,效果不正确
- 数值局限Number.MIN_VALUE 5e-324 ~ Number.MAX_VALUE 1.7976931348623157e+308,超越对应±infinity
- NaN,返回不为数值,也为数值范例,不影响代码实行,操纵NaN都返回NaN,与任何值都不相称
字符串:
- 0或多个16位unicode字符构成
- 单双引号无辨别
- 字符字面量:\n \t \b \r \f \\ \’ \” \x \u 及6位unicode字符
- 一旦建立,值不可转变,只能—->新的建立,烧毁本来的(旧版浏览器实行速度慢)
3.3 要领
数值
- isNaN( )隐式转换数值
- Number( ),null —-> 0,undefined —> NaN,八进制前导0失效,十六进制转换为十进制整数
- parseInt( ),直到不是数字,保存整数,辨认八进制、十六进制,可指定第二个参数parseInt(a,8)指定八进制
- parseFloat( ),不剖析前导0,可用于:科学计数法转完整展现
字符串:
- toString(a) 参数可设置进制,数据转换值,有些不能转换(undefined,null)
- String()遵照先按toString实行,不成功再按String()转换(undefined—-> undefined , null —-> null )
对象:
- constructor 建立实例的函数(组织函数)
- hansOwnProperty 搜检当前对象中存在某属性(不查原型)
- isPrototypeOf 搜检是不是是某对象的原型
- propertyIsEnumerable 可否运用for-in罗列
- toLocaleString 返回对象字符串示意
- toString( ) 对象的字符串示意
- valueOf( ) 返回对象的字符串、数值或布尔值
3.3 操纵符
算数、位、关联、相称操纵符
一元操纵符(隐式转换):
- 只能操纵一个值
- 前置(副效应:语句被求值前值转变)
- 后置(语句被求值后值转变)
- 含对象,实行valueOf( ) 后获得的值举行加减
位操纵符:
- 转换为32位整数,31位二进制数+ 1位标记位(0正1负)
- 按位非 ~ 获得值的负值 – 1(底层操纵,比 – a – 1 快)
- 按位与 & 二进制每位相与得出二进制值
- 按位或 | 二进制每位相或得出二进制值
- 按位异或^ 两位相异则为1,不然为0
- 左移 << 挪动后补0,不影响标记位
- 右移 >> 保存标记位,挪动后补0
- 无标记右移 >>> 不保存标记位,负数平常右移后很大
布尔操纵符:
- 非 !
- 与 && 短路操纵(有 false 则不往下实行),null 返回null,NaN返回NaN ,undefined返回undefined
- 或 || 短路操纵(有true 则不往下实行 )
乘性操纵符:
- 隐式转换为数值后盘算,/ 除法 ,% 取余
加性操纵符:
- + 加法, – 减法
关联操纵符:
- < 、 >、 <=、 >=
- 都为字符串时,比较字符串字符编码值
- 有对象,转valueOf( ),不成则toString( )
- 字符串比较,大写小于小写,如需比较可全转小写
- 都为字符串的数字,则按编码比
- 一个数字一个字符串,会转为数值
- 转换出NaN,则效果false
相称操纵符:
- 强迫转换规则:有布尔转为数值、有数有字符串转为数值
- 只要一个对象,根据valueOf()转换后比较
- null == undefined,null !== undefined
- 两个对象,比较是不是指向统一对象
前提操纵符:前提?‘真,取值’:‘假,取值’
赋值操纵符:
- =、 +=、 *=、 /=、 %=、 <<=、 >>=、 >>>=(简化誊写,不影响机能)
逗号操纵符:
- 分开多个操纵
- a =(1,2,3,4),a值为末了一个4
3.4 PS:
1. valueOf与toString
2. 负数的二进制示意:
- 绝对值的二进制码,按位取反,加1,获得
3. 按位非运算符 ~
function fast() {
let s = 2222222222;
let start1 = Date.now();
for (var i = 1; i<10000000000;i++) { s = ~ s };
console.log('fast',Date.now() - start1);
};
function slow() {
let s = 2222222222;
let start2 = Date.now();
for (var i = 1; i<10000000000;i++) { s = - (s + 1) };
console.log('slow',Date.now() - start2);
};
fast();
slow();
相差4-5秒左右,底层运算更快
4. && || 操纵
let d = { name: ‘aa’ } ,??代表某参数
- d && ?? 返回??
- ?? && d ??为true返回d,不然返回??
- 有null NaN undefined 返回 对应null NaN undefined
- d || ?? 返回 d
- ?? || d ??为false返回d
- d || e 返回 d
- 都是null NaN undefined 返回 对应null NaN undefined
3.5 语句
- if (前提) { 代码块 }
- do-while 后测试轮回语句,while中满足则实行
- while 前测试轮回语句
- for :while做不到,for也做不到、for( ; ; )三参数可选
- for-in 轮回对象属性,递次不可展望
- label 名字:语句,连系for轮回,轻易continue 名字 实行该操纵,break 名字 中缀名字操纵
- break continue
- with 将代码作用域设置到特定对象中,影响机能,不发起运用
with(location) {
var t = search.name;
var w = hostname;
}
// 等同于
var t = location.seatch.name;
var w = location.hostname;
- switch 全等比较(不举行范例转换),能够兼并状况,case可为变量、表达式,
switch (i) {
case 25:
/* 兼并两种情况 */
case 35:
alert("25 or 35");
break;
...
}
3.6 函数
function (参数) {函数体}
- 定义的参数个数能够≠传入参数个数,实用传参个数不定实行差别操纵
- 可function acc(a)传acc( ) 或function acc()传acc(1,2)
- 内部可用arguments来接见参数,假如a对应arguments[0],两值内存空间自力,但相互同步
- 没有重载:函数没有署名,同名函数后定义的见效
读取这两个值会接见雷同的内存空间;它们的内存空间是自力的,但它们的值会同步。但这类影响是单向的:
修正定名参数不会转变arguments中对应的值。别的还要记着,假如只传入了一个参数,那末为arguments[1]设置的值不会反应到定名参数中。这是由于arguments对象的长度是由传入的参数个数决议的,不是由定义函数时的定名参数的个数决议的。
书中:修正定名参数不会转变arguments中对应的值。 现实转变arguments[0]会同步a ,转变a也会同步argumenets[0]