什么是Javascript

简介

  1. JavaScript 是互联网上最流行的脚本语言,这门语言可用于 HTML 和 web,更可广泛用于服务器、PC、笔记本电脑、平板电脑和智能手机等设备 。
  2. 轻量级,但功能强大的编程语言 。

组成部分

ECMAScript
  • js代码语法的标准 是一种规范。
  • 规定js有哪些内容。

Web ApI
  • dom 页面标签
  • bom 浏览器刷新

引入方式

内部式

内联式

外链式 (工作中常用)

注释方式

单行 //

多行 /**/

语法

区分大小写

ECMAScript一切都区分大小写,无论是变量、函数名还是操作符

括号表示代码块。

标识符

就是变量、函数、属性或者函数参数的名称。

输出方式

  1. 控制台输出 console.log()
  2. 弹出警告框 alert()
  3. 将内容写到 HTML文档中 document.write()

输入方式

  1. prompt(“ “) ; 输入的内容 数据类型都是字符串

字面量(常量)

在编程语言中,一般固定值称为字面量

待完善。。。

数字(Number)字面量

可以是整数或者是小数,或者是科学计数(e)

字符串(String)字面量

可以使用单引号或双引号

表达式 字面量

用于计算 + - * /

数组(Array)字面量

定义一个数组

对象(Object)字面量

定义一个对象

函数(Function)字面量

定义一个函数

变量(标识符)

什么是变量

  • 一个变量,就是一个用于存放数值的容器 。
  • 变量的独特之处在于它存放的数值是可以改变的

声明一个变量的语法是

  • 使用 letvar 关键字之后加上这个变量的名字
    var 声明一个变量,可选初始化一个值 .
    let 声明一个块作用域的局部变量,可选初始化一个值
    let userName ;
  • 变量的命名:驼峰命名法
  • 不能以数字开头
  • 可以使用 英文开头 和 _ $等
  • 最好有具体的含义
    反引号包裹可以输出html的内容 ${}表示变量,用反引号包裹就不用引号和加号隔开了
    小案例 document.write ${}
    1. let userName = '熊二';
    2. let userAge = '12';
    3. // 反引号包裹
    4. // 模板字符串
    5. document.write(`大家好,我叫${userName},今年${userAge}岁了`)
    6. document.write(`<h1>一级标题</h1>`)

    效果图:Javascript基础 - 图1

数据类型

检测数据类型

typeof

基本数据类型

Number

整数浮点数

NaN
  1. NaN自己和自己不相等
  2. NaN参加任何数学运算结果都是NaN

String

单引号双引号包裹的文本

Boolean

  1. true
  2. false

undefined

  1. varlet 语句声明的变量,如果没有赋初始值,则其值为 undefined
  2. 可以使用 undefined 来判断一个变量是否已赋值

null

对一个 null 变量求值时,空值 null 在数值类型环境中会被当作0来对待,而布尔类型环境中会被当作 false

数据类型总结

举例 当let a = b变量传值时 当用==比较时
基本类型值 数字型、字符串型、布尔型、undefined型 内存中产生新的副本 比较值是否相等
引用类型值 对象、数组 内存中不产生新的副本,而是让新变量指向同一个对象 比较内存地址是否相同,即比较是否是同一个对象

引用数据类型

  1. array
  2. object
  3. function
  4. regexp
  5. ….

数据类型转换

隐式转换

本质就是调用Number()函数

系统**自动做转换**(用的更多、简单)

参加数学运算的操作数不是数字型,会隐式转换

1.转为Number类型

  1. //第一种
  2. 1. let num1 = "123";
  3. let num2 = +num1;
  4. //最好简写成下面:
  5. let num1 = "123";
  6. let num2 = +num1;
  7. //第二种
  8. 2.//将输入的字符串转为Number类型
  9. let num1 = +prompt('请输入数字');
  10. //第三种
  11. 3. let num2 = "123" - 0; //乘 减 除 都可以转为Number类型,加法不行

2.转为String类型

