当前位置: 首页 > 编程日记 > 正文

《JavaScript高级程序设计(第3版)》教程大纲

词条

《JavaScript高级程序设计》是2006年人民邮电出版社出版的图书,作者是(美)(Nicholas C.Zakas)扎卡斯。本书适合有一定编程经验的开发人员阅读,也可作为高校相关专业课程的教材。

献给搬砖人士,求职人士很不错的基础扎实笔记


前四章

js诞生于1995年当时它的主要目的是处理验证操作如今发展成为一门强大的编程语言,由三部分组成:核心(ECMAScript)DOM文档对象模型、 BOM浏览器对象模型

js 放置在 页面的合理位置 对于优化加载有很大的帮助

切记平稳退化,如果不支持的情况下 有很多种方案 ,书中提到了

<noscript>  元素  </noscript>

当页面支持脚本,用户永远也看不到它,尽管他是页面的一部分。

语句结尾加上分号,在某些情况下会增进代码的性能,因为解析器不必花时间推测应该在哪里插入分号了。

一、数据类型

关于 undefined类型,在使用var声明变量但未对其加以初始化这个变量的值就是undefined,包含undefined值的变量与尚未定义的变量还不一样。

var message;alert(message) // undefined
alert(age) // 产生错误

关于 NAN

即非数值,不是一个数字。

NAN与任何值都不相等,包括它自己
alert(isNAN(NAN))  //是否 不是一个数字  true
alert(isNAN(10)) // false
alert(isNAN('ni')) // true
alert(isNAN(true)) // false 因为true 可以被转换为1
typeof() 用来检测给定变量的数据类型
1.undefined  声明变量没有定义
2. null 空对象指针 
3. bloolean 
4. number  数值转换 Number()函数在转换字符串时比较复杂而且不够合理,推荐使用,parseInt()parseFloat()
5. string 字符串类型  toString() 有个缺点 对null 和 undefined 不起作用
6. string() 方法更全面
7. object 对象

二、语句

do-whlie语句 是一种后测试循环语句,换句话说代码至少执行一次

do{i+=2;
}whlie(i<10)

whlie语句属于前测试循环语句,相对for语句也是

var i = 0
whlie(i<10){i+=2
}

关于break和continue语句

var num = 0;
for(var i = 0;i++;i<num.length){if(i%5==0){break;}num++;
}alert(num) //4  break 是立即退出循环强制执行循环后面的语句var num = 0;
for(var i = 0;i++;i<num.length){if(i%5==0){continue;}num++;
}alert(num) //8  continue 退出循环后从循环顶部继续执行
  1. for in 语句 用来枚举对象属性 注意一点 : 输出的属性名 顺序不可预测。
  2. 理解参数 : 通过 arguments 对象的length 可以获知有多少个参数 传递给了函数。

函数体内可以通过arguments 对象来访问这个参数数组 类数组
通过arguments[0]访问第一个参数,arguments[1]访问第二个参数
函数没有重载,定义两个相同名字的函数,后一个会覆盖前一个 通过检查传入函数中参数的类型和数量做出不同的反应,来模拟方法重载,如下所示。

function add(){if(arguments.length ==1){alert(arguments[0]+10)}else if(arguments.length ==2){alert(arguments[0]+arguments[1])}
}add(10) //20
add(10,20) //30

js 变量包含两种数据类型 其一 基本数据类型 其二 引用数据类型


三、基本数据类型与引用类型

基本数据类型指的是简单的数据段,引用类型保存在内存对象中不能直接操作对象的内存空间,操作对象是实际上操作的是对象的引用。

var num1 = 5
var num2 = num1num2与num1是完全的独立的,两个变量互不影响,是副本的关系
var obj = new object ;
var obj2 = obj;obj.name = 'nihao';
alert obj2.name    结果是 nihao

不同的是 这个值的副本实际是 指向了同一个对象 当obj 添加了name属性后 可以通过 obj2 来访问

