| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> JavaScript知识库 -> JavaScript基础语法笔记 -> 正文阅读 |
|
[JavaScript知识库]JavaScript基础语法笔记 |
编程语言编程
计算机语言
编程语言
翻译器
解释型语言和编译型语言
类似于请客吃饭:
编程语言和标记语言区别
计算机基础计算机组成数据存储
数据存储单位
程序运行
初识 JavaScript
JavaScript 的作用
HTML/CSS/JS 的关系
浏览器执行JS简介浏览器分成两部分:渲染引擎和 JS 引擎
JavaScript 包括 ECMAScript、DOM、BOM ECMAScript — JavaScript语法
DOM — 文档对象模型文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标记语言的标准编程接口。通过 DOM 提供的接口可以对页面上的各种元素进行操作(大小、位置、颜色等) BOM — 浏览器对象模型BOM (Browser Object Model,简称BOM) 是指浏览器对象模型,它提供了独立于内容的、可以与浏览器窗口进行互动的对象结构。通过BOM可以操作浏览器窗口,比如弹出框、控制浏览器跳转、获取分辨率等。 JS初体验行内式JS<input type="button" value="点我试试" onclink="javascript:alert('Hello World')" />
内嵌式JS<script> ? ? alert('Hello World!'); </script>
外部JS<script src="my.js"></script>
JavaScript注释单行注释// 我是一行文字,不想被JS引擎执行,所以注释起来
多行注释/* 获取用户年龄和姓名 并通过提示框显示出来 */
JavaScript 输入输出语句
变量
变量的使用声明变量var age; // 声明一个名称为age的变量
赋值age = 10; // 给age这个变量赋值为10
变量的初始化//声明变量同时赋值为18 var age = 18; 声明一个变量并赋值, 我们称之为变量的初始化 更新变量一个变量被重新复赋值后,它原有的值就会被覆盖,变量值将以最后一次赋的值为准。 var age = 18;age = 81; // 最后的结果就是81因为18被覆盖掉了 同时声明多个变量var age = 18, address ='火影村',salary = 15000; 同时声明多个变量时,只需要写一个 var, 多个变量名之间使用英文逗号隔开。 声明变量特殊情况
变量的命名规范
标识符、关键字、保留字标识符标识(zhi)符:就是指开发人员为变量、属性、函数、参数取的名字。不能是关键字或保留字。 关键字关键字:是指 JS本身已经使用了的字,不能再用它们充当变量名、方法名。
保留字保留字:实际上就是预留的“关键字”,意思是现在虽然还不是关键字,但是未来可能会成为关键字,同样不能使用它们当变量名或方法名。
数据类型在计算机中,不同的数据所需占用的存储空间是不同的,为了便于把数据分成所需内存大小不同的数据,充分利用存储空间,于是定义了不同的数据类型。
var age = 10; //这是一个数字型var areYouOk = '使得'; //这是一个字符串
var x = 6; //x为数字var x = "Bill"; //x为字符串 JS 把数据类型分为两类:
简单数据类型(基本数据类型)
数字型 NumberJavaScript 数字类型既可以用来保存整数值,也可以保存小数(浮点数) var age = 12; //整数var Age = 21.3747; //小数 数字型进制最常见的进制有二进制、八进制、十进制、十六进制。 // 1.八进制数字序列范围:0~7var num1 = 07; //对应十进制的7var Num2 = 019; //对应十进制的19var num3 = 08; //对应十进制的8// 2.十六进制数字序列范围:0~9以及A~Fvar num = 0xA;
数字型范围
alert(Number.MAX_VALUE); // 1.7976931348623157e+308alert(Number.MIN_VALUE); // 5e-324 数字型三个特殊值alert(Infinity); //Infinity(无穷大)alert(-Infinity); //-Infinity(无穷小)alert(NaN); //NaN - Not a Number ,代表任何一个非数值Number.MAX_VALUE * 2 = Infinity
isNaN()这个方法用来判断非数字,并且返回一个值,如果是数字返回的是false,如果不是数字返回的是true var userAge = 21;var isOk = isNan(userAge);console.log(isNum); //false,21不是一个非数字var userName = "andy";console.log(isNan(userName)); //true,"andy"是一个非数字 字符串型String字符串型可以是引号中的任意文本,其语法为 双引号 "" 和 单引号''
var strMsg = "我爱北京天安门~"; //使用双引号表示字符串var strMsg = '我爱北京'; //使用单引号表示字符串 字符串引号嵌套JS 可以用单引号嵌套双引号 ,或者用双引号嵌套单引号 (外双内单,外单内双) var strMsg ='我是一个“高富帅”' //可以用 ' ' 包含 " "var strMsg2 ="我是'高富帅'" //可以用" " 包含 '' 字符串转义符类似HTML里面的特殊字符,字符串中也有特殊字符,我们称之为转义符,都是 \ 开头的。
字符串长度字符串是由若干字符组成的,这些字符的数量就是字符串的长度。通过字符串的 length 属性可以获取整个字符串的长度。 var strMsg = "我是高富帅!";alert(strMsg.length); //显示6 字符串的拼接
//1 字符串相加alert('hello' + ' ' + 'World'); //hello World//2 数值字符串相加alert('100' + '100'); //100100//3 数值字符串+数值alert('12'+12); //1212//4 数值+数值alert(12+12); //24
字符串拼接加强
console.log('Pink老师' + 18); //只要有字符就会相连var age = 18;// console.log('Pink老师age岁了'); //这样不行,会输出 "Pink老师age岁了"console.log('Pink老师' + age); // Pink老师18console.log('Pink老师' + age + '岁啦'); // Pink老师18岁啦 '我今年18岁' → '我今年岁'(删数字) → '我今年''岁'(引引) → '我今年'++'岁'(加加) →'我今年'+18+'岁'(加变量) 布尔型 Boolean
var flag = true;console.log(flag + 1); // 2 true当加法来看当1来看,flase当0来看 Undefined 和 Null
var variable;console.log(variable); // undefinedconsole.log('你好' + variable); // 你好undefined(任意一个数据类型与字符串相连,得到字符串)console.log(11 + variable); // NaN(与数字相加,得NaN)console.log(true + variable); // NaN
var vari = null;console.log('你好' + vari); // 你好nullconsole.log(11 + vari); // 11console.log(true + vari); // 1 获取变量数据类型typeof 可用来获取检测变量的数据类型 var num = 18;console.log(typeof num) // 结果 number
字面量字面量是在源代码中一个固定值的表示法,通俗来说,就是字面量表示如何表达这个值,即一眼看上去就知道是哪个类型的值。
数据类型转换使用表单、prompt 获取过来的数据默认是字符串类型的,此时就不能直接简单的进行加法运算,而需要转换变量的数据类型。通俗来说,就是把一种数据类型的变量转换成另外一种数据类型。 我们通常会实现3种方式的转换:
转换为字符串型
//1.把数字型转换为字符串型 toString() 变量.toString()var num = 10;var str = num.toString();console.log(str);//2.强制转换console.log(String(num));//3.隐式转换console.log(num+''); 转换为数字型
// 1.parseInt()var age =prompt('请输入您的年龄');consolo.log(parseInt(age)); //数字型18consolo.log(parseInt('3.14')); //3取整consolo.log(parseInt('3.94')); //3,不会四舍五入consolo.log(parseInt('120px')); //120,会去掉单位pxconsole.log(parselnt('rem10px')); //NaN(不能开头就是字母)// 2.parseFloat()console.log(parseFloat('3.14')); //3.14consolo.log(parseFloat('120px')); //120,会去掉单位// 3.利用Number(变量)var str ='123';console.log(Number(str));console.log(Number('12')); // 4.利用了算术运算 - * / 隐式转换console.log('12'-0); // 12console.log('123' - '120'); //3console.log('123' * 1); // 123 转换为布尔型
console.log(Boolean('')); //falseconsole.log(Boolean(0)); //falseconsole.log(Boolean(NaN)); //falseconsole.log(Boolean(null)); //falseconsole.log(Boolean(undefined)); //falseconsole.log(Boolean('小白')); //trueconsole.log(Boolean(12)); //true 运算符运算符(operator)也被称为操作符,是用于实现赋值、比较和执行算数运算等功能的符号 JavaScript 中常用的运算符有:
算术运算符概念:算术运算使用的符号,用于执行两个变量或值的算术运算。
浮点数的精度问题浮点数值的最高精度是 17 位小数,但在进行算术计算时其精确度远远不如整数。所以不要直接判断两个浮点数是否相等
var result = 0.1 +0.2; //结果不是0.3,0.30000000000000004console.log(0.07 * 100); //结果不是7,而是7.000000000000001 0.1+0.2不等于0.3
表达式和返回值
递增和递减运算符如果需要反复给数字变量添加或减去1,可以使用递增(++)和递减( -- )运算符来完成。 放在变量前面时,我们称为前置递增(递减)运算符 放在变量后面时,我们称为后置递增(递减)运算符 注意:递增和递减运算符必须和变量配合使用。 前置递增运算符++num num = num + 1 使用口诀:先自加,后返回值 var num = 10;alert (++num + 10); // 21(先自加 10+1=11,返回11,此时num=11) 后置递增运算符num ++ num = num +1 使用口诀:先返回原值,后自加 var num = 10;alert(10 + num++); // 20alert(num); // 11
? ? ? ?var a = 10; ? ? ? ?++a; //11 ? ? ? var b = ++a + 2; //a=12,b=12+2=14 ? ? ? console.log(b); //14 ? ? ? var c = 10; ? ? ? c++; //c=11 ? ? ? var d = c++ + 2; //d=11+2=13;c=12 ? ? ? console.log(d); //13 ? ? ? var e = 10; ? ? ? var f = e++ + ++e; //1.先返回e++=10, 再输出e=11 ? 2.先返回e=12 再输出++e=12 ? ? ? console.log(f); //f =10+12=22 比较(关系)运算符比较运算符是两个数据进行比较时所使用的运算符,比较运算后,会返回一个布尔值(true / false)作为比较运算的结果。
= == === 小结
console.log(18 == '18'); //trueconsole.log(18 === '18'); //false 逻辑运算符逻辑运算符是用来进行布尔值运算的运算符,其返回值也是布尔值
var isOk = !true;console.log(isOk); // false 短路运算(逻辑中断)短路运算的原理:当有多个表达式(值)时,左边的表达式值可以确定结果时,就不再继续运算右边的表达式的值
console.log(123 || 456); //123console.log(0 || 456); //456console.log(123 || 456 || 789); //123//值参与逻辑比较,没有返回值,所以返回的是表达式本身 var num = 0;console.log(123 || num++);// 123 先返回在加,相当于 (123 || 0)console.log(num); // 0(num++没有被执行,在123那里就短路了,所以没有+1) 赋值运算符用来把数据赋值给变量的运算符
var age = 10;age += 5; // 相当于 age = age + 5;age -= 5; // 相当于 age = age - 5;age *= 10; // 相当于 age = age * 10; 运算符优先级
console.log( 4 >= 6 || '人' != '阿凡达' && !(12 * 2 == 144) && true) // f t truevar num = 10;console.log( 5 == num / 2 && (2 + 2 * num).toString() === ‘22’);// t t truevar a = 3 > 5 && 2 < 7 && 3 == 4; // fconsole.log(a); //false var b = 3 <= 4 || 3 > 1 || 3 != 2; // f tconsole.log(b); //truevar c = 2 === "2"; console.log(c); //falsevar d = !c || b && a ;// t console.log(d); //true 流程控制在一个程序执行的过程中,各条代码的执行顺序对程序的结果是有直接影响的。很多时候我们要通过控制代码的执行顺序来实现我们要完成的功能。 简单理解: 流程控制就是来控制我们的代码按照什么结构顺序来执行
顺序流程控制顺序结构是程序中最简单、最基本的流程控制,它没有特定的语法结构,程序会按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行的。 分支流程控制 - if 语句分支结构由上到下执行代码的过程中,根据不同的条件,执行不同的路径代码(执行代码多选一的过程),从而得到不同的结果 if 语句// 条件成立执行代码,否则什么也不做if (条件表达式) {// 条件成立执行的代码语句}
var usrAge = prompt('请输入您的年龄:');if(usrAge >= 18){ alert('您的年龄合法,欢迎来到网吧');} if else语句(双分支语句)// 条件成立,执行if里面代码,否则执行else里面的代码if(条件表达式) { //[如果]条件成立执行的代码} else { //[否则]执行的代码 }
if else if 语句(多分支语句)// 适合于检查多重条件。 if (条件表达式1) { 语句1; } else if (条件表达式2) { 语句2; } else if (条件表达式3) { 语句3; .... } else { // 上述条件都不成立执行此处代码 }
var score = prompt('请您输入分数:'); if (score >= 90) { alert('宝贝,你是我的骄傲'); } else if (score >= 80) { alert('宝贝,你已经很出色了'); } else if (score >= 70) { alert('你要继续加油喽'); } else if (score >= 60) { alert('孩子,你很危险'); } else { alert('可以再努力点吗,你很棒,但还不够棒'); } 三元表达式
分支流程控制 - switch 语句switch 语句也是多分支语句,它用于基于不同的条件来执行不同的代码。当要针对变量设置一系列的特定值的选项时,就可以使用 switch。 switch (表达式) { case value1: //表达式等于 value1 时要执行的代码 break; case value2: //表达式等于value2 时要执行的代码 break; default: //表达式不等于任何一个value时要执行的代码 }
var money = 100; var answer = prompt('请输入您要的操作:\n1.存钱\n2.取钱\n3.显示余额\n4.退出'); switch (answer) { case '1': var add= parseFloat(prompt('请输入存钱金额')); money += add; alert('存钱成功!您的余额是' + money); break; case '2': var reduce = parseFloat(prompt('请输入取钱金额')); if (reduce > money) { alert('余额不足'); } else { money -= reduce; alert('取钱成功!您的余额是' + money); } break; case '3': alert('您的余额是' + money); break; case '4': break; default: alert('欢迎下次再来'); } switch 语句和 if else if 语句的区别
断点调试断点调试是指自己在程序的某一行设置一个断点,调试时,程序运行到这一行就会停住,然后你可以一步一步往下调试,调试过程中可以看各个变量当前的值,出错的话,调试到出错的代码行即显示错误,停下。
循环 - for循环
for(初始化变量; 条件表达式; 操作表达式 ){ //循环体 }
var number = parseInt(prompt('请输入班级的总人数:'));//这里也能不转换,因为下面<=有隐式转换 var sum = 0; var average = 0; for (var i = 1; i <= number; i++) { sum += parseFloat(prompt('请输入第' + i + '个学生的成绩'));//必须转换,不然会变成字符串 } average = sum / number; alert('该班级共有'+ number +'人,总成绩为'+sum+'分,平均成绩为'+average+'分'); 循环 - 双重 for 循环循环嵌套是指在一个循环语句中再定义一个循环语句的语法结构,例如在for循环语句中,可以再嵌套一个for 循环,这样的 for 循环语句我们称之为双重for循环 for (外循环的初始; 外循环的条件; 外循环的操作表达式) { for (内循环的初始; 内循环的条件; 内循环的操作表达式) { 需执行的代码; } }
打印正三角形
var str = '' var row = prompt('请输入您打印几行星星:'); var col = prompt('请输入您打印几列星星:'); var str = ''; for (var i = 1; i <= row; i++) { for (j = 1; j <= i; j++) { str += '☆'; } str += '\n'; } console.log(str); 打印倒三角形var row = prompt('请输入您打印几行星星:'); var col = prompt('请输入您打印几列星星:'); var str = ''; for (var i = 1; i <= row; i++) { for (j = 1; j <= col; j++) { str += '☆'; } str += '\n'; } console.log(str); 打印九九乘法表
var str = '' for (var i = 1; i <= 9; i++) { // 外层for控制 行数 9行 for (var j = 1; j <= i; j++) { // j 控制列数 列数和行数是一样的 j <= i str += j + " × " + i + " = " + i * j + '\t'; } str += '\n'; } console.log(str); 循环 - while循环while 语句可以在条件表达式为真的前提下,循环执行指定的一段代码,直到表达式不为真时结束循环 while(条件表达式){ //循环体代码 }
var message = prompt('你爱我吗?'); while (message !== '我爱你') { message = prompt('你爱我吗?'); } alert('我也爱你'); 循环 - do while 循环do... while 语句其实是 while 语句的一个变体。该循环会先执行一次代码块,然后对条件表达式进行判断,如果条件为真,就会重复执行循环体,否则退出循环。 do { //循环体代码-条件表达式为true的时候重复执行循环一代码 } while(条件表达式); 执行思路:
案例:弹出一个提示框, 你爱我吗? 如果输入我爱你,就提示结束,否则,一直询问 do { var love = prompt('你爱我吗?'); } while (love != '我爱你'); alert('登录成功'); continue 关键字continue 关键字用于立即跳出本次循环,继续下一次循环(本次循环体中 continue 之后的代码就会少执行一次)。 例如,吃5个包子,第3个有虫子,就扔掉第3个,继续吃第4个第5个包子 for (var i = 1; i <= 5; i++) { if (i == 3) { ? ? console.log('这个包子有虫子,扔掉'); ? ? continue; // 跳出本次循环,跳出的是第3次循环 } ?console.log('我正在吃第' + i + '个包子呢'); } break 关键字break 关键字用于立即跳出整个循环 例如,吃5个包子,吃到第3个发现里面有半个虫子,其余的也不吃了 for (var i = 1; i <= 5; i++) { if (i == 3) { break; // 直接退出整个for 循环,跳到整个for下面的语句 } console.log('我正在吃第' + i + '个包子呢'); } JavaScript 命名规范以及语法格式
数组数组(Array)是指一组数据的集合,其中的每个数据被称作元素,在数组中可以存放任意类型的元素。数组是一种将一组数据存储在单个变量名下的优雅方式。 //普通变量一次只能存储一个值 var num = 10; //数组一次可以存储多个值 var arr =[1,2,3,4,5]; 创建数组JavaScript 中创建数组有两种方式:
利用 new 创建数组var 数组名 = new Array(); var arr = new Array(); //创建一个新的空数组 利用数组字面量创建数组// 1.利用数组字面量方式创建空的数组 var 数组名 =[]; // 2.使用数组字面量方式创建带初始值的数组 var 数组名 =['小白','小黑','小黄','瑞奇']; // 3.数组中可以存放任意类型的数据,例如字符串,数字,布尔值等 var arrStus =['小白',12,true,28.9];
数组的索引索引 (下标) :用来访问数组元素的序号(数组下标从 0 开始) 数组可以通过索引来访问、设置、修改对应的数组元素,我们可以通过“数组名[索引]”的形式来获取数组中的元素 //定义数组 var arrStus = [1,2,3]; //获取数组中的第2个元素 alert(arrStus[1]); //2 //如果没有这个元素,返回undefined console.log(arrStus[3]); // undefined 遍历数组遍历就是把数组中的每个元素从头到尾都访问一次,可以通过 for 循环索引遍历数组中的每一项 // for循环遍历数组 var arr = ['red','green', 'blue']; for (var i = 0; i < arr.length; i++){ console.log(arrStus[i]); } 数组的长度使用“数组名.length”可以访问数组元素的数量(数组长度) var arrStus = [1,2,3]; alert(arrStus.length); ?// 3
var arr = ['red', 'green', 'blue', 'pink']; var str = ''; var separator = '|' for (var i = 0; i < arr.length; i++) { str += arr[i] + separator; } console.log(str); 数组中新增元素
var arr = ['red', 'green', 'blue', 'pink']; arr.length = 7; console.log(arr); console.log(arr[4]); console.log(arr[5]); console.log(arr[6]); // 其中索引号是 4,5,6 的空间没有给值,就是声明变量未给值,默认值就是 undefined
var arr = ['red', 'green', 'blue', 'pink']; arr[4] = 'hotpink'; console.log(arr); // ['red', 'green', 'blue', 'pink', 'hotpink']
// 方法一 var arr = [2, 0, 6, 1, 77, 0, 52, 0, 25, 7]; var newArr = []; // 定义一个变量 用来计算 新数组的索引号 var j = 0; for (var i = 0; i < arr.length; i++) { if (arr[i] >= 10) { // 给新数组 newArr[j] = arr[i]; // 索引号 不断自加 j++; } } console.log(newArr); // 方法二 var arr = [2, 0, 6, 1, 77, 0, 52, 0, 25, 7]; var newArr = []; for (var i = 0; i < arr.length; i++) { if (arr[i] >= 10) { // 给新数组 newArr[newArr.length] = arr[i]; } } console.log(newArr); 删除指定数组元素
var arr = [2, 0, 6, 1, 77, 0, 52, 0, 25, 7]; var newArr = []; // 空数组的默认的长度为 0 // 定义一个变量 i 用来计算新数组的索引号 for (var i = 0; i < arr.length; i++) { // 找出不等于0 的数 if (arr[i] != 0) { // 给新数组 // 每次存入一个值,newArr长度都会 +1 newArr[newArr.length] = arr[i]; } } console.log(newArr); 函数函数就是封装了一段可被重复调用执行的代码块。通过此代码块可以实现大量代码的重复使用。 函数的使用声明函数// 声明函数 function 函数名() { //函数体代码 }
调用函数//调用函数 函数名(); //通过调用函数名来执行函数体代码
函数的封装
函数的参数形参和实参在声明函数时,可以在函数名称后面的小括号中添加一些参数,这些参数被称为形参,而在调用该函数时,同样也需要传递相应的参数,这些参数被称为实参。
参数的作用 : 在函数内部某些值不能固定,我们可以通过参数在调用函数时传递不同的值进去 // 带参数的函数声明 function 函数名(形参1, 形参2 , 形参3...) { // 可以定义任意多的参数,用逗号分隔 // 函数体 } // 带参数的函数调用 函数名(实参1, 实参2, 实参3...); 函数参数的传递过程// 声明函数 function getSum(num1, num2) { console.log(num1 + num2); } // 调用函数 getSum(1, 3); // 4 getSum(6, 5); // 11
形参和实参个数不匹配
function sum(num1, num2) { console.log(num1 + num2); } sum(100, 200); // 形参和实参个数相等,输出正确结果 sum(100, 400, 500, 700); // 实参个数多于形参,只取到形参的个数 sum(200); // 实参个数少于形参,多的形参定义为undefined,结果为NaN 注意:在JavaScript中,形参的默认值是undefined
函数的返回值return语句函数只是实现某种功能,有的时候,我们会希望函数将值返回给调用者,此时通过使用 return 语句就可以实现,即调用函数后给我们什么东西 // 声明函数 function 函数名() { ... return 需要返回的值; } // 调用函数 函数名(); // 此时调用函数就可以得到函数体内return 后面的值
function getMaxFromArr(numArray) { var maxNum = 0; for (var i = 0; i < numArray.length; i++) { if (numArray[i] > maxNum) { maxNum = numArray[i]; } } return maxNum; } var arrNum = [5, 2, 99, 101, 67, 77]; var maxN = getMaxFromArr(arrNum); // 传进去的是数组,接收的实参也要是数组 alert('最大值为:' + maxN); return 终止函数return 语句之后的代码不被执行 function add(num1, num2) { return num1 + num2; // return 后的代码不执行 alert('我不会被执行,因为前面有 return'); } var resNum = add(21, 6); // 调用函数,传入两个实参,并通过 resNum 接收函数返回值 alert(resNum); // 27 return 的返回值return只能返回一个值。如果用逗号隔开多个值,以最后一个为准 function add(num1,num2){ return num1,num2; } var resNum = add(21,6); alert(resNum); // 6
// 求任意两个数的加减乘除 var a = parseFloat(prompt('请输入第一个数')); var b = parseFloat(prompt('请输入第二个数')); function count(a, b) { var arr = [a + b, a - b, a * b, a / b]; return arr; } var result = count(a, b); console.log(result); break ,continue ,return 的区别
arguments当我们不确定有多少个参数传递的时候,可以用 arguments 来获取。在 JavaScript 中,arguments 实际上它是当前函数的一个内置对象。
function fn() { console.log(arguments); //里面存储了所有传递过来的实参 console.log(arrguments.length); // 3 console.log(arrguments[2]); // 3 } fn(1,2,3);
function maxValue() { var max = arguments[0]; for (var i = 1; i < arguments.length; i + +) { if (max < arguments[i]) { max = arguments[i]; } } return max; } console.log(maxValue(2, 4, 5, 9)); console.log(maxValue(12, 4, 9)); 函数可以调用另外一个函数因为每个函数都是独立的代码块,用于完成特殊任务,因此经常会用到函数相互调用的情况 function fn1() { console.log(111); // 1. 111 fn2(); console.log('fn1'); // 4. fn1 } function fn2() { console.log(222); // 2. 222 console.log('fn2'); // 3. fn2 } fn1(); 函数案例判断素数function ifSushu(num) { for (i = 2; i < num; i++) if (num % i == 0) { return '不是素数'; break; } return '是素数'; } var num1 = parseInt(prompt('请输入一个整数')); var str = ifSushu(num1); alert(num1 + str); 翻转数组function reverse(arr) { var newArr = []; for (var i = 0; i < arr.length ; i++) { newArr[i] = arr[arr.length-i-1]; } return newArr; } var arr1 = reverse([1, 3, 4, 6, 9]); console.log(arr1); 数组排序(冒泡排序)// 假设arr.length是5;5和4比,交换位置;5和3比,交换位置;5和2比,交换位置;5和1比,交换位置 var arr = [5, 4, 3, 2, 1]; for (var i = 1; i <= arr.length - 1; i++) { 外层循环管趟数,5个数共交换4趟,i=1,2,3,4 for (var j = 1; j <= arr.length - i - 1; j++) 里层循环管每一趟交换的次数,前一个和后面一个数组元素相比较 if (arr[j] > arr[j + 1]) { // 第一趟i=0 j=1,2,3,4 比较交换四次;第二趟i=1 j=0,1,2 比较交换三次,以此类推 var temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } console.log(arr); 判断闰年
function isRun(year) { var flag = false; if (year % 4 === 0 && year % 100 !== 0 || year % 400 === 0) { flag = true; } return flag; } console.log(isRun(2010)); console.log(isRun(2012)); // 三元表达式解法 function isRun(year) { var flag = year % 4 === 0 && year % 100 !== 0 || year % 400 === 0 ? true : false return flag; } 用户输入年份,输出当前年份2月份的天数function getDays(year) { if (isRun(year)==true) { return '29天'; } else { return '28天' } } function isRun(year) { var flag = false; if (year % 4 === 0 && year % 100 !== 0 || year % 400 === 0) { flag = true; } return flag; } var year1=parseInt(prompt('请输入一个年份')); var str=getDays(year1); alert(str); 函数的声明自定义函数方式(命名函数)利用函数关键字 function 自定义函数方式。 // 声明定义方式 function fn() {...} // 调用 fn();
函数表达式方式(匿名函数)// 这是函数表达式写法,匿名函数后面跟分号结束 var fn = function(){...}; // 调用的方式,函数调用必须写到函数体下面 fn();
var fun=function(aru){ console.log(aru); } fun('你好'); 作用域通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域,即代码名字(变量)在某个范围内起作用和效果。作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。 JavaScript (ES6前) 中的作用域有两种:
全局作用域作用于所有代码执行的环境(整个 script 标签内部)或者一个独立的 js 文件 局部作用域(函数作用域)作用于函数内的代码环境,只在函数内部起效果和作用,就是局部作用域。 因为跟函数有关系,所以也称为函数作用域 var num = 10; // 全局 console.log(num); // 10 function fn() { var num = 20; // 局部 console.log(num); // 20 } fn(); JS没有块级作用域
if(true){ int num = 123; System.out.println(num); // 123 } System.out.println(num); // 报错
if (true) { var num = 123; console.log(123); //123 } console.log(123); //123 变量的作用域在JavaScript中,根据作用域的不同,变量可以分为两种:
全局变量在全局作用域下声明的变量叫做全局变量(在函数外部定义的变量)
<script> var num = 10; console.log(num); // 10 function fn() { console.log(num); // 10 } fn(); <\script> 局部变量在局部作用域下声明的变量叫做局部变量(在函数内部定义的变量)
<script> function fn() { var num1 = 10; num2 = 20; // 没有声明 } fn(); console.log(num1); // num1 is not defined console.log(num2); // 20(在函数内不使用 var 声明的变量也是全局变量) <\script> 全局变量和局部变量的区别
作用域链
var num = 10; funtion fn() { //外部函数 var num = 20; function fun() { //内部函数 console.log(num); // 20 ,一级一级访问 } } function f1() { var num = 123; function f2() { console.log(num); // 123 } f2(); } var num = 456; f1(); var a = 1; function fn1() { var a = 2; var b = '22'; fn2(); function fn2() { var a = 3; fn3(); function fn3() { var a = 4; console.log(a); //4 console.log(b); //22 } } } fn1(); // 先看函数是否都调用 预解析JavaScript 代码是由浏览器中的 JavaScript 解析器来执行的。JavaScript 解析器在运行 JavaScript 代码的时候分为两步:预解析和代码执行
预解析只会发生在通过 var 定义的变量和 function 上。学习预解析能够让我们知道为什么在变量声明之前访问变量的值是undefined,为什么在函数声明之前就可以调用函数。 变量预解析(变量提升)变量预解析也叫做变量提升、函数提升 变量提升: 变量的声明会被提升到当前作用域的最上面,变量的赋值不会提升 console.log(num); // 结果是多少? var num = 10; // undefined //相当于执行了以下代码 var num; // 变量声明提升到当前作用域最上面 console.log(num); num = 10; // 变量的赋值不会提升 函数预解析(函数提升)函数提升: 函数的声明会被提升到当前作用域的最上面,但是不会调用函数。 fn(); //11 function fn() { console.log('11'); } 解决函数表达式声明调用问题函数表达式的调用必须写在函数下面 // 匿名函数(函数表达式方式):若我们把函数调用放在函数声明上面 fn(); var fn = function() { console.log('22'); // 报错 } //相当于执行了以下代码 var fn; fn(); //fn声明了但没赋值,报错 fn = function() { console.log('22'); //报错 } 预解析练习console.log(a); // function a() {return false;} var a = 1; console.log(a); // 1 function a() { return false; } // 相当于执行了 var a; function a() { return false; } console.log(a); a = 1; console.log(a); var num = 10; fun(); function fun() { console.log(num); //10 var num = 20; } //相当于执行了 var num; function fun() { var num; console.log(num); num = 20; } num = 10; fun(); var num = 10; function fn() { console.log(num); // undefined var num = 20; console.log(num); // 20 } fn(); //相当于执行了 var num; function fn() { var num; console.log(num); num = 20; console.log(num); } num = 10; fn(); var a = 18; f1(); function f1() { var b = 9; console.log(a); // undefined console.log(b); // 9 var a = '123'; } //相当于执行了 var a; function f1() { var b; var a; b = 9; console.log(a); console.log(b); a = '123'; } a = 18; f1(); f1(); console.log(c); // 9 console.log(b); // 9 console.log(a); // 9 function f1() { var a = b = c = 9; // 相当于var a = 9; b = 9; c = 9;(b和c没有var声明,直接赋值,当做全局变量看) //var a = 9, b = 9, c = 9;才相当于var a, var b, var c, a = 9,b = 9, c = 9; console.log(a); // 9(全局变量) console.log(b); // 9(全局变量) console.log(c); // 报错(a是局部变量) } //相当于执行了 function f1() { var a; a = b = c = 9; console.log(a); console.log(b); console.log(c); } f1(); console.log(c); console.log(b); console.log(a); 对象在 JavaScript 中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串、数值、数组、函数等。 对象是由属性和方法组成的:
创建对象在 JavaScript 中,现阶段我们可以采用三种方式创建对象(object):
利用字面量创建对象对象字面量:就是花括号
var star = { name : 'pink', age : 18, sex : '男', sayHi : function(){ alert('大家好啊~'); } }; 利用 new Object 创建对象跟之前的
var obj = new Object(); //创建了一个空的对象 obj.name = '张三丰'; obj.age = 18; obj.sex = '男'; obj.sayHi = function() { console.log('hi~'); } //调用 console.log(obj.uname); console.log(obj['sex']); obj.sayHi(); 利用构造函数创建对象为什么需要使用构造函数?因为前面两种创建对象的方式一次只能创建一个对象 构造函数 :是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与 new 运算符一起使用。我们可以把对象中一些公共的属性和方法抽取出来,然后封装到这个函数里面。 在 js 中,使用构造函数要时要注意以下两点:
//构造函数的语法格式 function 构造函数名() { this.属性 = 值; // 指定当前的这一个 this.方法 = function() {} } new 构造函数名(); function Star(uname,age,sex) { this.name = uname; this.age = age; this.sex = sex; this.sing = function(sang){ console.log(sang); } } var ldh = new Star('刘德华',18,'男'); //用构造函数创建了一个对象 console.log(typeof ldh) // object对象(调用函数返回的是对象) console.log(ldh.name); console.log(ldh['sex']); ldh.sing('冰雨'); // 把冰雨传给了sang var zxy = new Star('张学友',19,'男'); 构造函数和对象
new关键字 new 在执行时会做四件事:
遍历对象的属性
for(变量 in 对象名字){ // 在此执行代码 } 语法中的变量是自定义的,它需要符合命名规范,通常我们会将这个变量写为 k 或者 key for(var k in obj) { console.log(k); //这里的 k 是属性名,Console得到的是所有的属性名 console.log(obj[k]);//这里的 obj[k] 是属性值,Console得到的是所有的属性值 } 对象的调用
console.log(star.name) // 调用名字属性 console.log(star['name']) // 调用名字属性 star.sayHi(); // 调用sayHi方法,注意带括号 // 有一个对象 来判断是否有该属性 对象['属性名'] var o = { age: 18 } if (o['sex']) { console.log('里面有该属性'); } else { console.log('没有该属性'); } 变量、属性、函数、方法总结
内置对象
Math对象Math 对象不是构造函数(不需要new来调用,直接使用里面的属性和方法即可),它具有数学常数和函数的属性和方法。跟数学相关的运算(求绝对值,取整、最大值等)可以使用 Math 中的成员。 Math.PI // 圆周率 Math.floor() // 向下取整,如Math.floor(1.9)返回1 Math.ceil() // 向上取整,如Math.ceil(1.1)返回2 Math.round() // 四舍五入版,就近取整;-3.5的结果是-3 (0.5往大了取) Math.abs() // 绝对值(隐式转换:Math.abs('-1')返回1;Math.abs('你好')返回NaN) Math.max()/Math.min() // 求最大和最小值(如果里面有非数字,返回NaN;如果没有参数,Math.max()返回-infinity) 注意:上面的方法必须带括号 // 利用对象封装自己的数学对象,里面有PI、最大值和最小值 var Mymath = { PI: 3.1415926535, max: function() { var max = arguments[0]; for (i = 1; i < arguments.length; i++) { if (arguments[i] > max) { max = arguments[i]; } } return max; }, min: function() { var min = arguments[0]; for (i = 1; i < arguments.length; i++) { if (arguments[i] < min) { min = arguments[i]; } } return min; } } console.log(Mymath.PI); console.log(Mymath.max(1, 2, 5, 9)); console.log(Mymath.min(5, 7, 1, 3));· Math绝对值和三个取整方法
//1.绝对值方法 console.log(Math.abs(1)); // 1 console.log(Math.abs(-1)); // 1 console.log(Math.abs('-1')); // 1 隐式转换,会把字符串 -1 转换为数字型 //2.三个取整方法 console.log(Math.floor(1.1)); // 1 向下取整,向最小的取值 floor-地板 console.log(Math.floor(1.9)); //1 console.log(Math.ceil(1.1)); //2 向上取整,向最大的取值 ceil-天花板 console.log(Math.ceil(1.9)); //2 //四舍五入 其他数字都是四舍五入,但是5特殊,它往大了取 console.log(Math.round(1.1)); //1 四舍五入 console.log(Math.round(1.5)); //2 console.log(Math.round(1.9)); //2 console.log(Math.round(-1.1)); // -1 console.log(Math.round(-1.5)); // -1 随机数方法rondom()
function getRandomIntInclusive(min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min + 1)) + min; //含最大值,含最小值 }
function getRandom(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } var random = getRandom(1, 50); for (i = 1; i <= 10; i++) { var num = prompt('请输入一个1-10的整数来猜一猜') if (num > random) { alert('猜的大了'); } else if (num < random) { alert('猜的小了'); } else { alert('猜对啦!'); break; } } 日期对象 Date()
Date()方法的使用获取当前时间必须实例化 var now = new Date(); console.log(now); Date()构造函数的参数 如果括号里面有时间,就返回参数里面的时间。例如日期格式字符串为
// 1.如果没有参数,返回当前系统的当前时间 var now = new Date(); console.log(now); ? // 2.参数常用的写法 数字型 2019,10,1 字符串型 '2019-10-1 8:8:8' 时分秒 // 如果Date()里面写参数,就返回括号里面输入的时间 var data = new Date(2019,10,1); console.log(data); ?// Fri Nov 01 2019 00:00:00 GMT+0800 (中国标准时间);返回的是11月不是10月 var data2 = new Date('2019-10-1 8:8:8'); console.log(data2); 日期格式化
var date = new Date(); console.log(date.getFullYear()); // 返回当前日期的年 console.log(date.getMonth() + 1); //返回的月份小一个月 记得月份 +1 console.log(date.getDate()); //返回的是几号 console.log(date.getDay()); //周一返回1 周6返回六 周日返回0 ? // 输出当前日期,按照 2019年5月1日星期三 的格式 var date = new Date(); var year = date.getFullYear(); var month = date.getMonth() + 1; var dates = date.getDate(); var arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']; var day = date.getDay(); console.log('今天是' + year +'年' + month + '月' + dates +'日' + arr[day]); ? // 封装一个函数返回当前的时分秒 格式 08:08:08 ? ? ? function getTime() { ? ? ? ? ? var time = new Date(); ? ? ? ? ? var h = time.getHours(); ? ? ? ? ? h = h < 10 ? '0' + h : h; ? ? ? ? ? var m = time.getMinutes(); ? ? ? ? ? m = m < 10 ? '0' + m : m; ? ? ? ? ? var s = time.getSeconds(); ? ? ? ? ? s = s < 10 ? '0' + s : s; ? ? ? ? ? return h + ':' + m + ':' + s; ? ? ? } ? ? ? console.log(getTime()); 获取日期的总的毫秒形式
// 获取Date总的毫秒数 不是当前时间的毫秒数 而是距离1970年1月1号过了多少毫秒数 // 实例化Date对象 var date = new Date(); // 1 .通过 valueOf() getTime() 用于获取对象的原始值 console.log(date.valueOf()); //现在距离1970年1月1日已经过去多少毫秒了 console.log(date.getTime()); //或 // 2.简单的写法 var date1 = +new Date(); // 或+new Date()返回的就是总的毫秒数, console.log(date1); // 3. HTML5中提供的方法 获得总的毫秒数 有兼容性问题 console.log(Date.now());// 或 倒计时效果function countDown(time) { var nowTime = +new Date(); //返回当前时间的总毫秒数 var inputTime = +new Date(time); //有参数,返回的是用户输入的总毫秒数 var times = (inputTime - nowTime) / 1000; //剩余时间的总秒数 var d = parseInt(times / 60 / 60 / 24); //天 d = d < 10 ? '0' + d : d; var h = parseInt(times / 60 / 60 % 24); //时 h = h < 10 ? '0' + h : h; var m = parseInt(times / 60 % 60); //分 m = m < 10 ? '0' + m : m; var s = parseInt(times % 60); //秒 s = s < 10 ? '0' + s : s; return d + '天' + h + '时' + m + '分' + s + '秒'; } var nowDate = new Date(); console.log(nowDate); console.log(countDown('2022-9-27 18:00:00')); 数组对象数组对象的创建创建数组对象的两种方式
var arr1 = new Array(2); //创建了一个有2个空元素的空数组 var arr1 = new Array(2, 3); //等价于[2,3],里面有2个数组元素元素2和3 检测是否为数组
var arr = [1, 23]; var obj = {}; console.log(arr instanceof Array); // true console.log(obj instanceof Object); //true console.log(Array.isArray(arr)); // true console.log(Array.isArray(obj)); // false 添加删除数组元素
// push() 在数组的末尾,添加一个或者多个数组元素 var arr = [1, 2, 3]; arr.push(4, '新元素'); console.log(arr); // [1, 2, 3, 4, '新元素'] console.log(arr.push(4, '秦晓')); // 7;push 完毕之后,返回结果是新数组的长度 console.log(arr); // [1, 2, 3, 4, '新元素' 4, '新元素'] // unshift 在数组的开头添加一个或者多个数组元素 arr.unshift('red'); console.log(arr); // ['red', 1, 2, 3, 4, '新元素' 4, '新元素'] // pop() 删除数组的最后一个元素,一次只能删除一个元素 arr.pop(); //不加参数 // shift() 删除数组的第一个元素,一次只能删除一个元素 arr.shift(); //不加参数
var arr = [1500, 1200, 2000, 2100, 1800]; var newArr = []; for (var i = 0; i < arr.length; i++) { if (arr[i] < 2000) { newArr.push(arr[i]); } } console.log(newArr); 数组排序
// 1.翻转数组 var arr = ['pink','red','blue']; arr.reverse(); console.log(arr); // 2.数组排序(冒泡排序) var arr1 = [3,4,7,1]; arr1.sort(); //默认是升序排列 console.log(arr1); // 升序与降序 var arr = [1, 64, 9, 6]; arr.sort(function(a, b) { return b - a; // 降序 // return a - b; // 升序 }); console.log(arr); 数组索引方法
//返回数组元素索引号方法 indexOf(数组元素) 作用就是返回该数组元素的索引号 //它只发返回第一个满足条件的索引号 //如果找不到元素,则返回-1 var arr = ['red','green','blue'.'pink','blue']; console.log(arr.indexOf('blue')); // 2 console.log(arr.lastIndexOf('blue')); // 4
var arr = ['red', 'blue', 'red', 'green', 'pink', 'red']; var index = arr.indexOf('red'); var num = 0; while (index !== -1) { //一直循环到找不到了为止 console.log(index); index = arr.indexOf('red', index + 1); num++; } console.log('red出现的次数是:' + num); // Console: 0 2 5 red出现的次数是:3 // 封装函数写法 function getPostion(arr, element) { var index = arr.indexOf(element); var num = 0; while (index !== -1) { //一直循环到找不到了为止 console.log(index); index = arr.indexOf(element, index + 1); num++; } console.log(element + '出现的次数是:' + num); } var arr = ['red', 'blue', 'red', 'green', 'pink', 'red']; getPostion(arr, 'red'); 数组去重
function unique(arr) { var newArr = []; for (var i = 0; i < arr.length; i++) { if (newArr.indexOf(arr[i]) === -1) { //如果在新数组里找不到旧数组的元素,就把它放进去 newArr.push(arr[i]); } } return newArr; } var demo = unique(['c', 'a', 'z', 'a', 'x', 'a', 'x', 'c ', 'b']); console.log(demo); //['c', 'a', 'z', 'x', 'c ', 'b'] 数组转化为字符串
// 1.toString() 将我们的数组转换为字符串 var arr = [1, 2, 3]; console.log(arr.toString()); // 1,2,3 // 2.join('分隔符') var arr1 = ['green', 'blue', 'red']; console.log(arr1.join()); // 不写默认用逗号分割 console.log(arr1.join('-')); // green-blue-red console.log(arr1.join('&')); // green&blue&red concat() slice() splice()
//concat() 连接数组 var num1 = [1, 2, 3], num2 = [4, 5, 6], num3 = [7, 8, 9]; var nums = num1.concat(num2, num3); console.log(nums); // [1, 2, 3, 4, 5, 6, 7, 8, 9] // slice(begin,end)数组截取返回现有数组的一部分 var fruits = ['Banana', 'Orange', 'Lemon', 'Apple', 'Mango']; var citrus = fruits.slice(1, 3); //(包含 begin,但不包含 end) // citrus contains ['Orange','Lemon'] // splice() 数组删除 // 从索引 2 的位置开始删除 1 个元素,插入“trumpet” var myFish = ['angel', 'clown', 'drum', 'sturgeon']; var removed = myFish.splice(2, 1, "trumpet"); // 运算后的 myFish: ["angel", "clown", "trumpet", "sturgeon"] // 被删除的元素: ["drum"] // 从索引 2 的位置开始删除 0 个元素,插入“drum” 和 "guitar" var myFish = ['angel', 'clown', 'mandarin', 'sturgeon']; var removed = myFish.splice(2, 0, 'drum', 'guitar'); // 运算后的 myFish: ["angel", "clown", "drum", "guitar", "mandarin", "sturgeon"] // 被删除的元素: [], 没有元素被删除 字符串对象基本包装类型为了方便操作基本数据类型,JavaScript 还提供了三个特殊的引用类型:String、Number和 Boolean。
按道理基本数据类型是没有属性和方法的,而对象才有属性和方法,但如str.length的代码却可以执行,这是因为 js 会把基本数据类型包装为复杂数据类型,其执行过程如下 : // 1.生成临时变量,把简单类型包装为复杂数据类型 var temp = new String('andy'); // 2.赋值给我们声明的字符变量 str = temp; // 3.销毁临时变量 temp = null; 字符串的不可变指的是里面的值不可变,虽然看上去可以改变内容,但其实是地址变了,内存中新开辟了一个内存空间。 var str = 'abc'; str = 'hello'; // 当重新给 str 赋值的时候,常量'abc'不会被修改,依然在内存中 // 重新给字符串赋值,会重新在内存中开辟空间,这个特点就是字符串的不可变 // 由于字符串的不可变,在大量拼接字符串的时候会有效率问题 var str = ''; for(var i = 0; i < 10000; i++){ str += i; } console.log(str); // 这个结果需要花费大量时间来显示,因为需要不断的开辟新的空间 根据字符返回位置字符串所有的方法,都不会修改字符串本身(字符串是不可变的),操作完成会返回一个新的字符串
// 字符串对象 根据字符返回位置 str.indexOf('要查找的字符', 起始的位置) var str = '改革春风吹满地,春天来了'; console.log(str.indexOf('春')); //默认从0开始查找,结果为2 console.log(str.indexOf('春', 3)); // 从索引号是3的位置开始往后查找,结果是8
var str = 'abcoefoxyozzopp'; var index = str.indexOf('o'); var num = 0; while (index !== -1) { //查到找不到为止 console.log(index); num++; index = str.indexOf('o', index + 1); } console.log('o出现的次数是:' + num); 根据位置返回字符
? ? ? ?// charAt(index) ? ? ? ?var str = 'andy'; ? ? ? ?console.log(str.charAt(3)); // y ? ? ? ?//遍历所有字符 ? ? ? ?for (var i = 0; i < str.length; i++) { ? ? ? ? ? ?console.log(str.charAt(i)); // a n d y ? ? ? } ? ? ? ? ?//carCodeAt(index) 返回ASCII值,可以判断用户按下了哪个键 ? ? ? ?console.log(str.charCodeAt(0)); //97 ? ? ? ? ?// str[index] (HTML5) ? ? ? ?console.log(str[0]);
// 核心算法:利用 charAt() 遍历这个字符串 // 把每个字符都存储给对象, 如果对象没有该属性,就为1,如果存在了就 +1 // 遍历对象,得到最大值和该字符 var str = 'abcoefoxyozzopp'; var obj = {}; for (var i = 0; i < str.length; i++) { var chars = str.charAt(i); if (obj[chars]) { //如果有obj.a,即o.a为true;obj.a相当于obj['a'],这里a是个'a',所以用后者;chars是字符串里的每一个字符; obj[chars]++; } else { obj[chars] = 1; } } console.log(obj); //a: 1 b: 1 c: 1 e: 1 f: 1 o: 4 p: 2 x: 1 y: 1 z: 2 //遍历对象属性 var max = 0; var ch = ''; for (var k in obj) { //k得到的属性名,obj[k]得到的是属性值 if (obj[k] > max) { max = obj[k]; ch = k; } } console.log(max); //4 console.log('最多的字符是' + ch); //最多的字符是o 字符串操作方法
// 1. concat('字符串1','字符串2'....) var str = 'andy'; console.log(str.concat('red')); // andyred // 2. substr('截取的起始位置', '截取几个字符'); var str1 = '改革春风吹满地'; console.log(str1.substr(2, 2)); // 春风;从索引号2的位置开始取两个字符 replace()方法replace() 方法用于在字符串中用一些字符替换另一些字符,但是只能替换第一个
// 替换字符 replace('被替换的字符', '替换为的字符') 只会替换第一个字符 var str = 'andyandy'; console.log(str.replace('a', 'b')); // 替换全部的:有一个字符串 'abcoefoxyozzopp' 要求把里面所有的 o 替换为 * var str1 = 'abcoefoxyozzopp'; while (str1.indexOf('o') !== -1) { str1 = str1.replace('o', '*'); } console.log(str1); 字符转换为数组 split()split() 方法用于切分字符串,它可以将字符串切分为数组。在切分完毕之后,返回的是一个新数组。 var str = 'a,b,c,d'; console.log(str.split(',')); // 返回的是一个数组 [a, b, c, d] // 字符转换为数组 split('分隔符') var str2 = 'red, pink, blue'; console.log(str2.split(',')); // [red, pink, blue] var str3 = 'red&pink&blue'; console.log(str3.split('&')); // [red, pink, blue] 大小写转换
console.log('alphabet'.toUpperCase()); // 'ALPHABET' 简单类型与复杂类型简单类型又叫做基本数据类型或者值类型,复杂类型又叫做引用类型。
// 简单数据类型null返回的是一个空对象object var timer = null; //如果有个变量我们以后打算存储为对象,暂时没想好放啥,这个时候就给null console.log(typeof timer); //object 堆和栈堆栈空间分配区别:
注意:JavaScript中没有堆栈的概念,通过堆栈的方式,可以让大家更容易理解代码的一些执行方式,便于将来学习其他语言。 简单类型的内存分配
简单类型传参函数的形参也可以看做是一个变量,当我们把一个值类型变量作为参数传给函数的形参时,其实是把变量在栈空间里的值复制了一份给形参,那么在方法内部对形参做任何修改,都不会影响到的外部变量。 ? ?// 简单数据类型传参 ? ?function fn(a) { ? ? ? ?a++; ? ? ? ?console.log(a); ? } ? ?var x = 10; ? ?fn(x); // 11 ? ?console.log(x); // 10 复杂类型传参函数的形参也可以看做是一个变量,当我们把引用类型变量传给形参时,其实是把变量在栈空间里保存的堆地址复制给了形参,形参和实参其实保存的是同一个堆地址,所以操作的是同一个对象 ? ?// 复杂数据类型传参 ? ?function Person(name) { ? ? ? ?this.name = name; ? } ? ?function f1(x) { // x = p ? ? ? ?console.log(x.name); // 2. 刘德华 ? ? ? ? ?x.name = "张学友"; ? ? ? ?console.log(x.name); // 3. 张学友 ? } ? ?var p = new Person("刘德华"); ? ?console.log(p.name); // 1. 刘德华 ? ?f1(p); ? ?console.log(p.name); // 4. 张学友 |
|
JavaScript知识库 最新文章 |
ES6的相关知识点 |
react 函数式组件 & react其他一些总结 |
Vue基础超详细 |
前端JS也可以连点成线(Vue中运用 AntVG6) |
Vue事件处理的基本使用 |
Vue后台项目的记录 (一) |
前后端分离vue跨域,devServer配置proxy代理 |
TypeScript |
初识vuex |
vue项目安装包指令收集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 22:48:35- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |