JS高级程序设计拾遗
《JavaScript高级程序设计(第三版)》反反复复看了好多遍了,这次复习作为2017年上半年的最后一次,将所有模糊的、记不清的地方记录下来,方便以后巩固。
0. <script>元素属性
async表示立即下载脚本,但不应该妨碍页面中其他操作;
defer表示延迟到文档完全被解析和显示之后再执行。这两个属性都仅适用于外部脚步,而且现实中脚步不一定按顺序执行。指定async属性的目的是不让页面等待脚本下载和执行。
最好只包含一个延迟脚本,把延迟脚本放在页面最底部仍然是最佳选择。
1.Number类型
1.1 NaN即非数值可以用isNaN()来确定。isNaN()在接收到一个值后,会尝试将这个值转换为数值,任何不能转换为数值的值都会导致isNaN()返回true。
alert(isNaN(NaN)) //true
alert(isNaN("10")) //false
alert(isNaN("blue")) //true
1.2 数值转换
上例讲到的isNaN()会将值转换为数值,那是怎么转换的呢。JS所有数值转换,默认情况下都是调用Number()转型函数的。
Number()、parseInt()、parseFloat() 区别: Number()参数可以为任何数据类型,后两个参数只能为字符串(parseInt()还可以多一个转换基数的参数;Number()对空字符串返回0,后两个则返回NaN,原因是parseInt()对于第一个字符不是数字字符或负号,就会返回NaN;对于参数是字符串,Number()要求字符串只包含数字才转换成数值(空字符串转为0),否则转换为NaN,而后两个函数没这个要求。另外,对于Number(),null转为0,undefined转为NaN
2.逻辑与操作符(&&)的理解 (《JS权威指南》)
“&&”运算符有三个层次的理解。第一层理解是,当操作数都是布尔值时,进行布尔操作,运算结果总是布尔值true或false。第二层理解是,当有操作数不是布尔值时,则对真值和假值进行布尔操作,并返回相应的真假值,
因此“&&”并不总返回true和false。第三层理解是对上面提到的真假值的补充,运算符首先计算左操作数的值,如果为假值,则整个表达式结果一定也是假值,此时“&&”简单返回左操作数的值,而并不会对右操作数进行计算;反过来,
若左操作数是真值,那么整个表达式结果依赖于右操作数的值,“&&”计算右操作数的值并将其返回作为整个表达式的计算结果。其实,第一层理解也可归并到第三层理解中。
var a = 0;
// var a = null;
// var a = 3;
var b = 5;
var c = a && b;
console.log(c); // a=0时,结果是0;a=null时,结果是null;a=3时,结果是5.
3.加法操作符(+) (《JS权威指南》)
如果其中一个操作数是对象,对该对象进行到原始值的转换;
进行对象到原始值的转换后,如果其中一个操作数是字符串,则另一个操作数也转换为字符串,然后进行字符串连接;
否则,两个操作数都转换为数字(或NaN),然后进行加法操作;
"1" + 2; //"12"
1 + {}; //"1[object Object]" :对象转换为字符串后进行拼接
true + true //2 :布尔值转换为数字
2 + null //2 :null转换为0
2 + undefined //NaN :undefined转为NaN
4.关系操作符 (小于< ,大于>等) 发现这部分内容还是《JS权威指南》讲得好
如果操作数为对象,进行对象到原始值的转换;
在对象转为原始值后,如果两个操作数都是字符串,则进行字符编码的比较;
在对象转为原始值后,如果至少一个操作数不是字符串,那么两个操作数都转为数值比较;
如果一个操作数(或转换后)是NaN,则返回false;
5.相等操作符(==)、全等操作符(===)
===比较简单,要求两个值的类型相同,否则不相等。下面全部是==的规则。
null与undefined相等;
如果一个操作数是数字,另一个是字符串,则字符串转数字后比较;
如果一个操作数是布尔值,则转为数字后比较;
如果一个操作数是的对象,另一个操作数不是,则将对象转为原始值后比较;
6.引用类型操作
6.1 instanceof 检测对象类型
var a = {};
console.log( a instanceof Object); //true
6.2 Array.isArray 检测是否是数组
var a = [];
console.log(Array.isArray(a)); //true
6.3 数组push时推入参数的顺序
push()参数靠前的放在数组靠前的位置
var a = [];
a.push('11', '22')
console.log(a); // ["11", "22"]
6.4数组unshift时推入参数的顺序
unshift()参数靠前的放在数组靠前的位置
var a = [];
a.unshift('11', '22');
a.unshift('33');
console.log(a); // ["33",11", "22"]
7.URI编码方法
Global对象的encodeURI()和encodeURIComponent()方法可以对URI进行编码。encodeURI主要用于给整个URI编码,encodeURIComponent可以对URI的部分
进行编码。区别是encodeURI不会对本身属于URI的特殊字符进行编码,如冒号、问号、井字符,而encodeURIComponent会对任何非标准字符进行编码。通过
decodeURI和decodeURIComponent可以进行相应的解码。
var uri = "http://www.baidu.com/illeagl value.html#start";
console.log(encodeURI(uri)); //http://www.baidu.com/illeagl%20value.html#start
console.log(encodeURIComponent(uri)); // http%3A%2F%2Fwww.baidu.com%2Filleagl%20value.html%23start
8.JSON对象的解析与序列化
ES5的JSON对象有2个方法,JSON.stringify()用于把js对象序列化为JSON字符串,JSON.parse()用于把JSON字符串解析为JS值。
9.JSONP
看了高程后,看这篇文章
10. 浏览器链接指向新url后发生的一系列过程。虽然不是JS的东西,但作为网络基础,还是在这儿写一下
假设链接https://www.baidu.com 其IP地址是166.166.166.166。
1)浏览器分析url,并解析出服务器的主机名www.baidu.com
2)浏览器向DNS请求解析www.baidu.com的IP地址
3) DNS解析出IP地址为166.166.166.166
4)浏览器与服务器建立TCP链接
5)浏览器向服务器发送一条HTTP请求报文
6)服务器向浏览器回送一条HTTP响应报文
7)释放TCP链接
8)显示文档
11.DOM操作
// 获取元素
document.getElementById('id');
elem.getElementsByTagName('tag');
document.getElementsByName('name');
// html5新增
elem.getElementsByClassName('class');
// 获取属性
elem.getAttribute('attr');
// 设置属性
elem.setAttribute('attr', value);
// 移除属性
elem.removeAttribute('attr');
// 子节点列表 childNodes有浏览器兼容问题,需要对节点类型进行判断,推荐用children
element.childNodes;
// nodeType属性 node.nodeType 1:元素节点 2:属性节点 3:文本节点
// nodeValue属性 node.nodeValue
// firstChild和lastChild
node.firstChild==node.childNodes[0] ;
node.lastChild==node.childNodes[node.childNodes.length - 1] ;
// innerHTML属性 既可读又可以写
// 创建新元素
document.createElement(elem);
// 将元素节点插入节点树
// 追加子节点
parent.appendChild(child);
// 在已有节点前插入新节点
node.parentNode.insertBefore(newNode, node);
// DOM没有提供在现有节点后插入新节点的方法 // 节点的下一兄弟节点
node.nextSibling;
// 节点的前一兄弟节点
node.previousSibling;
// 替换节点
someNode.replaceChild(newNode, oldNode);
// 移除节点
someNode.removeChild(oldNode);
// 克隆节点 true 深复制, false 浅复制
node.cloneNode(boolean); // 创建文本节点
document.createTextNode(text); // CSS-DOM
// 设置类名
elem.setAttribute("class", "intro");
elem.className; // DOM扩展
// 接收一个CSS选择符,返回匹配的第一个元素
elem.querySelector();
// 接收一个CSS选择符,返回匹配的NodeList
elem.querySelectorAll();
JS高级程序设计拾遗的更多相关文章
- js高级程序设计笔记之-addEventListener()与removeEventListener(),事件解除与绑定
js高级程序设计笔记之-addEventListener()与removeEventListener(),事件解除与绑定 addEventListener()与removeEventListener( ...
- 《JS高级程序设计》笔记 —— 解析查询字符串
今天在继续翻阅<JS高级程序设计>的时候,正好翻到location对象这一小节,其中有一部分就是讲的解析查询字符串.看到这个内容立马想到了做去哪儿秋招笔试题的时候有这么一道题. 去哪儿笔试 ...
- angular.js高级程序设计书本开头配置环境出错,谁能给解答一下
server.jsvar connect=require('connect');serveStatic=require('serve-static');var app=connect();app.us ...
- 读书笔记 - js高级程序设计 - 第十五章 使用Canvas绘图
读书笔记 - js高级程序设计 - 第十三章 事件 canvas 具备绘图能力的2D上下文 及文本API 很多浏览器对WebGL的3D上下文支持还不够好 有时候即使浏览器支持,操作系统如果缺缺 ...
- JS高级程序设计3
PS:有一小部分写在了 JS 2017了 JSON <!DOCTYPE html> <html lang="en"> <head> <me ...
- js高级程序设计书中,有一句话在全局作用域中定义的函数实际上只 能被某个对象调用???
js没有块级作用域(题外话:函数可以作为一个块级),所以我们经常使用闭包来模拟块级作用域,以避免变量或者函数因为名称相同而产生的冲突. 重点来了: 所以,如果我们把哪个变量或者函数放在全局作用域中,那 ...
- JS高级程序设计 笔记
1.instanceof 可以判断实例是否在某个对象的原型上: function A() { this.a = "a"; } function B() { this.b = &qu ...
- JS高级程序设计2nd部分知识要点5
JS Regexp 字面量模式 用\反斜杠转义 构造函数中的字符串 也用\转义正则也用\ RegExp实例属性 global -布尔值 /g ignoreCase -布尔值 /i lastIndex ...
- js高级程序设计(三)基本概念
数据类型 ECMAscript中有五种简单数据类型Undefined,Null,Boolean,Number,String 还有一种复杂数据类型Object. typeof操作符 typeof可能返回 ...
随机推荐
- GDB中创建要素数据集
转自 在geodatabase中创建要素集 //在数据集中创建要素 private void menuItem25_Click(object sender, System.EventArgs e) { ...
- Android界面相关的类
Android界面相关的类 Window Activity的显示界面对象,并作为顶层View被加入到WindowManager中.Window提供了标准的UI显示策略:界面背景.标题区域.默认的事件处 ...
- Android 最火的高速开发框架AndroidAnnotations使用具体解释
Android 最火的高速开发框架androidannotations配置具体解释文章中有eclipse配置步骤.Android 最火高速开发框架AndroidAnnotations简介文章中的简介. ...
- 【例题5-7 UVA - 136】Ugly Numbers
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 每个丑数x,都能生成3个丑数2x,3x,5x 则我们以1作为起点. 生成丑数. 每次取出set里面最小的那个数. 然后用它去生成其他 ...
- 部分城市关于.Net招聘数量
2016-12-09更新统计数据 上海 10730 北京 6322 广州 4157 深圳 3548 成都 2291 重庆 706 厦门 285 2015-01-30日,前程无忧搜索".Net ...
- [spark]Spark Streaming教程
(一)官方入门示例 废话不说,先来个示例,有个感性认识再介绍. 这个示例来自spark自带的example,基本步骤如下: (1)使用以下命令输入流消息: $ nc -lk 9999 (2)在一个 ...
- Xposed也要热更新
好久没写博客了.这次玩一点不一样的. 吐槽&起因 相信熟悉Xposed的小伙伴们都知道,每次写完Xposed都要重新启动啊.有木有!反射错了,写错了名字.改一个log,都要重新启动啊有木有!重 ...
- 多事务运行并发问题spring学习笔记——数据库事务并发与锁详解
多事务运行并发问题 在实际应用中,往往是一台(或多台)服务器向无数客户程序提供服务,当服务器查询数据库获取数据时,如果没有采用必要的隔离机制,可能会存在数据库事务的并发问题,下面是一些常见的并发问题分 ...
- iOS View自定义窍门——UIButton实现上显示图片,下显示文字
“UIButton实现上显示图片,下显示文字”这个需求相信大家在开发中都或多或少会遇见.比如自定义分享View的时候.当然,也可以封装一个item,上边imageView,下边一个label.但是既然 ...
- .NET-架构优化实战-前端优化
原文:.NET-架构优化实战-前端优化 前言 上一篇<.NET-架构优化实战-梳理篇>整理了基本的业务知识,同时也罗列了存在的问题,本篇主要是针对任务列表的页面进行性能优化. 该篇主要涉及 ...