函数的参数 其实是其函数的局部变量

每个函数都有自己的执行环境,当代执行的时候会创建一个作用域链,对环境的所有变量做有序的访问

查询标示符 也就是 搜索 过程 如果局部环境找到了该标识符 则搜索过程停止 否则 一直追溯到全局环境的变量

作用域链 引发了闭包的概念 全局变量只能访问全局的环境 而局部环境不仅可以访问自己 还可以访问其 父级

js 是一门具有垃圾 收集机制的编程语言 不必关心内存问题 标记清除是目前主流的 垃圾收集算法给当前不使用的值加上标记然后再回收其内存 引用计数 目前不再使用的算法,解除引用对垃圾回收机制有好处是很好的性能优化方案


第五章 引用类型

  1. 如何使用对象
  2. 创建并操作数组
  3. 理解js的基本数据类型

引用类型,有时候也称为对象定义因为他们描述的是一类对象所具有的属性和方法。

一、object类型

创建object实例的方法:

  1. new操作符后面加上object构造函数
  2. 字面量表示法
var per = {name: '',age: 23
}

思考题---基于typeof 检测属性是否存在,使用字面量来指定不同的数据,做不同的显示

function show(arg){var output = '';if(typeof arg.name === 'string'){output += 'nihao' + arg.name;}if(typeof arg.age === 'number'){output+= 'Age:'+ arg.age}alert(output);
}
show({name:'lish',age: 23
})show({name:'zbg'
})

二、array类型

与其他语言的区别: 都同为数据的有序列表,但是js的数组每项可以保存任何类型的数据

创建方式 同object类型

数组的length属性 不是只读的,可以修改!

数组检测 有两个问题:instanceof、array.isArray(),如果有多个框架会有多个全局执行环境会存在不同版本的构造函数,后者目的是确定这个值是不是数组,不论是在那个环境创建的

转换方法: 所有对象都具有toLocaleString、toString、valueOf ,前者与后两者不同的是为了取每一项的值调用的是每一项的toLocaleString,而不是toString。
最后使用join()重现了toString的方法,传递逗号将以逗号分割,传递双竖线将以双竖线分割

ecmascript专门为数组提供了push和pop方法,模拟栈方法,后进先出。
unshift和shift先进先出。

重排序方法:sort()

function com (val1,val2){if(val1<val2){return -1;}else if(val2>val2){return 1;}else{return 0}
}
var arr = [12,2,3,34,567];
arr.sort(com)
alert (arr);

操作方法: concat() 不改变原数组,复制原数组返回副本,会被添加到原数组的末尾

var arr1 = [1,23,3];
var arr2 = arr1.concat("one",[8,"two"])
arr2 => 1,23,3,one,8,two

slice()用于截取数组,不改变原数组创建一个新数组

arr.slice(1) 从下标1开始到结束
arr.slice(1,4)同理
如果是负数,用数组的长度做运算,再如果结束位置小于起始位置返回空数组

splice() 用于删除、插入、替换数组

arr.splice(0,1) 从第零个开始删除1位
arr.splice(1,0,"one") 从第一个位置开始不删除 插入一项
arr.splice(1,1,"two") 从第一个位置删除一位 插入一项

filter() 用于数组筛选

var bg = arr.filter(function(item,index,array){return (item>2)
})
console.log(bg)

map()方法 和foreach() 类似

var bg = arr.map(function(item,index,array){return (item+2)
})
console.log(bg)

归并方法 reduce()和reduceRight()

使用归并方法求数组之和

var val = [1,2,3,4,5]
var sum = val.reduce(function(pre,cur,index,array){return pre+cur
})
alert(sum) 15pre代表前一项 cur代表当前项  
reduce 和 reduceRight 结果相同但取决于从哪头开始遍历数组。

三、date类型

常用的时间戳

`var start = +new Date()
dosomething();
var end = +new Date()
result = end-start`

四、regExp类型

