js基础--变量与流程控制

123 阅读6分钟

Javascript

诞生

布兰登·艾奇 (Brendan Eich) 只用了10天就将这个JavaScript语言设计出来了。Eich后来说这10天他都没怎么休息,听这个话有一丝抱怨在里面,可以想象得到的是,一方面是设计目标与自己的设想不对付,一方面是开发进度要求很高。Eich当时在心情不太好的情况下,难免有完成任务交差的嫌疑。这也埋下了JavaScript语言先天不足的隐患。最后这10天赶货赶出来的JavaScript是一个大杂烩,语法有多个来源。

(1)基本语法:借鉴 C 语言和 Java 语言。

(2)数据结构:借鉴 Java 语言,包括将值分成原始值和对象两大类。

(3)函数的用法:借鉴 Scheme 语言和 Awk 语言,将函数当作第一等公民,并引入闭包。

(4)继承模型:借鉴 Self 语言(Smalltalk 的一种变种)。

(5)正则表达式:借鉴 Perl 语言。

(6)字符串和数组处理:借鉴 Python 语言。

是什么

JavaScript 是一门跨平台、面向对象的动态的

弱类型的轻量级解释型语言。

特点

  • 弱类型
  • 基于对象-一切皆对象
  • 解释型-即时编译型
  • 事件驱动
  • 单线程/异步

应用场景

  • 跨平台:pc/移动端

  • 游戏

  • h5

  • 网页动画效果

  • 连接服务器-PostgreSQL

  • 桌面端应用

  • 开发服务器nodejs

  • app

  • 操作数据库-

    .....

版本

Es5 \ es6(后面版本泛指)

组成部分

  • ECMAScript 基本语法
  • BOM 浏览器对象模型
  • DOM 文档对象模型

后缀

.js

引入方式

  • 嵌入式

    <script></script>
    

    在使用行内 JavaScript代码时,要注意代码中不能出现字符串 </script>。比如,下面的代码会导 致浏览器报错:

    <script>
    function sayHi() {
    console.log("</script>");
    }
    </script>
    

    vscode

    Snipaste_2023-04-13_10-18-27.png 页面渲染

Snipaste_2023-04-13_10-19-36.png

  • 外部引入

    <script src="js路径"></script>
    

    上述代码不报错

注释

// 单行注释 ctrl + /

/*
*多行注释
*/

Better Comments 插件

代码注释高亮vscode插件

Snipaste_2023-04-13_09-59-49.png

输入输出工具

ECMAScript,即 ECMA-262定义的语言,并不局限于 Web浏览器。事实上,这门语言没有输入和 输出之类的方法。 Web 浏览器是 ECMAScript 实现可能存在的一种宿主环境。浏览器为ECMAScript提供扩展--DOM操作

方法 :document.write()在页面中输出内容alert()在页面中弹出

console.log()在控制台输出内容

prompt()输入工具:弹窗输入内容

变量

变量是存放数据的容器

es5:var 声明变量

es6:let 声明变量

const: 声明一次,不可改变

变量命名规则

  • 严格区分大小写
  • 必须以字母 _ $ 开头,不能以数字开头,中文命名
  • 不能用关键字或者保留字
  • 命名习惯:首字母大写或驼峰命名
  • 命名有意义

关键字

  • 关键字
breakdointypeofcaseelseinstanceofvarcatchexport
newvoidclassextendsreturnwhilecontinueforswitchyield
debuggerfunctionthisdefaultifthrowdeleteimporttry
  • 未来的保留字

    虽然在语言中没有特定用途,但它们是保留给将来做关键字用的。

  • 严格模式下保留

implementspackagepublic
interfaceprotectedstatic
letprivate
  • 模块代码中保留: await

严格模式是一种不同的 JavaScript 解析和执行模型,一些不规范写法在这种模式下会被处理,对于不安全的活动将抛出错误。

要对 整个脚本启用严格模式,在脚本开头加上这一行:

"use strict";

也可以单独指定一个函数在严格模式下执行,只要把这个预处理指令放到函数体开头即可:

function doSomething() {
"use strict";
// 函数体
}

声明:

  • 声明的同时赋值

    var num= 10;
    var name = "张三";
    
  • 先声明后赋值

    var num;
    num=10;
    
  • 声明多个变量,中间用逗号隔开:

    var a,b,c;
    //
    var a=10,b=20,c=30;
    

数据类型

数据类型分类:

  • 初始数据类型:

    undefindes,null,number,string,boolean,Symbol(es6代表独一无二的值)

  • 引用数据类型

    object

    {}对象,[]数组,function(){}函数

