JavaScript从入门到精通之入门篇(二)函数和数组

入门篇大纲

在这里插入图片描述

第二部分 函数与数组

1.函数

函数的定义

普通函数

  • function 函数名 (表达式1…) { 代码块 }
  • js是解释性语言,在当前script标签代码执行的开始阶段,就会将普通函数放入堆中,也只是将引用放入堆中,函数中的内容并没有解释执行,只有当函数执行的时候才会解析,执行一次函数,解析一次
  • 普通函数 function fn() {} 可以在定义之前调用执行
fn(); // 可以在定义之前调用
function fn() {console.log('普通函数');
}
fn(); // 也可以在定义之后调用
  • 函数重名的危险
    1. 普通函数和匿名函数重名,匿名函数会覆盖普通函数,原因是普通函数在script标签开始时就将函数放入堆中,而匿名函数是在代码解析的时候才存入堆中,如果名称相同,就会覆盖原函数;
    2. 普通函数和变量重名,变量会覆盖普通函数;
      例子:
//  1. 普通函数和匿名函数重名
function fn() {console.log('我是普通函数');
}
var fn = function() {console.log('我是匿名函数');
}
fn(); // 输出:我是匿名函数
//  2. 普通函数和变量重名
function fn() {console.log('我是普通函数');
}
var fn = 10;
fn(); // 调用失败,会报fn未定义的错误

匿名函数

  • 定义: var 变量 = function() { 代码块}
  • 将匿名函数赋值给变量,执行变量函数就是执行这个匿名函数,匿名函数不能再定义该函数之前进行调用
var fn = function() {console.log('匿名函数');
}
fn(); // 只能在定义之后调用匿名函数
  • 不建议使用匿名函数,通常使用addEventListener() 方法替代
// 兼容性极好 ie6+, 但是不建议使用
btn.onclick = function() {console.log(this); 
}
// 通常用下面方式代替,兼容性 ie8+
btn.addEventListener('click', clickHandler);
function clickHandler(e) {console.log(e);
}

构造函数

  • 定义:var 变量 = new Function(参数字符串, 执行语句代码块字符串)
  • 使用全字符串,参数在最前面,后面的字符串内容是执行代码的语句
  • 缺点:代码会做2次执行,第一次会将函数中的字符串解析为普通代码,第二次执行该代码,因此,效率极低
  • 优点:可以用任何语言传入该js代码并且执行
var fn = new Function("a", "console.log(a)");
fn(10); // 输出 10

自执行函数

  • 定义:(function () { 代码块}) ()
  • 自执行函数只能执行一次,执行完成后再也找不到,变成孤儿对象(但是有引用,不能被回收)
(function () {console.log('自执行函数');
})();

变量的作用域

全局变量

  • 所谓全局变量就是在script标签中直接使用var定义的变量
  • 当在script中定义了变量,在定义前调用是undefined,这是因为定义变量是在内存中开辟了该变量的存储位置,并在代码解释执行时将值存在栈中,如果提前调用,计算机在内存中找不到对应的存储位置,所以会报undefined
console.log(s); // 报错:s is not defined 
var s = 100;
  • 如果在上一个script中调用下一个script中定义的变量,因为没有开辟存储空间,所以永远报错
<script type="text/javascript">console.log(s); // 报错:s is not defined 
</script>
<script type="text/javascript">var s = 100;
</script>
  • 一旦定义变量完成后,在后面的script中都是可以任意调用的,因为这些变量都是全局变量
<script type="text/javascript">var s = 100;console.log(s); // 输出: 100
</script>
<script type="text/javascript">console.log(s); // 输出: 100
</script>

局部变量

  • 所谓局部变量就是在函数中使用var定义的变量
  • 函数中的定义的局部变量是有作用域的,他的范围仅限于该函数内部,函数运行完成后,函数内定义的变量将会自动销毁