匹配第一个 bat 或者 cat 不区分大小写var pattern = /[bc]at/i;匹配第一个[bc]at 不区分大小写var pattren = /\[bc]\at/i;匹配所有以 at结尾的字符不区分大小写var partten = /.at/gi;匹配所有以 .at 结尾的字符不区分大小写var partten = /\.at\/gi;test()方法var text = "000-00-0000";
var partten = /\d{3}-\d{2}-\d{4}/;
if(partten.test(text)){alert('yes')
}

五、function类型

函数没有重载

var add  = function(){return num+100
}
add  = function(){return num+100
}
var result = add(200)  //300在创建第二个函数时,实际上覆盖了第一个函数的变量

函数声明与函数表达式 声明提前

函数声明因为在代码执行之前,引擎会声明函数并将他们放到源代码树的顶部,
而对于表达式:

alert(sum(10,10));
var sum = function(){return num+num2
}

在执行到语句之前,变量sum中不会保存对函数的引用

作为值的函数

假想根据某个对象属性对数组进行排序

function newsort(pro){return function(obj1,obj2){var val1 = obj1[pro];var val2 = obj2[pro];if(val1<val2){return -1;}else if(val1>val2){return 1}else{return 0}}
}var data = [{name:'lj', age:23},{name:'db', age:45}];
data.sort(newsort(name)) //按姓名排
data.sort(newsort(age)) //按年龄排

函数内部属性

函数内部有两个特殊的对象:arguments this,arguments主要保存函数的参数它还有一个属性callee 是个指针 指向拥有arguments对象的函数

例如非常经典的阶乘函数

function fact(num){if(num<=1){return 1}else{return num* fact(num-1)}
}为了消除函数执行与函数名的耦合现象可以使用arguments.callee(num-1)
替代 fact(num-1)在解除了耦合状态之后 newfact可以正常计算,但fact 只能返回0
var newfact = fact;
fact = fuction(){return 0
}
newfact(5) // 120
fact(5) //0

函数的属性和方法:

每个函数都包含两个属性:length prototype 前者是接收参数的个数,后者是保存
所有实例方法的真正所在。
每个函数也都包括两个非继承而来的方法 apply()、call(),用以改变this的指向

function sum (num1, num2){return num1+num2
}function callsum(num1, num2){return sum.apply(this, arguments)
}alert(callsum(10,10))  //20

基本数据类型,使用new操作符创建引用类型的实例,执行离开作用域之前一直保存在内存中,而基本数据类型,只存在代码执行的瞬间然后立即被销毁

一、布尔,数字,字符串

截取给定位置的那个字符 charAt 只接受一个参数

var str = 'nihao';
alert(str.charAt(1)) //i

字符串的拼接 concat 或者 + 加号操作符

var str = 'nihao';
var newstr = str.concat('world', '!');alert(newstr) // nihao world !

字符串的截取 slice()、substr()、substring()。接收最多两个参数

  • 一个参数的情况:正数就不说了,对于负数最后者都会转换为0 前两者结果相同
  • 两个参数的情况:slice就不说了,substr会将第二个负数转换为0,substring也是将第二个负数转换为0,但是他会自动排序将小的位数放到前面 由(3,0)到(0,3),但是substr不会所以最后返回一个空字符串。

字符串的查找 indexOf match

var str = 'lele nihao,zheli shi di yi jia zhu';
var arr = [];
var op = str.indexOf('e');while(op>-1){arr.push(op);op = str.indexOf('e', op+1);
}
//进入循环后每次给indexOf传递上一次的位置加1
alert(arr)trim() 会创建一个字符串的副本,删除前置及后置的所有空格match()方法只接受一个参数 
var text = 'bat cat';
var parrent = /.at/gi;var new = text.match(parrent)

字符串的替换 replace()

var text = 'bat cat';
var result = text.replace(/at/gi, 'oo')

字符串转数组的方法 split()

