浏览器分成两部分:渲染引擎和 JS 引擎
渲染引擎:用来解析HTML与CSS,俗称内核,比如 chrome 浏览器的 blink ,老版本的 webkit
JS 引擎:也称为 JS 解释器。 用来读取网页中的JavaScript代码,对其处理后运行,比如 chrome 浏览器的 V8
var a; var b;
a=20;b="hello world";
a,b可以被赋值为任意数据类型的值
var a = 10, b = 'yy', c = 2;
**注意:**alert() 主要用来显示消息给用户,console.log() 用来给程序员自己看运行时的消息。
alert(“提示”:+变量)
alert('结果是'+result)
// 1. 先弹出第一个输入框,提示用户输入第一个值 var num1 = prompt('请输入第一个值:'); // 2. 再弹出第二个框,提示用户输入第二个值 var num2 = prompt('请输入第二个值:'); // 3. 将输入的值转换为数字型后,把这两个值相加,并将结果赋给新的变量 var result = parseFloat(num1) + parseFloat(num2); // 4. 弹出结果 alert('结果是:' + result);
JS 把数据类型分为两类:
alert(Infinity); // Infinity alert(-Infinity); // -Infinity alert(NaN); // NaN
var a = 21; var b = isNaN(a); console.log(isNaN(a))//false var c = "hello"; console.log(isNaN(c)); // true ,"hello"是一个非数字
var a='hello world' console.log(a.length)//11
var a='hello world ' var b='yeye for the first' console.log(a+b)//hello world yeye for the first
var num = 24; console.log(typeof num) // 结果 number
不同类型返回值
如果需要反复给数字变量添加或减去1,可以使用递**增(++)和递减(–)**运算符来完成。
console.log(18 == '18');//true console.log(18 === '18');//false
// 条件成立执行代码,否则什么也不做 if (条件表达式) { // 条件成立执行的代码语句 }
// 条件成立 执行 if 里面代码,否则执行else 里面的代码 if (条件表达式) { // [如果] 条件成立执行的代码 } else { // [否则] 执行的代码 }
// 适合于检查多重条件。 if (条件表达式1) { 语句1; } else if (条件表达式2) { 语句2; } else if (条件表达式3) { 语句3; .... } else { // 上述条件都不成立执行此处代码 }
表达式1 ? 表达式2 : 表达式3;
如果表达式1为 true ,则返回表达式2的值,如果表达式1为 false,则返回表达式3的值
简单理解: 就类似于 if else (双分支) 的简写
var time = prompt('请输入一个数字'); // 三元表达式 表达式 ? 表达式1 :表达式2 var result = (time < 10 ? time+'比10小' : time+'不比10小'); // 把返回值赋值给一个变量 alert(result);
switch( 表达式 ){ case value1: // 表达式 等于 value1 时要执行的代码 break; case value2: // 表达式 等于 value2 时要执行的代码 break; default: // 表达式 不等于任何一个 value 时要执行的代码 }
switch :开关 转换 , case :小例子 选项
关键字 switch 后面括号内可以是表达式或值, 通常是一个变量
关键字 case , 后跟一个选项的表达式或值,后面跟一个冒号
switch 表达式的值会与结构中的 case 的值做比较
如果存在匹配全等(===) ,则与该 case 关联的代码块会被执行,并在遇到 break 时停止,整个 switch 语句代码执行结束
如果所有的 case 的值都和表达式的值不匹配,则执行 default 里的代码
for(初始化变量; 条件表达式; 操作表达式 ){ //循环体 }
初始化变量:通常被用于初始化一个计数器,该表达式可以使用 var 关键字声明新的变量,这个变量帮我们来记录次数。
条件表达式:用于确定每一次循环是否能被执行。如果结果是 true 就继续循环,否则退出循环。
操作表达式:每次循环的最后都要执行的表达式。通常被用于更新或者递增计数器变量。当然,递减变量也是可以的。
while (条件表达式) { // 循环体代码 }
①先执行条件表达式,如果结果为 true,则执行循环体代码;如果为 false,则退出循环,执行后面代码
②执行循环体代码
③循环体代码执行完毕后,程序会继续判断执行条件表达式,如条件仍为true,则会继续执行循环体,直到循环条件为 false 时,整个循环过程才会结束
do { // 循环体代码 - 条件表达式为 true 时重复执行循环体代码 } while(条件表达式);
continue:立即跳出本次循环,继续下一次循环
break:break 关键字用于立即跳出整个循环(循环结束)
var 数组名 = new Array() ; var arr = new Array(); // 创建一个新的空数组
//1. 使用数组字面量方式创建空的数组 var 数组名 = []; //2. 使用数组字面量方式创建带初始值的数组 var 数组名 = ['小白','小黑','大黄','瑞奇'];
// 定义数组 var arr = [1,2,3]; // 获取数组中的第2个元素 alert(arr[1]);//弹出2
var arr=[1,2,3] console.log(arr.length)//输出3
var arr = ['red', 'green', 'blue', 'pink']; console.log(arr);//['red', 'green', 'blue', 'pink'] arr.length = 7; arr[4]='black' console.log(arr)//['red', 'green', 'blue', 'pink', 'black', empty × 2]
var arr = ['red', 'green', 'blue', 'pink']; arr[4] = 'hotpink'; console.log(arr);
// 声明函数 function 函数名() { //函数体代码 }
// 调用函数 函数名(); // 通过调用函数名来执行函数体代码
在声明函数时,可以在函数名称后面的小括号中添加一些参数,这些参数被称为形参,而在调用该函数时,同样也需要传递相应的参数,这些参数被称为实参
参数的作用 : 在函数内部某些值不能固定,我们可以通过参数在调用函数时传递不同的值进去
// 声明函数 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
注意点:
// 声明函数 function sum(){ ... return 918; } // 调用函数 a=sum(); // 此时 a的值就等于918,因为 return 语句会把自身后面的值返回给调用者
function add(num1,num2){ //函数体 return num1,num2; } var resNum = add(8,6); // 调用函数,传入两个实参,并通过 resNum 接收函数返回值 alert(resNum); // 6
arguments展示形式是一个伪数组,因此可以进行遍历。伪数组具有以下特点:
具有 length 属性
按索引方式储存数据
不具有数组的 push , pop 等方法
// 这是函数表达式写法,匿名函数后面跟分号结束 var fn = function(){...}; // 调用的方式,函数调用必须写到函数体下面 fn();
for(var a=1;a<5;a++) { console.log(a) } console.log('局部变量a的值为:'+a)//5
console.log(num); // 结果是多少? var num = 10; //undefined
说明声明可以提前,但是赋值不会被提前
预解析只会发生在通过 var 定义的变量和 function 上。学习预解析能够让我们知道为什么在变量声明之前访问变量的值是 undefined,为什么在函数声明之前就可以调用函数。
fn(); function fn() { console.log('打印'); } //输出了打印
因为声明可以被提前,所以调用这个函数依然可以直接输出结果
var star = { name : 'yeye', age : 24, sex : '女', sayHi : function(){ alert('hello world'); } };
说明:
用花括号 { } 里面包含了表达这个具体事物(对象)的属性和方法。
{ } 里面采取键值对的形式表示
键:相当于属性名
值:相当于属性值,可以是任意类型的值(数字类型、字符串类型、布尔类型,函数类型等)
对象里面的属性调用 : 对象.属性名 ,这个小点 . 就理解为“ 的 ”
对象里面属性的另一种调用方式 : 对象[‘属性名’]**,**注意方括号里面的属性必须加引号,我们后面会用
对象里面的方法调用:对象.方法名() **,**注意这个方法名字后面一定加括号
//star为一个对象 sayHI为对象里面的一个函数 console.log(star.name) // 调用名字属性 console.log(star['name']) // 调用名字属性 star.sayHi(); // 调用 sayHi 方法,注意,一定不要忘记带后面的括号
var idle = { name : 'yeye', age : 24, sex : '女', sayHi : function(){ alert('for the first place'); } };
var andy = new Object(); andy.name = 'yeye'; andy.age = 24; andy.sex = '女'; andy.sayHi = function(){ alert('hello'); } console.log(andy.name)//yeye /* 先使用new Object创建一个对象,然后对其属性进行赋值 */
//这个Person其实就相当于一个类(class) function Person(name, age, sex) { this.name = name; this.age = age; this.sex = sex; this.sayHi = function() { alert('我的名字叫:' + this.name + ',年龄:' + this.age + ',性别:' + this.sex); } } var bigbai = new Person('大白', 100, '男'); var smallbai = new Person('小白', 21, '男'); console.log(bigbai.name); console.log(smallbai.name);
在 js 中,使用构造函数要时要注意以下两点:
构造函数用于创建某一类对象,其首字母要大写
构造函数要和 new 一起使用才有意义
for (变量 in 对象名字) { console.log(key)//key为属性名 console.log(对象名[key])//输出值 // 在此执行代码 }
var andy = new Object(); andy.name = 'yeye'; andy.age = 24; andy.sex = '女'; andy.sayHi = function(){ alert('hello'); } /* 先使用new Object创建一个对象,然后对其属性进行赋值 */ for(var key in andy) { console.log(key+':'+andy[key]) }
Math.PI // 圆周率 Math.floor() // 向下取整 Math.ceil() // 向上取整 Math.round() // 四舍五入版 就近取整 注意 -3.5 结果是 -3 Math.abs() // 绝对值 Math.max()/Math.min() // 求最大和最小值 Math.random()//随机返回一个小数,其取值范围是 [0,1),左闭右开 0 <= x < 1
var now = new Date(); console.log(now);//Sat Jan 14 2023 19:57:15 GMT+0800 (中国标准时间)
var now = new Date('2022-2-13'); console.log(now);//Sun Feb 13 2022 00:00:00 GMT+0800 (中国标准时间)
getMonth()方法可以返回表示月份的数字。返回值是0代表一月,11代表12月
getDay()方法返回一周里的某一天。返回值0代表星期天 ,一代表星期一,六代表星期六
var now = new Date(); console.log(now.getFullYear()+'-'+(now.getMonth()+1)+'-'+now.getDate()+' '+now.getHours()+':'+now.getMinutes());
new Array()
var a =new Array; a[0]='hello' a[1]='world' console.log(a)//['hello', 'world']
var a =new Array; a[0]='hello' a[1]='world' console.log(a instanceof Array)//true
//push 追加元素 var a =new Array; a[0]='hello' a[1]='world' a[2]='yeye' console.log(a);//['hello', 'world', 'yeye'] a.push('haha') console.log(a)//['hello', 'world', 'yeye', 'haha']
var arr = [1, 64, 9, 6]; arr.sort(function(a, b) { return b - a; // 降序 // return a - b; // 升序 }); console.log(arr);
var arr = [1, 64, 9, 6,6]; console.log(arr.indexOf(1));//0 console.log(arr.indexOf(9));//2 console.log(arr.lastIndexOf(6))//4
- toString
var arr = [1, 64, 9, 6,6]; b=arr.toString() console.log(b) console.log(typeof b)
jion
var arr = [1, 64, 9, 6,6]; b=arr.join('+') console.log(b) console.log(typeof b)
- concat()
var arr = [1, 64, 9, 6,6]; var HII=[25,58,66,44] a=arr.concat(HII) console.log(a)
slice()
var arr = [1, 64, 9, 6,6]; var HII=[25,58,66,44] a=arr.slice(2,4) console.log(a)//[9, 6]
var a='hello ' var b='world' var c=a+b console.log(c) console.log(c.replace(c[0],b[0]))
var a='he,llo ' var b='w,or,ld' var c=a+b console.log(c.split(','))// ['he', 'llo w', 'or', 'ld']
toUpperCase() //转换大写
toLowerCase() //转换小写
var a='hello ' var b='world' var c=a+b var d=c.toUpperCase() console.log(c.toUpperCase())//HELLO WORLD console.log(d.toLocaleLowerCase())//hello world
简单类型又叫做基本数据类型或者值类型,复杂类型又叫做引用类型。
string ,number,boolean,undefined,null
通过 new 关键字创建的对象(系统对象、自定义对象),如 Object、Array、Date等
堆栈空间分配区别:
1、栈(操作系统):由操作系统自动分配释放存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈;
2、堆(操作系统):存储复杂类型(对象),一般由程序员分配释放,若程序员不释放,由垃圾回收机制回收。
值类型(简单数据类型): string ,number,boolean,undefined,null
值类型变量的数据直接存放在变量(栈空间)中
引用类型(复杂数据类型):通过 new 关键字创建的对象(系统对象、自定义对象),如 Object、Array、Date等
引用类型变量(栈空间)里存放的是地址,真正的对象实例存放在堆空间中
函数的形参也可以看做是一个变量,当我们把一个值类型变量作为参数传给函数的形参时,其实是把变量在栈空间里的值复制了一份给形参,那么在方法内部对形参做任何修改,都不会影响到的外部变量。
形参和实参是独立的
function Person(name) { this.name = name; } function f1(x) { // x = p x.name = "yeye"; } var p = new Person("瑶瑶"); console.log(p.name); // 瑶瑶 f1(p); console.log(p.name); // yeye
可以看到p.name属性的值已经被改变了
视频教程:https://www.bilibili.com/video/BV1Sy4y1C7ha/?share_source=copy_web&vd_source=03653b285aec67f0157f73840202808d
对应文档(PDF+markdown格式):https://download.csdn.net/download/weixin_63676550/87386435