加号两边只要有一个是字符串,都会把另一个转成字符串

  1. let str = 123;
  2. let str2 = str + "";

显式转换

自己写代码告诉系统转成什么类型

1.转为Number类型

转换不成功结果为 NaN (not a number) 不成功应该是字符串里有非数字

parseInt()parseFloat()

Number()

  1. //第一种
  2. 1.let num = Number("123");
  3. //第二种
  4. 2.let num2 = '12';
  5. let num3 = Number(num2);
  6. 3.//将输入的字符串转为Number类型
  7. let num1 = prompt('请输入数字');
  8. console.log(parseInt(num1));
  9. //parseInt 方法只能返回整数,所以使用它会丢失小数部分。另外,调用 parseInt 时最好总是带上进制(radix) 参数,这个参数用于指定使用哪一种进制。

2.转为String类型

string()

toString() 常用

  1. //第一种
  2. let str = String(123);
  3. //第二种
  4. let num1 = '12345';
  5. num1.toString(); //常用

运算符

表达式:由操作数、运算符、变量等组成的式子

  1. 10 + 8
  2. 操作数 运算符 操作数

小括号

小括号
() 优先级最高

一元运算符

一元运算符
++ 前置自减(i),后置自减(i)。
前置自减(—i),后置自减(i—)。
  1. 后置自增:先用再加。先返回原值,再自己+1。
  2. 前置自增:先加再用
  3. 前置自增和后置自增单独使用没有区别
  4. 面试题型:
    1. let a = 3;
    2. let b = 4;
    3. 3 + 4 + 5 + 6
    4. alert(a++ + b++ + ++a + ++b)
    5. //因为先进行了a++ ,当执行到++a时,a的值已经变成了4,而==a先自增再进行运算,所以a变成了5

算术运算符

算数运算符 作用
+ 求和(也有连字符的作用)
- 求差
* 求积
/ 求商
% 取模(取余数)(开发中经常用来验证某个数字是否被整除)

关系运算符(比较运算符)

关系运算符(比较运算符) 含义
> 大于
>= 大于或等于
< 小于
<= 小于或等于
== 等于(只比较结果不比较类型),1==”1” 结果为true
!= 不等于
===(全等) 既要判断类型 也要判断值
!== 不全等于
  1. 得到的都是 布尔值
  2. 一般是都是对数字作比较
  3. 字符串做比较 更多是判断两者是否相等
  4. 两个等号 == 运算符,会进行隐式转换后比较值是否相等
  5. 1.undefined等于null // true
    2.字符串和数字比较时,字符串转数字
    3.数字为布尔比较时,布尔转数字
    4.字符串和布尔比较时,两者转数字
  6. js中没有连比
    1. 2 <= 4 <= 7 //错误的写法
  1. NaN === NaN // false 不自等
    1. isNaN函数可以判读某个变量是否为NaN
      1. isNaN(NaN) //true
      2. isNaN(9) //false
  1. 但只要变量传入Number()的执行结果为NaN,则NAN函数都会得到true
    1. isNaN(undefined) //true
    2. isNaN('快乐') //true
    3. isNaN(null) //false
  1. js处理小数可能会丢失精度问题 最好不要比较小数
    解决办法:进行小数运算时调用数字的toFixed()方法,保留指定的小数位数
    1. alert(0.2 + 0.4===0.6); // false
    2. alert(0.2 === 0.2); //true
    3. //解决办法
    4. Number((0.2 + 0.4).toFixed(2)) //0.6
  1. 向上取整和向下取整

    • Math.ceil() 向上取整
    • Math.floor() 向下取整
      1. Math.ceil(2.4) //3
      2. Math.floor(2.4) //2
      3. Math.ceil(-2.4) //-2
      4. Math.floor(-2.4) //-3
      5. Math.ceil(3) //3
      6. Math.floor(3) //3
  2. 相等和全等

  1. 1 == true //true
  2. 1 === true //false
  3. 0 == undefined //false
  4. 0 === undefined //false
  5. undefined == null //true
  6. undefined === null //false,因为类型不同
  7. //null → object
  8. //undefined → undefined
  1. 字符串比较