var text = 'arr,op,kj,hg,';
var result = text.split(',')
接受第二个参数,固定数组的length

二、URL编码方法

encodeURL() 是对整个URL进行编码,
encodeURLComponent()对附加在现有URL后面的使用

三、 Math 对象

获取数组中最大值和最小值 避免过多的使用循环和在if语句中确定数值。

var val = [1,2,3,4,5,6,7,8,9];var max = Math.max.apply(Math, val);这个技巧的关键,把MAth作为apply的第一个参数,从而正确的设置了this、
`Math.ceil() 向上取整
Math.floor() 向下取整
Math.round() 四舍五入取整`

random()方法

值 = Math.floor ( Math.round() * 可能值的总数 + 第一个可能的值 )

function round(low, up){var sum = up-low+1 //总数return Math.floor ( Math.round() *sum + low )
}var color = ['red', 'blue', 'green', 'yellow'];
var arr = color[round(0, color.length-1)]console.log(arr)  //可能是数组中包含任意一个字符串

总结:第五章完结,在所有代码执行之前 作用域就已经存在两个内置对象 global和math


第六章 面向对象

  • 理解对象属性
  • 理解并创建对象
  • 理解继承

面向对象有类的概念,通过类可以创建任意多个相同属性和方法的对象。

一、创建对象

1、工厂模式,解决了创建多个相似对象的问题,却没有解决对象识别问题
2、构造函数,本身也是函数只不过可以用来创建对象,缺点每个方法都要在每个实例上重新创建一遍,于是把函数定义转到构造函数外面,但是如果对象定义多个方法就要定义多个全局函数,最终导致没有封装性。

function Person (name){this.name = name,this.sayName = function(){alert(this.name)}
}//注意函数名大写,是为了区别其他函数
//再一次提到this重定向var o = new object();
person.call(o,"li",25,"ha");
o.sayname() //li

3、原型模式,每个函数都有一个prototype属性,她是一个指针,指向一个对象,实例共享。

function Person (name){Person.prototype.name = name,Person.prototype.sayName = function(){alert(this.name)}
}
var preson1 = new Person;
var preson2 = new Person;
alert(person1.sayname === person2.sayname) //true
虽然通过对象实例可以访问保存在原型中的值,但却不能通过对象实例重写原型中的值,如果同名该属性就会屏蔽原型中的那个属性
function Person (){Person.prototype.name = 'lisj',Person.prototype.sayName = function(){alert(this.name)}
}
var preson1 = new Person;
var preson2 = new Person;
preson1.name = 'matou'
alert(person1.name) //'matou'
alert(person2.name) //'lisj'使用hasOwnProperty 检测一个属性是否存在于实例中
alert(person1.hasOwnProperty('name')) //true
alert(person2.hasOwnProperty('name')) //false

4、组合使用构造函数模式和原型模式

构造函数模式用于定义实例属性,而原型模式用于定义方法和共享属性

function Person (name){this.name = name;this.friends = ['ls','df']
}
Person.prototype = {constructor: person,sayname: function(){alert(this.name)}
}var preson1 = new Person;
var preson2 = new Person;person1.friends.push('Van')
alert(person1.friends === person2.friends) //false
alert(person1.sayname === person2.sayname) //true

二、原型链实现继承,通过将一个类型的实例赋值给另一个构造函数的原型实现


第七章函数表达式

定义函数的方式常用有两种:1、函数声明。2、函数表达式

函数声明

function show(){}

函数表达式

var say = fuction(){}

函数声明提前

关于函数声明,执行代码前会先读取函数声明,这就意味着前后都可以调用。

而对于函数表达式 提前调用就会报错,使用前必须声明。

函数表达式与函数声明的区别

if(true){function say(){alert(1)}
}
else{function say(){alert(2)}
}

注:表面上看很合理,实际上是在js中属于无效语法,但引擎会尝试修正此错误。

下面的这种写法就很好的解决了这类问题

