结尾
学习html5、css、javascript这些基础知识,学习的渠道很多,就不多说了,例如,一些其他的优秀博客。但是本人觉得看书也很必要,可以节省很多时间,常见的javascript的书,例如:javascript的高级程序设计,是每位前端工程师必不可少的一本书,边看边用,了解js的一些基本知识,基本上很全面了,如果有时间可以读一些,js性能相关的书籍,以及设计者模式,在实践中都会用的到。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
高级程序设计,是每位前端工程师必不可少的一本书,边看边用,了解js的一些基本知识,基本上很全面了,如果有时间可以读一些,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中都是可以任意调用的,因为这些变量都是全局变量
局部变量
-
所谓局部变量就是在函数中使用var定义的变量
-
函数中的定义的局部变量是有作用域的,他的范围仅限于该函数内部,函数运行完成后,函数内定义的变量将会自动销毁
var s;
function fn() {
var c = 10; // 这是局部变量
c += 3;
console.log©; // 输出: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); // 输出:40
console.log(window.s); // 输出:20
}
fn();
典型例子
var s = 10;
function fn() {
console.log(s); // 输出:undefined
s += 20;
console.log(s); // 输出:NaN 因为是 undefined += 10
var s = 20; // 函数内一旦定义,在其前后调用都为布局变量
}
fn();
参数
定义
由于js是一种弱类型语言,在使用参数时需要注意以下两点
-
参数类型:因为参数类型不能固定,如果是对外开放的函数参数,一定需要在代码中判断输入参数的类型
-
初始化:在ES5中函数的参数不能设置初始化值,所以需要在执行代码时给他自定义一个默认的初始值;而在ES6中是可有初始化参数设置,直接可以使用,比如
function(a, b, type='+')
,参数type默认是"+"
实参和形参
对象参数
如果参数为对象,传入的是引用对象的地址
function fn(o) {
var obj = {a: 1};
console.log(o === obj); // false
console.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的
应用场景
- 返回一个数据
function createObj(_a) {
return {a: _a}; // 返回一个数据对象
}
console.log(createObj(3) === createObj(3)); // 输出:false
- 工厂模式或者单例模式
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
- 通过参数传入的对象
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}
- 如果参数一个函数,返回的是回调函数的结果
function fn1(fn) {
var obj = {};
return fn(obj); // 返回回调函数的结果
}
function fn2(obj) {
obj.a = 10;
return obj;
}
console.log(fn1(fn2)); // 输出:{a: 10}
- 返回的是一个私密的对象 (闭包)
function fn() {
return function () {
console.log(‘aaa’);
}
}
fn()(); // 输出: aaa
-
返回一个数组,返回多个元素
-
返回一个对象,返回多个元素
-
返回一个函数体
-
跳出
定义
-
数据将无序的数据做有序的排列,存储在一个变量中
-
原生JS中没有数组类型,原生JS中的数据可以存储多个不同类型的数据(弱类型)
-
Array.isArray(arr) 是判断arr是否为数组
-
数组中,标识元素所在的位置,叫做下标,也叫做索引
-
数组中,标识元素的内容,arr[0]这个就叫做下标变量
数组的创建
- 字面量创建
var arr = [1, 2, 3, 4, 5]
- 对象构造函数创建
var arr = new Object([1, 2, 3, 4, 5])
- 构造函数创建
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
数组的遍历
- 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
}
- 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
}
- forEach遍历
forEach遍历当前数组,没有返回值,不会返回新数组
var arr = [1, 2, 3, 4, 5];
arr.forEach(function(t, i, arr)) {// 参数为:元素值,元素下标,数组对象
console.log(t, i, arr)
})
- map遍历
map遍历数组,将当前数组中的元素返回给新数组,不适用return时,新数组的长度与原数组相同,但是每个元素都是undefined
var arr = [1, 2, 3, 4, 5];
arr = arr.map(function (t) {
if (t % 2 === 0) { // 数组元素中偶数元素 + 1
return 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+1
var 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<j
min = 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(‘’)); // 元素紧密相连
学习笔记
主要内容包括html,css,html5,css3,JavaScript,正则表达式,函数,BOM,DOM,jQuery,AJAX,vue等等
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
HTML/CSS
**HTML:**HTML基本结构,标签属性,事件属性,文本标签,多媒体标签,列表 / 表格 / 表单标签,其他语义化标签,网页结构,模块划分
**CSS:**CSS代码语法,CSS 放置位置,CSS的继承,选择器的种类/优先级,背景样式,字体样式,文本属性,基本样式,样式重置,盒模型样式,浮动float,定位position,浏览器默认样式
HTML5 /CSS3
**HTML5:**HTML5 的优势,HTML5 废弃元素,HTML5 新增元素,HTML5 表单相关元素和属性
**CSS3:**CSS3 新增选择器,CSS3 新增属性,新增变形动画属性,3D变形属性,CSS3 的过渡属性,CSS3 的动画属性,CSS3 新增多列属性,CSS3新增单位,弹性盒模型
JavaScript
**JavaScript:**JavaScript基础,JavaScript数据类型,算术运算,强制转换,赋值运算,关系运算,逻辑运算,三元运算,分支循环,switch,while,do-while,for,break,continue,数组,数组方法,二维数组,字符串
sole.log(arr.join(‘#’)); // 设置一个符号,用这个符号链接数组的每一个元素,形成一个新字符串
console.log(arr.join(‘’)); // 元素紧密相连
学习笔记
主要内容包括html,css,html5,css3,JavaScript,正则表达式,函数,BOM,DOM,jQuery,AJAX,vue等等
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
HTML/CSS
**HTML:**HTML基本结构,标签属性,事件属性,文本标签,多媒体标签,列表 / 表格 / 表单标签,其他语义化标签,网页结构,模块划分
**CSS:**CSS代码语法,CSS 放置位置,CSS的继承,选择器的种类/优先级,背景样式,字体样式,文本属性,基本样式,样式重置,盒模型样式,浮动float,定位position,浏览器默认样式
[外链图片转存中…(img-S8bkAAuc-1715247194326)]
HTML5 /CSS3
**HTML5:**HTML5 的优势,HTML5 废弃元素,HTML5 新增元素,HTML5 表单相关元素和属性
**CSS3:**CSS3 新增选择器,CSS3 新增属性,新增变形动画属性,3D变形属性,CSS3 的过渡属性,CSS3 的动画属性,CSS3 新增多列属性,CSS3新增单位,弹性盒模型
[外链图片转存中…(img-f4ayHJDd-1715247194327)]
JavaScript
**JavaScript:**JavaScript基础,JavaScript数据类型,算术运算,强制转换,赋值运算,关系运算,逻辑运算,三元运算,分支循环,switch,while,do-while,for,break,continue,数组,数组方法,二维数组,字符串
[外链图片转存中…(img-YLYftFQ4-1715247194328)]