(不要face)

    1. console.log("2" > "19");
  1. //"2" 和 "1"做比较,如果"2" > "1"得出结果,不会再往下去判断"2" 和 "9"
  1. - "2" "19" 看成是数字 ,**本质是字符串** "2" "1"字符串做比较
  2. - 运算符两侧如果有一个是字符串和一个是数字,把字符串转成数字再去比较
  3. 12. 类型转换再比较
  4. ```javascript
  5. console.log(4 > '3'); //true 隐式转换了
  6. console.log(4 > Number('3')); //类型转换再比较 true

逻辑运算符

逻辑运算符 含义
&& 逻辑与 一假则假
|| 逻辑或 一真则真
逻辑非 (单目运算符,只需要一个操作数)
  1. !true //false
  2. !false //true
  3. !0 //true
  4. !undefined //true
  5. !'' //true
  6. !'haha' //false
  7. !!true //求true的相反的相反 true
  8. //两个!!的值可以看出值本身是真值还是假值
  9. //!!真正工作中常进行布尔值的转换

赋值运算符

对变量进行赋值的运算符

赋值运算符 将等号右边的值赋予给左边, 要求左边必须是一个变量 示例
= 把等号右侧操作数的值直接复制给左侧的操作数 a = b
+= 加法运算或连接操作并赋值 a += b
-= 减法运算并赋值 a -= b
*= 乘法运算并赋值 a *= b
/= 除法运算并赋值 a /= b
%= 取模运算并赋值 a %= b
  1. let num = 10;
  2. num -= 2; // num = num - 2 8
  3. num += 2; // num = num + 2 12
  4. num *= 2; // num = num * 2 20
  5. num /= 2; // num = num / 2 5
  6. console.log(num);

补充知识点:赋值运算也产生值,等号后面的值将作为”赋值运算的值”

  1. let a;
  2. console.log(a = 5); //5
  3. //这就意味着,可以连续使用赋值运算符
  4. let a, b, c;
  5. a = b = c = 10;
  6. console.log(a); //10
  7. console.log(b); //10
  8. console.log(c); //10

逗号运算符

逗号运算符
运算符优先级最低

运算符优先级

优先级 运算符 顺序
1 小括号 ()
2 一元运算符 ++ —
3 算数运算符 先 * / % 后 + -
4 关系运算符 > >= < < <=
5 相等运算符 == != === !==
6 逻辑运算符 ! 先 && 后 || 逻辑非优先级最高
7 赋值运算符 =
8 逗号运算符 ,

逻辑非优先级最高

  1. 同时使用多个运算符编写程序时,会按着顺序先后执行,我们称为优先级。
  2. JavaScript中 优先级越高越先被执行,优先级相同时以书从左向右执行
  3. 乘、除、取余优先级相同
  4. 加、减优先级相同
  5. 乘、除、取余优先级大于加、减
  6. 使用 () 可以提升优先级
  7. 总结: 先乘除后加减,有括号先算括号里面的~~~

短路

  1. 利用逻辑运算符的规则 ,判断代码如何执行
  2. 短路运算结果 通常是用来运算结果(最终谁被运算,表达式就等于谁)
  3. 空的 否定的都是假的,其余都是真的
    0 “”空字符串 null undefined NaN

逻辑中断逻辑与

  1. 如果表达式1为真,则返回表达式2
  2. 如果表达式1结果为假,则返回表达式1,因为表达式二被‘短路了’
  3. 后面的值决定了总结果
  4. 都真才真
    | 与运算 | 结果 | | —- | —- | | true && true | true | | true && false | false | | false && true | false | | false && false | false |
  1. a && b //都真才真
  2. //b真结果就真
  3. //b假结果就假

逻辑或短路运算

  1. 如果表达式1结果为真,则返回表达式1,因为表达式二被‘短路了’
  2. 如果表达式1结果为假,则返回表达式2
  3. 有真就真
    | 或运算 | 结果 | | —- | —- | | true || true | true | | true || false | true | | false || true | true | | false || false | false |
  1. let num = 0;
  2. console.log(123 || num++); //表达式1为真,后面不执行 结果为123
  3. //从上面可知:逻辑运算的优先级是 非 → 与 → 或
  4. !true || true //true
  5. 3 && 4 || 5 && 6 //4

条件语句

最简单基本的流程控制,没有特定的语法结构,程序会按照代码的先后来执行,依次执行。

If语句

无论多少个选择语句,最终只会有一个语句被执行

If 单分支

  1. if (条件表达式) {
  2. 语句
  3. }

If 双分支

  1. if (条件表达式) {
  2. 语句1
  3. } else {
  4. 语句2
  5. }
  1. // 每个 个位上的数字的 n 次幂之和等于它本身
  2. // 拆位 百位 十位 个位 除法 取余
  3. // 同时满足 与 弹出是水仙花数
  4. 1. let num = +prompt("请输入数");
  5. //对用户输入的数值,进行合法性的验证
  6. // 数字 100 - 999之间的数字
  7. if (!isNaN(num) && num >= 100 && num <= 999) {
  8. // 数学方法
  9. // 百位
  10. let a = Math.floor(num / 100);
  11. // 十位
  12. let b = Math.floor(num / 10) % 10;
  13. // 个位
  14. let c = num % 10;
  15. if (Math.pow(a, 3) + Math.pow(b, 3) + Math.pow(c, 3) == num) {
  16. alert('是水仙花数')
  17. } else {
  18. alert('不是水仙花数')
  19. }
  20. } else {
  21. // 输入不合法
  22. alert('请输入三位纯数字')
  23. }
  24. 2.let num = +prompt("请输入数");
  25. //对用户输入的数值,进行合法性的验证
  26. // 数字 100 - 999之间的数字
  27. if (!isNaN(num) && num >= 100 && num <= 999) {
  28. // 把数字num变为字符串
  29. let num_str = num.toString();
  30. // 百位
  31. let a = Number(num_str.charAt(0));
  32. // 十位
  33. let b = Number(num_str.charAt(1));
  34. // 个位
  35. let c = Number(num_str.charAt(2));
  36. if (Math.pow(a, 3) + Math.pow(b, 3) + Math.pow(c, 3) == num) {
  37. alert('是水仙花数')
  38. } else {
  39. alert('不是水仙花数')
  40. }
  41. } else {
  42. // 输入不合法
  43. alert('请输入三位纯数字')
  44. }

If 多分支

  1. if (条件表达式1) {
  2. 语句1
  3. } else if (条件表达式2) {
  4. 语句2
  5. } else if (条件表达式3) {
  6. 语句3
  7. } else if (条件表达式4) {
  8. 语句4
  9. } else {
  10. 语句5
  11. }

三元运算符

表达式 ? 表达式1 : 表达式2

如果表达式为真则返回表达式1,如果表达式为假则返回表达式2

  1. let num1 = 10;
  2. let num2 = 20;
  3. console.log(num1 > num2 ? num1 : num2); //20
  1. //个位数的数字补0
  2. let num = +prompt("请输入数字");
  3. alert(num < 10 ? '0' + num : num)
  4. let num1 = 10;
  5. let num2 = 20;
  6. console.log(num1 > num2 ? num1 : num2);

Switch语句

用途:

  1. 根据某个条件是否成立,在两个不同值中选择变量的值
  1. 开发里表达式常写成变量
  2. num的值必须和case的值全等(===)才能匹配
  3. 没有break不退出,会继续执行当前case的下一个case
  4. 多条case可以共用一个语句体
  1. // 判断一个月有多少天
  2. let year = +prompt("请输入年份");
  3. let month = +prompt("请输入月份")
  4. // 根据月份来分类讨论
  5. switch (month) {
  6. case 1:
  7. case 3:
  8. case 5:
  9. case 7:
  10. case 8:
  11. case 10:
  12. case 12:
  13. alert("这个月有31天");
  14. break; //记得退出
  15. case 4:
  16. case 6:
  17. case 9:
  18. case 10:
  19. alert("这个月有30天");
  20. break; //记得退出
  21. case 2:
  22. // 根据输入的年份判断今年是否是闰年
  23. if (year % 4 == 0 && year % 100 != 0 || year % 100 == 0 && year % 400 == 0) {
  24. // 满足闰年条件
  25. alert("这个月有29天");
  26. } else {
  27. alert("这个月有28天");
  28. }
  29. break; //记得退出
  30. }

循环语句

for循环

使用for循环可以简化程序

  1. for (声明记录循环次数的变量; 循环条件; 变化值) {
  2. 循环体
  3. }
  4. for (循环变量; 条件表达式; 操作表达式) {
  5. 循环体
  6. }
  • 如果满足循环条件则一直循环,不满足则退出
  • for循环执行机理
    Javascript基础 - 图2
    小例子:
    1. for (let i = 15; i > 2; i -= 3) {
    2. console.log(i)
    3. }
    4. //15 12 9 6 3
    1. for (let i = 2; i < 12; i += 3) {
    2. i += 4; //也会影响i
    3. console.log(i);
    4. }//6 13
  • 死循环
    1. // 死循环
    2. for (let i = 1; i < 100; i--) {
    3. console.log(i);
    4. }
    5. // 如果输出i就是100

双重for循环

  1. for(外层的初始化变量; 外层的条件表达式; 外层的操作表达式) {
  2. for(里层的初始化变量; 里层的条件表达式; 里层的操作表达式) {
  3. 执行语句
  4. }
  5. }
  6. //外层循环循环一次,里层循环执行完所有
  1. // 九九乘法表
  2. let str = '';
  3. for (let i = 1; i <= 9; i++) {
  4. for (let j = 1; j <= i; j++) {
  5. str += j + '*' + i + '=' + j * i + '\t'
  6. }
  7. // 外层循环每循环结束一行就换行
  8. str += '\n'
  9. }
  10. console.log(str);

while循环

  1. 事先不指定循环开始、结束的范围,只要测试条件满足,就一直执行循环体
    1. while (测试条件) {
    2. }
  1. while循环没有显示定义循环变量,必须自己在while循环外定义好循环变量,有时可以没有循环变量
  2. 循环体内的语句,必须使循环条件趋向不成立,否则会死循环
  1. // 页面输出1-100
  2. let i = 0;
  3. while (i <= 100) {
  4. document.write(`${i}<br>`);
  5. i++
  6. }
  7. // 计算1加到100的总和并输出
  8. let i = 0;
  9. let sum = 0;
  10. while (i <= 100) {
  11. // sum += i;
  12. // i++;
  13. sum += i++; //等于sum += i 和 i++
  14. }
  15. document.write(sum);
  16. // 计算1-100之间的所有偶数和
  17. 1. let i = 0;
  18. let sum = 0;
  19. while (i <= 100) {
  20. //这一行不能直接执行,需要满足下面的条件才执行
  21. if (i % 2 == 0) {
  22. sum += i;
  23. }
  24. //无论当前的i时偶数还是奇数 i++都要执行 因为必须要进行下一轮的循环
  25. i++;
  26. }
  27. document.write(sum)
  28. 2. let i = 0;
  29. let sum = 0;
  30. while (i <= 100) {
  31. //利用短路
  32. //只有左边满足条件了等于true 才会执行右边的代码
  33. (i % 2 == 0) && (sum += i);
  34. i++;
  35. }
  36. document.write(sum)
  1. //小兔子拔萝卜,第1天拔1个,第2天拔2个,第3天拔3个.。。
  2. //问第几天能拔到500个
  3. //天的序号
  4. let day = 1;
  5. //累加器
  6. let sum = 0;
  7. while (sum < 500) {
  8. sum += day;
  9. day++;
  10. }
  11. //注意:这里有个"出一错误"
  12. console.log(day - 1);
  13. // 没办法避免"出一错误",只能人为减一了

Javascript基础 - 图3

  1. //穷举法,从1开始试验
  2. //需求:满足n的平方大于456789的最小的整数
  3. let n = 1;
  4. while (n * n <= 456789) {
  5. n++;
  6. }
  7. console.log(n)

do while循环

  1. 循环体一定会至少执行一次,然后再检测条件是否为true,决定是否继续执行循环体。先执行在判断
    1. do {
    2. 循环体
    3. } while (循环执行条件)
  1. 输出1、2、3到100.
    1. let n = 1;
    2. do {
    3. // 先执行一次,输出1
    4. console.log(n);
    5. n++;
    6. } while (n < 101);
  1. do while更擅长获取随机数

    • 提前拓展: 随机数函数(得到0-1之间的小数)

      1. `Math.random()`
    • 取得介于 1 到 10 之间的一个随机数

      1. Math.floor((Math.random() * 10 ) + 1 );
    • 得到[a,b]区间的整数,包含a和b。公式:

      1. (Math.random() * (max - min + 1) ) + min
      1. //小案例
      2. //随机生成两个变量,a和b,它们都在[-4,4]之间随机取值,但是都不能为0
      3. do {
      4. var a = parseInt(Math.random() * 9) - 4
      5. var b = parseInt(Math.random() * 9) - 4
      6. } while (a == 0 && b == 0)
      7. console.log(a, b);
      8. // 保证了只要退出循环,a和b都不是0

循环退出

continue

  1. 结束本次循环,跳过后面的代码,继续下次循环

    1. for (let i = 0; i < 5; i++) {
    2. if (i === 3) {
    3. // 如果i=3的时候,跳出这个循环,不再执行后面的代码
    4. continue;
    5. }
    6. console.log(i); // 0 1 2 4
    7. }

break

  1. 立即终止循环,只能用在循环语句中
  2. 跳出整个所在的循环

  3. 在for循环中 ```javascript for (let i = 0; i < 10; i++) { console.log(i); // 0 1 2 3 4 if (i == 4) { // 当i=4终止整个循环

    1. break;

    } }