var say;if(true){say = function(){alert(1)}
}
else{say = function(){alert(2)}
}

二、递归

递归函数是在一个函数通过名字调用自身的情况下构成的

function face(num){if(num<=1){return 1;}else{return num* arguments.callee(num-1)}
}arguments.callee 是一个指向正在执行的函数指针,用它来实现对函数的递归调用

也可以通过命名函数表达式来达成相同的效果

var face = (function f(num){if(num<=1){return 1;}else{return num* f(num-1)}
})

三、闭包

有权访问另一个函数作用域中的变量的函数

关于闭包与变量,即闭包只能取得包含函数中任何变量的最后一个值,闭包保存的是整个变量对象而不是某个特殊的变量。

function nc(){var result = new Array();for(var i = 0;i< 10;i++){result[i] = function(){return i}}return result
}

可以通过一个匿名函数强制让闭包的行为符合预期

function nc(){var result = new Array();for(var i = 0;i< 10;i++){result[i] = function(num){return function(){return num}}(i)}return result
}

关于闭包中使用this

var name = 'window'
var obj = {name:'lsj',say:function(){return function(){return this.name}}
}alert(obj.say()()) //window
var name = 'window'
var obj = {name:'lsj',say:function(){var that = this;return function(){return that.name}}
}alert(obj.say()()) //lsj

通过私有作用域模仿块级作用域

(function(){})();

第八章 BOM

一、最好使用settimeout 去模拟 setinterval

var num = 0;
var max = 10;function show(){num++;if(num<max){settiomeout(show, 500)}else{alert('done')}
}settiomeout(show, 500)

二、location.search 查询字符串参数

function get(){var qs = (location.search.length>0? location.search.substring(1):''),args = {},items = qs.length? qs.split('&'): [],item = =null,name = null,value = null;for(var i = 0;i++;i<items.length){item = item[i].split('=')name = decodeURLComponent(item[0])value= decodeURLComponent(item[1])if(name.length){args[name] = value}}return args
}假设查询字符串为: ?q=javascript&num=0var result = get()
alert(result['q']) //javascript

关于window路径跳转的几种方法:

location.assign('http://nihao.com')
location.href = 'http://nihao.com'
window.location = 'http://nihao.com'//效果相同

第十三章

  • 理解事件流
  • 使用事件处理程序
  • 不同的事件类型

事件流描述的是从页面中接收事件的顺序。

IE的事件流叫事件冒泡:也就是点击事件首先在div元素上发生,再向DOM树向上传递直到document对象

网景公司提出的事件流叫事件捕获:document对象首先接收事件再从树往下传播到事件的实际目标

<input type="button" value="yes" onclick="alert(event.type)" /><input type="text" value="yes" onclick="alert(this.value)" />

通过一个函数处理多个事件时,可以使用type属性

var btn = document.getElementById('de');
var handler = function(event){switch(event.type){case "click":alert(1);break;case "mouseover":alert(2);break;}
}btn.onclick = handler
btn.onmouseover = handler

跨浏览器的事件对象兼容

var EventUtil = {getEvent:function(event){return event? event: window.evnet},getTarget:function(event){return event.target || event.srcElement},perventDefault:function(event){if(event.perventDefault){event.perventDefault()}else{event.returnValue = false}},
}var a = document.getElementById('link');a.onclick = function(event){event = EventUtil.getEvent(event)EventUtil.perventDefault(event)
}以上代码可以确保所有浏览器中点击该链接都会阻止默认跳转

事件委托

建立在事件冒泡机制上的事件委托技术
只需在dom树中最高层次添加一个事件处理程序,这种技术占用内存少,dom引用少能够提升整体的性能。

<ul id = 'list'><li id="one">one</li><li id="two">two</li><li id="three">three</li>
</ul>var list = document.getElementById('list');list.onlick = function(){event = EventUtil.getEvent(event)var target = EventUtil.getTarget(event)switch(target.id){case "one":alert(1);break;case "two":alert(2);break;}
}