var s;
function fn() {var c = 10; // 这是局部变量c += 3; console.log(c); // 输出:13// 可以在函数中修改全局变量的值,修改后,全局调用有效s == 10;console.log(s) // 输出:10
}
fn();

局部变量和全局变量重名

  • 如果在函数中定义了某个局部变量名,那么在该函数中所有的这个变量都是局部变量,不能通过直接使用变量名的方法调用到外部同名的全局变量

例子:

 var s = 10;function fn() {var s = 20;s += 20;window.s += 10; // 想要在函数内调用与局部变量同名的全局变量,需要加上window前缀console.log(s); // 输出:40console.log(window.s); // 输出:20}fn();

典型例子

 var s = 10;function fn() {console.log(s); // 输出:undefineds += 20;console.log(s); // 输出:NaN 因为是 undefined += 10var s = 20;	// 函数内一旦定义,在其前后调用都为布局变量}fn();

参数

定义

由于js是一种弱类型语言,在使用参数时需要注意以下两点

  • 参数类型:因为参数类型不能固定,如果是对外开放的函数参数,一定需要在代码中判断输入参数的类型
  • 初始化:在ES5中函数的参数不能设置初始化值,所以需要在执行代码时给他自定义一个默认的初始值;而在ES6中是可有初始化参数设置,直接可以使用,比如function(a, b, type='+'),参数type默认是"+"

实参和形参

对象参数

如果参数为对象,传入的是引用对象的地址

function fn(o) {var obj = {a: 1};console.log(o === obj); // falseconsole.log(o === obj3); // true
}
var obj3 = {a: 3};
fn(obj3);

函数参数–回调

参数如果传入的是一个函数名,在当前函数中运行了这个参数,这就是回调

function fn1(o, fn){o.a += 1;fn(o); // 执行回调console.log(o.a); // 输出: 12
}
function fn2(_o){_o.a += 10;
}
var obj = {a: 1};
fn1(obj, fn2);

函数执行自己–递归

var sum1 = 0;
var i = 0;
function fn() {if (i === 100){return// 跳出函数外}sum += i;i++;fn(); // 执行回调
}

return

注意事项

  • return语句会终止函数的执行并返回函数的值,return是JavaScript里函数返回值的关键字
  • 一个函数内处理的结果可以使用return返回,这样在调用函数的地方就可以用变量接受返回结果
  • return关键字内任何类型的变量数据或表达式都可以进行返回,甚至什么都不返回也可以
  • return也可以作为阻止后续代码执行的语句被使用
  • function abc() { if (bool) return}这样可以有效的控制语句在一定的条件下执行,不过一定要与break区分,break是用在条件当中,跳出的也仅仅是条件和循环,但是return却可以跳出函数,仅仅是针对函数使用,如果没有函数是不能使用return的

应用场景

  1. 返回一个数据
function createObj(_a) {return {a: _a}; // 返回一个数据对象
}
console.log(createObj(3) === createObj(3)); // 输出:false
  1. 工厂模式或者单例模式
var box;
function createBox(_a, _b) {if (!box) {box = {};}box.a = _a;box.b = _b;return box;
}
console.log(createBox(3, 5) === createBox(10, 20)); // 输出: true
  1. 通过参数传入的对象
function setObjProper(obj) {obj = obj || {}; // 宽模式obj.n = 3;return obj;
}
var obj = setObjProper({});
var obj1 = setObjProper();
var obj2 = {a: 5};
console.log(obj2 === setObjProper(obj2)); // 输出:true
console.log(obj, obj1); // 输出:{n: 3}  {n: 3}
  1. 如果参数一个函数,返回的是回调函数的结果
function fn1(fn) {var obj = {};return fn(obj); // 返回回调函数的结果
}
function fn2(obj) {obj.a = 10;return obj;
}
console.log(fn1(fn2)); // 输出:{a: 10}
  1. 返回的是一个私密的对象 (闭包)
function fn() {return function () {console.log('aaa');}
}
fn()(); // 输出: aaa
  1. 返回一个数组,返回多个元素
  2. 返回一个对象,返回多个元素
  3. 返回一个函数体
  4. 跳出

2.数组

定义

  • 数据将无序的数据做有序的排列,存储在一个变量中
  • 原生JS中没有数组类型,原生JS中的数据可以存储多个不同类型的数据(弱类型)
  • Array.isArray(arr) 是判断arr是否为数组
  • 数组中,标识元素所在的位置,叫做下标,也叫做索引
  • 数组中,标识元素的内容,arr[0]这个就叫做下标变量

数组的创建

  1. 字面量创建
    var arr = [1, 2, 3, 4, 5]
  2. 对象构造函数创建
    var arr = new Object([1, 2, 3, 4, 5])
  3. 构造函数创建
    var arr = new Array()
    注意:
    • 创建数组时,有且仅有一个数值类型的参数,这个参数就是数组的长度
    • 创建数组时,有且仅有一个非数组类型的参数或者有两个或两个以上的参数,这些参数都是数组的元素

数组的长度

  • 数组的长度是可以设置的
  • 将数组的长度设置为0,表示清空数组
  • 如果数组的长度小于原数组长度,意味着将数组从0位截取到指定位置
var arr = [1, 2, 3, 4, 5];
arr[arr.length-1] = 6; // 将数组中最后一个元素5替换为6
arr[arr.length] = 6; // 给数组的尾部添加一个新元素6

数组的遍历

  1. for循环遍历
var arr = [1, 2, 3, 4, 5];
for (let i = 0; i < arr.length; i++) {console.log(i + '=====' + arr[i]); // 输出: 0=====1//		 1=====2//       2=====3 //       3=====4 //       4=====5
}
  1. for in 遍历 (能遍历出数组中所有的对象)
var arr = [1, 2, 3, 4, 5];
arr.key = 100;
for (let prop in arr) {console.log(prop + '=====' + arr[prop]); // 输出: 0=====1//		 1=====2//       2=====3 //       3=====4 //       4=====5//       key=====100
}
  1. forEach遍历
    forEach遍历当前数组,没有返回值,不会返回新数组
var arr = [1, 2, 3, 4, 5];
arr.forEach(function(t, i, arr)) {// 参数为:元素值,元素下标,数组对象console.log(t, i, arr)
})
  1. map遍历
    map遍历数组,将当前数组中的元素返回给新数组,不适用return时,新数组的长度与原数组相同,但是每个元素都是undefined
var arr = [1, 2, 3, 4, 5];
arr = arr.map(function (t) {if (t % 2 === 0) { // 数组元素中偶数元素 + 1return t + 1;}return t;
});
console.log(arr); // 输出:[1, 3, 3, 5, 5]

冒泡排序

var arr = [6, 3, 4, 5, 7, 1, 2, 9, 0, 8];
// 要点1: 外层循环从后向前
for (var i = arr.length; i > 0; i--) {// 要点2:内层循环从前向后for (var j = 0; j < arr.length; j++) {// 要点3:只判断内层循环的当前为和下一位的大小,然后互换if (arr[j] > arr[j+1]) { // 升序: j>j+1 降序:j<j+1var temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}	}
}
console.log(arr); // 输出:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

选择排序

var arr = [6, 3, 4, 5, 7, 1, 2, 9, 0, 8];
// 要点1:外层循环从头到尾
for (var i = 0; i < arr.length; i++) {// 要点2:每次初始最小值是当前循环所在的值var min = i; // 要点3:从当前所在值的下一项到尾部循环for (var j = min + 1; j < arr.length; j++) {// 要点4:比较大小,找出后面元素中最小值所在的下标if (arr[min] > arr[j]) { // 升序:min>j  降序:min<jmin = j;}}// 要点5:互换当前下标值和最小值的下标值var temp = arr[i];arr[i] = arr[min];arr[min] = temp;
}
console.log(arr) // 输出:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

数组的方法

push

var arr = [1, 2, 3, 4, 5];
// 向数组尾部添加元素
var len = arr.push(6); // 返回数组的新长度
// 典型应用
var len = arr.push(6, 7, 8);
var len2 = arr.push([6, 7, 8]);
console.log(len, len2) // 输出:8   9

pop

// 删除数组尾部的元素
var t = arr.pop(); //返回被删除的元素
// 典型应用
var arr = [-2, -1, 0, 1, 2, 3, 4];
var arr1 = [];
var t;
while (t = arr.pop()) { // 会获取arr中0以后的所有元素,并倒序排列arr1.push(t);
}
console.log(arr1); // [4, 3, 2, 1]

shift

// 删除数组的头部元素
var t = arr.shift(); // 返回被删除的元素

unshift

var arr = [1, 2, 3, 4, 5];
// 向数组头部添加元素
var len = arr.unshift(); // 返回数组的新长度
var len = arr.unshift(0); // [0, 1, 2, 3, 4, 5]
// 尽量减少unshift的使用,从数组头部添加元素费性能

join

var arr = [1, 2, 3, 4];
console.log(arr.join()); // 与arr.toString()相同
console.log(arr.join('#')); // 设置一个符号,用这个符号链接数组的每一个元素,形成一个新字符串
console.log(arr.join('')); // 元素紧密相连 

concat

var arr = [1, 2, 3, 4];
var arr1 = arr.concat(); // 没有参数数,表示复制数组
var arr2 = arr.concat(5, 6); // 将arr数组链接 5,6两个元素,形成新数组,原数组不变
var arr3 = arr.concat([5, 6, 7]); // 将arr数组和数组[5, 6, 7]合并形成新数组
var arr4 = [5, 6, 7];
var arr5 = arr.concat(arr4); // 将两个数组链接形成新数组

splice

var arr = [1, 2, 3, 4, 5];
arr.splice(); // 数组插入删除替换元素,并且返回被删除元素组合成新数组
var arr1 = arr.splice(); // 创建一个新的空数组返回
var arr1 = arr.splice(3); // 从下标是3开始删除到尾部
var arr1 = arr.splice(0); // 将arr的所有元素导入arr1中,清空arr
var arr1 = arr.splice(0, 2); // 从arr数组的下标0开始删除2位元素
var arr1 = arr.splice(0, 0, -1); // 在第0位插入一个-1
var arr1 = arr.splice(-1, 0, -1); // 在第-1位(倒数第1位)插入一个-1
var arr1 = arr.splice(arr.length, 0, -1); // 在数组尾部插入一份-1
var arr1 = arr.splice(1, 2, -1, -2); // 从第1位开始替换两个元素为-1, -2

slice

var arr = [1, 2, 3, 4, 5];
arr.slice(); // 数组截取元素,并且返回被截取元素组合成新数组,原数组不变
var arr1 = arr.slice(); // 复制arr的所有元素给arr1,和原数组没有引用关系
var arr1 = arr.slice(0); // 复制arr的所有元素给arr1,和原数组没有引用关系
var arr1 = arr.slice(3); // 将数组从下标3开始到结尾截取形成新数组
var arr1 = arr.slice(-2); // 将数组从倒数第2位开始到结尾截取形成新数组
var arr1 = arr.slice(3, 4); // 将数组从下标3开始到下标4截取形成新数组
var arr1 = arr.slice(-2, 4); // 将数组从倒数第2位开始到下标4截取形成新数组
var arr1 = arr.slice(-2, -1); //  将数组从倒数第2位开始到倒数第1位截取形成新数组

indexOf

var arr = [1, 2, 3, 4, 5];
arr.indexOf(); // 在数组中查找元素,返回查找到元素的下标,没有找到返回-1
console.log(arr.indexOf(2)); // 从0开始向后查找2
console.log(arr.indexOf(2, 3)); // 从下标3开始向后查找2

lastIndexOf

var arr = [1, 2, 3, 4, 5];
arr.lastIndexOf(); // 在数组中从后向前查找元素,返回查找到元素的下标,没有找到返回-1
console.log(arr.lastIndexOf(2)); // 从后向前查找2
console.log(arr.lastIndexOf(2, 3)); // 从下标3开始向前查找2

reverse

var arr = [1, 2, 6, 4, 3, 5];
// 将原数组倒序改变,返回的新数组和原数组是引用关系
var arr1 = arr.reverse();
console.log(arr, arr === arr1); // 输出: [5, 3, 4, 6, 2, 1] true

sort

var arr = [1, 12, 6, 4, 3, 5];
// 将原数组中的元素按位排序,原数组发生改变,返回的新数组和原数组是引用关系
var arr1 = arr.sort();
console.log(arr, arr === arr1); // 输出: [1, 12, 3, 4, 5, 6] true
// sort(function(pre, next){}); 可以实现升序降序排列
// 升序排序 输出:[1, 3, 4, 5, 6, 12]
arr.sort(function(pre, next) {return pre - next; 
});
// 降序排序 输出:[12, 6, 5, 4, 3, 1]
arr.sort(function(pre, next) {return next-pre;
});

some

判断数组中的所有元素是否满足某条件,只要有一个满足条件返回true, 否则返回false

var arr = [1, 3, 5, 2, 7, 8, 0, 6]
var boolean = arr.some(function(t) {t ++;return t > 5;
})
console.log(boolean); // 输出: true

every

判断数组中的所有元素是否满足某条件,只有当全部满足返回true,否则返回false

var arr = [1, 3, 5, 2, 7, 8, 0, 6]
var boolean = arr.every(function(t) {t ++;return t > 5;
})
console.log(boolean); // 输出: false

filter

判断数组中的所有元素是否满足某条件,并返回满足条件的所有元素组成的新数组,原数组元素不变

var arr = [1, 3, 5, 2, 7, 8, 0, 6]
var arr1 = arr.filter(function(t) {t ++;return t > 5;
})
console.log(arr1); // 输出: [5, 7, 8, 6]

reduce

// 如果没有initValue值,sum就是第0项的值,item就是第一项值,所以index是从1开始
var s = arr.reduce(function(sum, item, index)) {console.log(sum, item, index);return sum + item;
}, initValue); // 这里第二个参数是初始值,如果设置这个初始值,index就从0开始

from

var div = document.getElementsByTagName('div');
// es5:将对象转换成数组
var arr = Array.prototype.slice.call(div); 
// es6: 将对象转换成数组
var arr = Array.from(div);

参数数组

  • 在函数中,参数如果写在所有参数的最前面,那就是必要参数
  • es5中所有的参数一般都需要按位填写,如果没有填写,就会变成undefined
  • 多填进入的参数值不会被直接获取到
  • 如果一个函数的参数不定,我们一般在函数定义时不写参数,在函数体中使用参数数组arguments进行处理

arguments典型案例

// 1. 求若干数的最大值
function max() {var arr = Array.from(arguments);return arr.reduce(function(p1, p2){return p1 > p2 ? p1 : p2;});
}
console.log(max(1, 2, 3, 6, 3, 2, 6, 8, 9)); // 输出:9// 2.函数回调
function fn() {console.log(arguments.callee); // 获取当前执行的函数console.log(arguments.callee.a); // 获取属性值console.log(arguments.callee.caller); // 回调当前函数的父级函数
}
fn.a = 10; // 给对象添加属性
fn(2, 3, 4); // 执行函数
function fn2(fn) {fn();
}
fn2(fn); // 执行父级函数

二维数组

var arr = [[1, 2, 3, 4, 5],[1, 2, 3, 4, 5],[1, 2, 3, 4, 5],[1, 2, 3, 4, 5],[1, 2, 3, 4, 5],
]

对象数组

var arr = [{a: 1, b: 2, c: 3},{a: 1, b: 2, c: 3},{a: 1, b: 2, c: 3},
]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/249118.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一道Python面试题

无意间&#xff0c;看到这么一道Python面试题&#xff1a;以下代码将输出什么&#xff1f; def testFun(): temp [lambda x : i*x for i in range(4)] return temp for everyLambda in testFun(): print (everyLambda(2))脑中默默一想&#xff0c;这还用说么&#xff0c;肯定是…

Windows下的ssh姐妹花 Xshell 和 Xftp

Windows下的ssh姐妹花 Xshell 和 Xftp 今天是3月8号&#xff0c;中国传统的三八妇女节&#xff0c;是距离中国新兴节日三七女生&#xff08;神&#xff09;节最近的一个全国性节日&#xff0c;今天我也是宅在家&#xff0c;研究了一下近日工作上遇到的一个纯软件技术问题。废话…

关于数字证书理解的简单整理以及12306站点证书简单分析

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/sundacheng1989/article/details/25540601 首先简单理解一下什么是数字证书。这里是一篇英文文档&#xff0c;描写叙述的非常形象。形象的描写叙述了什么是公钥。什么是私钥。…

Mac中安装Node和版本控制工具nvm遇到的坑

首先说说常规的安装 1. 下载nvm,使用nvm来管理Node版本 官方文档 windows 版本  https://github.com/coreybutler/nvm-windows mac 版本    https://github.com/creationix/nvm#install-script 命令行 尽量不要用brew&#xff0c;免得掉坑 curl -o- https://raw.githubu…

wepy - 与原生有什么不同(x.wpy)使用实例

源码 1 <template>2 <view classmark wx:if"{{showMark}}">3 <view animation"{{animationData}}" class"animCat">4 <image src"http://osk1hpe2y.bkt.clouddn.com/18-5-30/34559443.jpg"></…

CSS实现div梯形分割

原理 使用的border边框属性结合svg 转换 详见代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>css实现div边框斜角</title><style type"text/css"> .labels {display: i…

算法学习——决策单调性优化DP

update in 2019.1.21 优化了一下文中年代久远的代码 的格式…… 什么是决策单调性&#xff1f; 在满足决策单调性的情况下&#xff0c;通常决策点会形如1111112222224444445555588888..... 即不可能会出现后面点的决策点小于前面点的决策点这种情况。 那么这个性质应该如何使用…

SVG画一个箭头

参考菜鸟手册&#xff1a; https://www.runoob.com/svg/svg-tutorial.html 打开菜鸟中的在线工具 在可视化截图拖拉元素绘制箭头 点击command U 查看源码 将源码拷入html代码中&#xff0c;查看效果 最后&#xff0c;贴出源码供大家参考 <!DOCTYPE html> <…

数字签名与HTTPS详解

因为HTTP协议本身存在着明文传输、不能很好的验证通信方的身份和无法验证报文的完整性等一些安全方面的确点&#xff0c;所以才有了HTTPS的缺陷。HTTPS确切的的说不是一种协议&#xff0c;而是HTTP SSL (TSL)的结合体。HTTP报文经过SSL层加密后交付给TCP层进行传输。SSL(安全套…

WPF效果(GIS三维续篇)

去年这个时候简单的摸索了一下三维的GIS相关的东西,也就是仅仅玩耍了一把,这次来点真正用的上的干货效果效果&#xff1a; 1、加载自定义百度样式的瓦片效果 2、加载自定义百度样式的缩放效果 3、快速手动进去咱的大帝都 4、加载海量Mark效果 5、加载海量Mark和简单模型效果 6、…

[19/04/23-星期二] GOF23_创建型模式(工厂模式、抽象工厂模式)

一、工厂模式(分为&#xff1a;简单工厂模式、工厂方法模式、抽象工厂模式) 实现了创建者和调用者的分离 核心本质&#xff1a;1、实例化对象&#xff0c;用工厂方法代替new操作&#xff1b;2、将选择实现类、创建对象统一管理和控制&#xff0c;从而将调用者跟实现类解耦。 简…

Chrome浏览器12px问题-webkit-text-size-adjust: none 已失效的解决方案

对于早期的chrome, 如果要想显示12px以下的字体&#xff0c;一般通用的方案都是在对应的元素中添加 div {-webkit-text-size-adjust: none; }但是我今天遇到的需求&#xff0c;添加了之后没有反应&#xff0c;而且浏览就根本不支持这种写法。 在网上看到了博客《Chrome浏览器…

深入理解vue中的slot与slot-scope

写在前面 vue中关于插槽的文档说明很短&#xff0c;语言又写的很凝练&#xff0c;再加上其和methods&#xff0c;data&#xff0c;computed等常用选项在使用频率、使用先后上的差别&#xff0c;这就有可能造成初次接触插槽的开发者容易产生“算了吧&#xff0c;回头再学&#…

关于Java抽象类,接口与实现接口及派生类继承基类

1. 抽象类 抽象类就是有一个或多个方法只被声明而未被实现。 抽象方法的声明以分号结束&#xff0c;并且用关键字abstract来说明它以标识它为抽象方法。 格式&#xff1a; public abstract class 类名{ 定义变量// 抽象方法// } 2. 接口是抽象类的一种&#xff0c;之包含常量…

Luogu P1471 方差

题目传送门 开了十倍空间才过是什么鬼&#xff1f;该不会我线段树炸了吧……细思极恐 平均数都会求&#xff0c;维护区间和&#xff0c;到时候除一下就好了。 方差的求法如下(用的Luogu的图片) 因为要维护一个平方&#xff0c;我们可以考虑使用van♂完全平方公式将它拆开&#…

Android SDK 2.3/3.0/4.0/4.2 下载与安装教程

Eclipse下搭建Android开发环境教程&#xff1a;http://dev.son1c.com/show/1253.html Google已经发布了Android SDK 4.2版本.下面给朋友们介绍一下安装 Android 模拟器 Emulator模拟器的方法: 1、首先确定安装了Java JDK&#xff0c;如果没有&#xff0c;可以去http://www.ora…

浏览器渲染原理与过程

一、浏览器如何渲染网页 要了解浏览器渲染页面的过程&#xff0c;首先得知道一个名词——关键路径渲染。关键渲染路径&#xff08;Critical Rendering Path&#xff09;是指与当前用户操作有关的内容。例如用户在浏览器中打开一个页面&#xff0c;其中页面所显示的东西就是当前…

深入理解CSS盒模型 - 程序猿的程 - 博客园

深入理解CSS盒模型 本文是学习中传思客在慕课网开的课程《前端跳槽面试必备技巧》的学习笔记。课程地址&#xff1a;https://coding.imooc.com/class/evaluation/129.html#Anchor。 如果你在面试的时候面试官让你谈谈对盒模型的理解&#xff0c;你是不是不知从何谈起。这种看似…

线程死锁问题

1 package com.demo.bingfa;2 3 /**4 * java并发编程中&#xff0c;死锁的概念5 *6 * 我们启用了两个线程&#xff0c;分别抢占2个资源&#xff0c;但这两个资源又分别被不同的对象&#xff08;字符串&#xff09;锁住了。7 * 当第一个线程调用 resource1 方法&#xff0c;…

使用PM2搭建在线vue.js开发环境(以守护进程方式热启动)

项目以vue.jslayUI的作为前端开发技术栈&#xff0c;需要有一个在线的环境供项目成员实时查看效果&#xff0c;总不能每次都webpack打包发布后才能看到效果吧&#xff01;刚开始就简单使用npm run dev命令热启动&#xff0c;但是shell命令窗口退出后&#xff0c;热启动也就失效…