for (let i = 0; i < 10; i++) { if (i == 4) { // 当i=4终止整个循环 break; } console.log(i); // 0 1 2 3 }

  1. 4. while中,通常和while(true){}搭配使用
  2. ```javascript
  3. //例子
  4. let n = 1;
  5. while (true) {
  6. if (n * n > 456789) {
  7. console.log(n);
  8. break;
  9. }
  10. n++;
  11. }

for循环和while循环的区别

  1. 当如果明确循环的次数的时候推荐使用for循环
  2. 不明确循环的次数的时候推荐使用while循环

流程控制语句综合

  1. //猜数字
  2. let answer = parseInt(Math.random() * 98) + 2;
  3. let min = 1;
  4. let max = 100;
  5. // 为了不断地循环,使用死循环
  6. while (true) {
  7. let num = +prompt(`请猜测数字,在${min}~${max}之间`);
  8. if (num <= min || num >= max) {
  9. alert("输入的数字不在范围内");
  10. // 跳过本次循环,开启下一次迭代
  11. continue;
  12. }
  13. // 范围的最小值和最大值,为了方便提示用户区间
  14. if (num > answer) {
  15. alert("您输入的数字太大了");
  16. // 因为用户输入的数字太大,所以可以将最大范围设置为用户输入的数字
  17. max = num
  18. } else if (num < answer) {
  19. alert("您输入的数字太小了");
  20. // 因为用户输入的数字太小,所以可以将最小范围设置为用户输入的数字
  21. min = num;
  22. } else {
  23. alert("您答对了");
  24. // 结束循环
  25. break;
  26. }
  27. }

注意

  • 在JavaScript中,所有代码指令都会以分号结尾 (;) — 如果忘记加分号,你的单行代码可能执行正常,但是在多行代码在一起的时候就可能出错。所以,最好是养成主动以分号作为代码结尾的习惯。 (以后有工具统一格式化)