相关文章:

鸡肋的PHP单例模式

单例模式的要点有三个&#xff1a;一是某个类只能有一个实例&#xff1b;二是它必须自行创建这个实例&#xff1b;三是它必须自行向整个系统提供这个实例。<?php /* 单例模式举例,其要点如下: * * 1. $_instance 必须声明为静态的私有变量 * 2. 构造函数和克隆函数必须声明…

彻底理解js中this

相关博文&#xff1a;http://blog.csdn.net/libin_1/article/details/49996815彻底理解js中this的指向&#xff0c;不必硬背。 首先必须要说的是&#xff0c;this的指向在函数定义的时候是确定不了的&#xff0c;只有函数执行的时候才能确定this到底指向谁&#xff0c;实际上t…

cvsdfgdfdf

数组-136. 只出现一次的数字题目描述题目样例Java方法&#xff1a;位运算算法思路代码复杂度题目描述 给定一个非空整数数组&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 题目样例 示例1&#xff1a; 输入: […

怎样操作vue.js使用3DES加密

如何在VUE-CLI手脚架建立的工程中使用3des加密&#xff1a; 1npm install crypto-js --save-dev1import CryptoJS from crypto-js123456789101112131415161718192021222324252627//DES加密 Pkcs7填充方式encryptByDES(message, key){const keyHex CryptoJS.enc.Utf8.parse(key…

PHP 函数 ignore_user_abort定时执行任务的实现

ignore_user_abort 设置与客户机断开是否会终止脚本的执行。本函数返回 user-abort 设置的之前的值&#xff08;一个布尔值&#xff09;。int ignore_user_abort ([ string $value ] )参数描述setting可选。如果设置为 true&#xff0c;则忽略与用户的断开&#xff0c;如果设置…

echarts树图节点垂直间距_矿棉板吊顶标准工艺节点

材料探秘materials材料版块【矿棉板吊顶标准工艺】 材料探秘关键词&#xff1a;#吊杆与设备#吊顶龙骨#矿棉板#1 吊杆与设备相遇增加过桥节点图 ■ 本工艺管控要点◎ 顶面的水、电、风专业强制定位、预留、预埋必须全部完成&#xff0c;且电气穿线、测试完成并合格&#xf…

队列 queue

STL: 队列中pop完成的不是取出最顶端的元素,而是取出最低端的元素.也就是说最初放入的元素能够最先被取出(这种行为被叫做FIFO:First In First Out,即先进先出). queue:front 是用来访问最底端数据的函数. 1 #include <queue>2 #include <cstdio>3 uisng namespace…

Android精通:View与ViewGroup,LinearLayout线性布局,RelativeLayout相对布局,ListView列表组件...

UI的描述 对于Android应用程序中&#xff0c;所有用户界面元素都是由View和ViewGroup对象构建的。View是绘制在屏幕上能与用户进行交互的一个对象。而对于ViewGroup来说&#xff0c;则是一个用于存放其他View和ViewGroup对象的布局容器&#xff01; Android为我们提供了View和V…

redis删除过期key的算法_面试官别再问我Redis内存满了该怎么办了

概述Redis的文章&#xff0c;我之前写过一篇关于「Redis的缓存的三大问题」&#xff0c;累计阅读也快800了&#xff0c;对于还只有3k左右的粉丝量&#xff0c;能够达到这个阅读量&#xff0c;已经是比较难了。这说明那篇文章写的还过得去&#xff0c;收到很多人的阅读肯定&…

开源监控解决方案Nagios+Cacti+PNP4Nagios+NConf+NDOUtils+Nagvis(六)ndoutils安装

前面的文章已经说过&#xff0c;NDOUtils必须使用2.0的版本才支持nagios4x&#xff0c;比较幸运的是该版本2014年就已经发布。一.安装#tar -axf ndoutils-2.0.0.tar.gz -C /usr/local/src/#cd /usr/local/src/ndoutils-2.0.0#./configure --prefix/usr/local/nagios LDFLAGS-L/…