检测数据类型

typeof 要检测的数据

数据类型结果
undefinedundefined
nullobject
10number
“张三”string
true/flaseboolean
Symbol()symbol
{}object
[]object
function(){}function

变量的内存划分

js内存分为栈区和堆区

栈区存储初始数据类型(FILO)

堆区存储引用数据类型

初始数据类型更新变量会直接替代变量的值

引用数据类型更新变量会改变引用地址

运算符

  • 算术运算符
  • 关系(比较)运算符
  • 赋值运算符
  • 逻辑运算符
  • 一元运算符
  • 三元运算符
  • 特殊运算符

运算符规则

+-*/% ** ++ --

+:运算,字符串拼接

如果可以转换为数字,那么就转换数字

不行,就转换为NaN。

运算规则如下:

  • undefined -> NaN
  • null-> 0
  • true->1
  • flase->0
  • 除加号以外 "" ->0
  • 任意数据类型与字符串相加都属于字符串拼接
var num = 10;
console.log(num++);//10   console (++num); //11
console.log(num--);//10   console (--num); //9

关系运算符

<,>,>=,<=,==,!=,===(全等),!==(不全等)

比较过程中转不了就是flase

  • undefined ->NaN
  • NULL->0
  • true->1
  • flase->0
  • true/flase 比较的时候先转换再比较
  • 等于判断 null 不进行转换
  • 字符串与字符串比较,比较的是对于ASCII码

特殊记忆

null == undefined//true

NaN == NaN //flase

== 和 ===的区别:

==值相等

=== 值相等,类型相等

赋值运算符

= ,+=,*=,-=,**=,/=,%=

+= 和算术运算符类似,+可以用作字符串拼接

var n=10;
n+=10; //相当于n=n+10;
console.log(n); //20

逻辑运算符

&& ,||或, !非

&& 都真为真

||都假为假,一真为真

!:取反,

短路原则:

  • && 前假后不执行;
  • ||前真后不执行;

三元运算符

特殊运算符

  • 逗号,

    var a,b,c;
    
  • 括号()

(10+2)*3
!(null == "" || 100>"a")

流程控制

流程:代码执行顺序。

  • 顺序结构:代码从上到下执行
  • 选择结构:根据给定的条件有选择执行
  • 循环结构:根据给定的条件反复执行

选择结构

  • if分支

    • 单路分支

      if(条件表达式){
        // 条件表达式成立执行
      }
      
    • 双路分支

      if(条件表达式){
        // 条件成立执行
      } else {
        // 条件不成立执行
      }
      
    • 多路分支

      if(条件1){
        // 条件1成立执行
      } else if(条件2){
        // 条件1不成立,条件2成立执行
      } else if(条件3){
        // 条件1、条件2不成立,条件3成立执行
      } else {
        // 条件1、条件2、条件3都不成立执行
      }
      
    • 嵌套分支

      if(条件1){
        // 条件1成立执行
        if(条件2){
           // 条件1、条件2都成立
           if(){........}
        } else if(条件3){
            // 条件1、条件3都成立
        } else {
            // 、条件2、条件3都不成立
        }
      } else {
         // 条件1不成立执行
      }
      
      
  • switch分支

    switch(需要判断的值){
      case1:
         执行内容
         break;
      case2:
         执行内容
         break;
      default:
        执行内容
    }
    

    if与switch选择:

    • 如果需要判断条件,选择if
    • 如果判断的是单个值,选择switch

循环结构

  • for 循环

    for(初始值;终止条件;步进值){
      // 循环体
    }
    
    // 循环输出0-10
    for(var i=0;i<11;i++){
      console.log(i)
    }
    

    break:终止当前循环

    continue:跳过当前循环

  • for...in 循环

    let obj = {
        a: 'a1',
        b: 'b2',
        c: 'c3',
    
    }
    for (const key in obj) {
        console.log(key);
    }
    //=>abc
    
    let str =  'abc'
    for (const key in str) {
        console.log(key);
    }
    //=>123
    
  • for...of 循环

    let arr= [2, 4, 6, 8]
    
    for (const el of ) {
        console.log(el);
    }
    //=>2468
     let str =  'abc'
    for (const el of  str) {
        console.log(el);
    }
    //abc
    
  • while 循环

    while(条件表达式){
      // 循环体
    }
    
    // 循环输出0-10
    var i=0;
    while(i<11){
      console.log(i);
      i++
    }
    
  • do...while 循环

    do{
      // 循环体
    }while(终止条件)
    
    // 0-10
    var i=0;
    do{
      console.log(i);
      i++
    }while(i<11)