网络安全技术分析:DDoS的攻与防

根据墨者安全相关数据研究发现&#xff0c;从今年年初开始&#xff0c;DDoS功击的数量相比去年几乎是翻倍增长&#xff0c;特别是游戏、金融、政企、电商、医疗行业&#xff0c;更是DDoS功击的重灾区&#xff0c;很多企业是闻“D”色变。DDos(Distributed Denial of Service),中…

pcl求平面法向量_线性代数6——平面方程与矩阵

线性方程的几何意义二元线性方程该方程是一个二元线性方程组&#xff0c;包含两个方程&#xff0c;每个方程是一条直线&#xff0c;两条直线的交点就是该方程有唯一解&#xff0c;这就是二元线性方程的几何意义。平面方程空间内不在同一直线上的三点构成一个平面&#xff0c;平…

php 类中的各种拦截器

1、__get( $property ) 访问未定义的属性时调用class lanjie {function __get($name){echo $name." property not found! ";} }$ob new lanjie(); echo $ob->g; 当我们调用对象$ob未定义的属性g时&#xff0c;调用拦截器__get()方法&#xff0c;输出“g property…

[Vue CLI 3] 源码之 webpack-chain

我们看一下 webpack-chain 到底做什么? Use a chaining API to generate and simplify the modification of Webpack version 2-4 configurations.熟悉 cli-plugin-babel、cli-plugin-eslint 源码的话&#xff0c;你会时常看到它。 如何使用呢&#xff1f; 1、加载它 const Co…

openstack页面自定义插件使用详解(django、ajax、post)(zTree为例)

2019独角兽企业重金招聘Python工程师标准>>> 感谢朋友支持本博客&#xff0c;欢迎共同探讨交流&#xff0c;由于能力和时间有限&#xff0c;错误之处在所难免&#xff0c;欢迎指正&#xff01; 如有转载&#xff0c;请保留源作者博客信息。 Better Me的博客&#xf…

lazyload.js实现图片异步延迟加载

所谓图片异步加载&#xff0c;意思是不用一次把图片全部加载完&#xff0c;你可以叫它延迟加载&#xff0c;缓冲加载都行。 看看你有没有这种需求&#xff1a;某篇文章图片很多&#xff0c;如果在载入文章时就载入所有图片&#xff0c;无疑会延缓载入速度&#xff0c;让用户等…

postfilter中文什么意思_Filterpost请求中文字符编码的过滤器 --学习笔记

java代码&#xff1a;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class Lo…

错误:You can't specify target table 'xxx' for update in FROM clause的解决

今天在MySQL数据库删除重复数据的时候遇到了一个问题。如下脚本&#xff1a; DELETE FROM tempA WHERE tid IN ( SELECT MAX(tid) AS tid FROM tempA GROUP BY name,age ) 会出现报错信息&#xff1a; You cant specify target table tempA for update in FROM clause 大致意思…

HTTPS的七个神话(译文)

原文网址&#xff1a;http://blog.httpwatch.com/2011/01/28/top-7-myths-about-https/ 译文地址&#xff1a;http://www.ruanyifeng.com/blog/2011/02/seven_myths_about_https.html 误解七&#xff1a;HTTPS无法缓存 许多人以为&#xff0c;出于安全考虑&#xff0c;浏览器不…

蓝牙写入数据库_蓝牙 数据写入 简单易懂版(适合没写过蓝牙的看)

//字符串转arrbufferfunction string2buffer(str) {// 首先将字符串转为16进制let val ""for (let i 0; i < str.length; i) {if (val ) {val str.charCodeAt(i).toString(16)} else {val , str.charCodeAt(i).toString(16)}}// 将16进制转化为ArrayBufferr…

Educational Codeforces Round 9 F. Magic Matrix 最小生成树

F. Magic Matrix题目连接&#xff1a; http://www.codeforces.com/contest/632/problem/F Description Youre given a matrix A of size n  n. Lets call the matrix with nonnegative elements magic if it is symmetric (so aij  aji), aii  0 and aij ≤ max(aik, …

【SqlServer】SqlServer中的更新锁(UPDLOCK)

UPDLOCK.UPDLOCK 的优点是允许您读取数据&#xff08;不阻塞其它事务&#xff09;并在以后更新数据&#xff0c;同时确保自从上次读取数据后数据没有被更改。当我们用UPDLOCK来读取记录时可以对取到的记录加上更新锁&#xff0c;从而加上锁的记录在其它的线程中是不能更改的只能…

Oracle CDC (Change Data Capture)更新数据捕获——概述

Change Data Capture能高效识别并捕获数据的插入、修改和删除&#xff0c;使更新数据供个人或应用使用。 CDC从oracle 9i开始引入&#xff0c;//TODO 在11G R2之后的版本里将取消支持&#xff0c;被Oracle GoldenGate取代。 CDC的一些概念 CDC有同步和异步两种模式&#xff0c;…

flutter ios启动白屏_Flutter技术架构概览

前言最近在整理各种技术架构&#xff0c;给自己的列了个TODO list&#xff0c;希望能在几个月的时间内&#xff0c;研究完各种前端技术架构&#xff0c;包括移动端技术架构。今天分享一下自己整理的flutter技术架构。完整的技术架构TODO list可以去我的github仓库查看&#xff…

SQL Relay开源的数据库池连接代理服务器

一、SQL Relay是什么&#xff1f; SQL Relay是一个开源的数据库池连接代理服务器 二、SQL Relay支持哪些数据库&#xff1f;* Oracle* MySQL* mSQL* PostgreSQL* Sybase* MS SQL Server* IBM DB2* Interbase* Sybase* SQLite* Lago* ODBC* MS Access三、安装和配置&#xff1b;…

关于Android开源库分享平台,(GitClub)微信小程序的开发体验

七八月份的深圳一直在下雨&#xff0c;总有人说雨天适合窝在家看书&#xff0c;对于程序开发者来说更是难得的学习机会。我们502工作室的小伙伴利用这个时间学习了一下微信小程序开发&#xff0c;并上线了一个GitClub小程序&#xff0c;目前功能有些简陋&#xff0c;难免有辣眼…

RSync实现文件备份同步

rsync是类unix系统下的数据镜像备份工具&#xff0c;从软件的命名上就可以看出来了——remote sync。它的特性如下&#xff1a;1、可以镜像保存整个目录树和文件系统。2、可以很容易做到保持原来文件的权限、时间、软硬链接等等。3、无须特殊权限即可安装。4、优化的流程&#…

Hibernate annotation多对多配置

角色&#xff08;用户组&#xff09;&#xff0c;用户多对多。 角色实体配置&#xff1a; private Set<TAuthUser> users;ManyToManyJoinTable(name"t_auth_user_role",joinColumns{JoinColumn(name"role_id")},inverseJoinColumns{JoinColumn(name&…

ajax中的url如何传递变量_如何创建和参数化UDT数据类型中的变量及IN,OUT 等参数?...

从数据类型的意义上说 UDT 并不被 CPU 所识别&#xff0c;而是在离线程序中自定义(组合)的数据类型。 S7 程序的自定义数据类型并不能装载到 S7 CPU 中。UDT 是由递增的编辑器创建并编辑或由源文件的编译而生成。 当在块调用中进行变量传递时是不能将 UDT 作为内存地址区域来传…

[雪峰磁针石博客]kotlin书籍汇总

2019独角兽企业重金招聘Python工程师标准>>> 下载地址 Learning Kotlin by Building Android Applications - 2018 初级 Develop amazing applications that will help you understand and explore the fundamentals of Kotlin while covering 3 various types of p…