js基础知识(编写位置、注释、字面量、标识符、数据类型、类型转换、运算符、流程控制)

111 阅读16分钟

js特点

  • 解释型语言—-直接运行不需要编译
  • 类似c和java的语法结构
  • 动态语言—-变量类型任意
  • 基于原型的面向对象

输出语句

  • alert("要输出的内容");

    • 该语句会在浏览器窗口中弹出一个警告框
  • document.write("要输出的内容");

    • 该内容将会被写到body标签中,并在页面中显示
  • console.log("要输出的内容");

    • 该内容会被写到开发者工具的控制台中

编写位置

写到标签的指定属性中

js代码,虽然可以写在标签的属性中,但是它们属于结构与行为耦合,不方便维护,不推荐使用。

1、οnclick="alert('点击事件。');"

<button onclick="alert('讨厌,你点我干嘛~~');">点我一下</button>

2、超链接的href属性

  <a href="javascript:alert('让你点你就点!!');">你也点我一下</a>
  <a href="javascript:;">你也点我一下</a>

写在script标签中

  <script type="text/javascript"> 
      alert("我是script标签中的代码!!");  
   </script>

写在外部文件中

<!--
  可以将js代码编写到外部js文件中,然后通过script标签引入
  写到外部文件中可以在不同的页面中同时引用,也可以利用到浏览器的缓存机制
  !!!推荐使用
-->
<!--
  script标签一旦用于引入外部文件了,就不能在编写代码了,即使编写了浏览器也会忽略
  如果需要则可以再创建一个新的script标签用于编写内部代码
-->

<script type="text/javascript" src="js/script.js"></script>

基本语法

单行注释、多行注释

//

/* */

JS严格区分大小写;js语句以分号结尾;js会自动忽略空格

字面量和变量

image.png

image.png

标识符

  • 在JS中所有的可以由我们自主命名的都可以称为是标识符,例如:变量名、函数名、属性名都属于标识符
  • 命名一个标识符时需要遵守如下的规则:
    1. 标识符中可以含有字母、数字、_、$
    2. 标识符不能以数字开头
    3. 标识符不能是ES中的关键字或保留字
    4. 标识符一般都采用驼峰命名法
      • 首字母小写,每个单词的开头字母大写,其余字母小写 helloWorld xxxYyyZzz
  • JS底层保存标识符时,实际上是采用的Unicode编码, 所以理论上讲,所有的utf-8中含有的内容都可以作为标识符(包含中文)

image.png

数据类型

  • 数据类型指的就是字面量的类型

  • 在JS中一共有六种数据类型

    • 1、String 字符串
    • 2、Number 数值
    • 3、Boolean 布尔值
    • 4、Null 空值
    • 5、Undefined 未定义
    • 6、Object 对象
  • 其中String Number Boolean Null Undefined属于基本数据类型

  • 而Object属于引用数据类型

String字符串

  • 在JS中字符串需要使用引号引起来
  • 使用双引号或单引号都可以,但是不要混着用
  • 引号不能嵌套,双引号不能放双引号,单引号不能放单引号
str = "我说:"今天天气真不错!"";   //报错

修改为:

str = "我说:"今天\t天气真不错!"";
or
str = '我说:"今天天气真不错!"';

image.png

Number

  • 在JS中所有的数值都是Number类型,包括整数和浮点数(小数)

  • 数字的最大值

    • Number.MAX_VALUE

      1.7976931348623157e+308

    • Number.MIN_VALUE 大于0的最小值

      5e-324

    • 如果使用Number表示的数字超过了最大值,则会返回一个

      • Infinity 表示正无穷
      • -Infinity 表示负无穷
      • 使用typeof检查Infinity也会返回number
    • NaN 是一个特殊的数字,表示Not A Number

      • 使用typeof检查一个NaN也会返回number
  • 其他进制的数字的表示:

    • 0b 开头表示二进制,但是不是所有的浏览器都支持
    • 0 开头表示八进制
    • 0x 开头表示十六进制
  • 运算符 typeof ——检查一个变量的类型

    • 语法:typeof 变量
    • 检查字符串时,会返回string
    • 检查数值时,会返回number(包含Infinity、NAN)
  • 运算

    • 在JS中整数的运算基本可以保证精确

    • 如果使用JS进行浮点运算,可能得到一个不精确的结果

    • 所以千万不要使用JS进行对精确度要求比较高的运算

    • 运算最终要转为二进制运算,二进制无法表示1/10

image.png

布尔值

image.png

Null和Undefined

image.png

Object(引用数据类型)

对象是JS中的引用数据类型

对象是一种复合数据类型,在对象中可以保存多个不同数据类型的属性

使用typeof检查一个对象时,会返回object

对象的分类

  • 内建对象:由ES标准中定义的对象,在任何的ES的实现中都可以使用,比如:Math、String、Number、Boolean、Function、Object ...

  • 宿主对象:由JS的运行环境提供的对象,目前来讲主要指由浏览器提供的对象,比如 BOM DOM。如:console、document

  • 自定义对象:由开发人员自己创建的对象。

创建对象

  • 方式一:
    • var obj = new Object();
  • 方式二:使用对象字面量{},更简洁
    • var obj = {};

向对象中添加属性

  • 语法:

    对象.属性名 = 属性值;

    对象["属性名"] = 属性值;

  • 属性名没有任何要求,不需要遵守标识符的规范,但是在开发中,尽量按照标识符的要求去写。

  • 属性值也可以任意的数据类型,甚至也可以是一个对象。

读取对象中的属性

  • 语法:
    • 对象.属性名

    • 对象["属性名"]—属性名特殊时

      obj["nihao"]="你好"

  • 如果读取一个对象中没有的属性,它不会报错,而是返回一个undefined

删除对象中的属性

  • 语法:

    delete 对象.属性名

    delete 对象["属性名"]

使用in检查对象中是否含有指定属性

  • 语法:"属性名" in 对象
  • 如果在对象中含有该属性,则返回true,如果没有则返回false

使用对象字面量,在创建对象时直接向对象中添加属性

语法:

var obj = {

    属性名:属性值,

    属性名:属性值,

    属性名:属性值,

    属性名:属性值

    }

基本数据类型和引用数据类型

  • 基本数据类型

    String Number Boolean Null Undefined

  • 引用数据类型

    Object

  • 基本数据类型的数据,变量是直接保存的它的值,保存在

    变量与变量之间是互相独立的,修改一个变量不会影响其他的变量。

  • 引用数据类型的数据,变量是保存的对象的引用(内存地址)(引用存在中),保存在

    如果多个变量指向的是同一个对象,此时修改一个变量的属性,会影响其他的变量。

  • 比较两个变量时,对于基本数据类型,比较的就是值,

    对于引用数据类型比较的是地址,地址相同才相同

类型转换

类型转换就是指将其他的数据类型,转换为String、Number 或 Boolean

转换为String

  • 方式一(强制类型转换):调用被转换数据的toString()方法
    • 该方法不会影响到原变量,它会将转换的结果返回

    • 注意:null和undefined这两个值没有toString()方法,

      如果调用它们的toString()方法,会报错!

    • 例子:

      var a = 123;
      a = a.toString();
      

image.png

  • 方式二(强制类型转换):调用String()函数
    • 原理:

      对于Number Boolean String都会调用他们的toString()方法来将其转换为字符串,

      对于null值,直接转换为字符串"null"。

      对于undefined直接转换为字符串"undefined"

    • 例子:

      var a = 123;
      a = String(a);
      

image.png

  • 方式三(隐式的类型转换): 为任意的数据类型 +""
    • 原理:和String()函数一样

    • 例子:

      var a = true;
      a = a + "";
      

转换为Number

  • 方式一(强制类型转换):调用Number()函数
    • 例子:

      var s = "123";
      s = Number(s);
      
    • 转换的情况:

      1.字符串 --> 数字 - 如果字符串是一个合法的数字,则直接转换为对应的数字 - 如果字符串是一个非法的数字,则转换为NaN - 如果是一个空串或纯空格的字符串,则转换为0

      2.布尔值 --> 数字 - true转换为1 - false转换为0

      3.空值 --> 数字 - null转换为0

      4.未定义 --> 数字 - undefined 转换为NaN

image.png

  • 方式二(强制类型转换):调用parseInt()parseFloat()
    • 这两个函数专门用来将一个字符串转换为数字的

    • parseInt()

      • 可以将一个字符串中的有效的整数位提取出来,并转换为Number
      • 例子:
      var a = "123.456px";
      a = parseInt(a); //123
      
      • 如果需要可以在parseInt()中指定一个第二个参数,来指定进制
    • parseFloat()

      • 可以将一个字符串中的有效的小数位提取出来,并转换为Number
      • 例子:
      var a = "123.456px";
      a = parseFloat(a); [//123.456](//123.456)
      

image.png

image.png

  • 方式三(隐式的类型转换):使用**一元的+**来进行隐式的类型转换
    • 例子:

      var a = "123";
      a = +a;
      
    • 原理:和Number()函数一样

转换为布尔值

  • 方式一(强制类型转换):使用Boolean()函数
    • 例子:

      var s = "false";
      s = Boolean(s); //true
      
    • 转换的情况

      字符串 --> 布尔 - 除了空串其余全是true

      数值 --> 布尔 - 除了0和NaN其余的全是true

      null、undefined ---> 布尔 - 都是false

      对象 ---> 布尔 - 都是true

image.png

  • 方式二(隐式类型转换): 为任意的数据类型做两次非运算,即可将其转换为布尔值
    • 例子:

      var a = "hello";
      a = !!a; //true
      

运算符

运算符也称为操作符,通过运算符可以对一个或多个值进行运算或操作

typeof运算符

  • 用来检查一个变量的数据类型
  • 语法:typeof 变量
  • 它会返回一个用于描述类型的字符串作为结果

算数运算符

  • +对两个值进行加法运算并返回结果
  • -对两个值进行减法运算并返回结果
  • *对两个值进行乘法运算并返回结果
  • / 对两个值进行除法运算并返回结果
  • % 对两个值进行取余运算并返回结果
  • 除了加法以外,对非Number类型的值进行运算时,都会先转换为Number然后在做运算。
  • 而做加法运算时,如果是两个字符串进行相加,则会做拼串操作,将两个字符连接为一个字符串。
  • 任何值和字符串做加法,都会先转换为字符串,然后再拼串

一元运算符

  • 一元运算符只需要一个操作数

  • 一元的+

    • 就是正号,不会对值产生任何影响,但是可以将一个非数字转换为数字

    • 例子:

      var a = true;
      a = +a;
      
  • 一元的-

    • 就是负号,可以对一个数字进行符号位取反

    • 例子:

      var a = 10;
      a = -a;
      
  • 自增

    • 自增可以使变量在原值的基础上自增1

    • 自增使用 ++

    • 自增可以使用 前++(++a)后++(a++)

    • 无论是++a 还是 a++都会立即使原变量自增1

      不同的是++a和a++的值是不同的,

      ++a的值是变量的新值(自增后的值)
      
      a++的值是变量的原值(自增前的值)
      
  • 自减

    • 自减可以使变量在原值的基础上自减1

    • 自减使用 --

    • 自减可以使用 前--(--a)后--(a--)

    • 无论是--a 还是 a--都会立即使原变量自减1

      不同的是--a和a--的值是不同的,

      --a的值是变量的新值(自减后的值)
      
      a--的值是变量的原值(自减前的值)
      

逻辑运算符

  • !

    • 非运算可以对一个布尔值进行取反,true变false false边true
    • 当对非布尔值使用!时,会先将其转换为布尔值然后再取反
    • 我们可以利用!来将其他的数据类型转换为布尔值
  • &&

    • &&可以对符号两侧的值进行与运算

    • 只有两端的值都为true时,才会返回true。只要有一个false就会返回false。

    • 与是一个短路的与,如果第一个值是false,则不再检查第二个值

    • 对于非布尔值,它会将其转换为布尔值然后做运算,并返回原值

    • 规则:

      1.如果第一个值为false,则返回第一个值

      2.如果第一个值为true,则返回第二个值

      1 && 3:第一个为true,返回第二个(3
  • ||

    • ||可以对符号两侧的值进行或运算

    • 只有两端都是false时,才会返回false。只要有一个true,就会返回true。

    • 或是一个短路的或,如果第一个值是true,则不再检查第二个值

    • 对于非布尔值,它会将其转换为布尔值然后做运算,并返回原值

    • 规则:

      1.如果第一个值为true,则返回第一个值

      2.如果第一个值为false,则返回第二个值

赋值运算符

  • =

    • 可以将符号右侧的值赋值给左侧变量
  • +=

    • a += 5 相当于 a = a+5
    • var str = "hello"; str += "world";
  • -=

    • a -= 5 相当于 a = a-5
  • *=

    • a *= 5 相当于 a = a**5
  • /=

    • a /= 5 相当于 a = a/5
  • %=

    • a %= 5 相当于 a = a%5

关系运算符

  • 关系运算符用来比较两个值之间的大小关系的

  • 关系运算符的规则和数学中一致,用来比较两个值之间的关系,

    如果关系成立则返回true,关系不成立则返回false。

  • 如果比较的两个值是非数值,会将其转换为Number然后再比较。

  • 如果比较的两个值都是字符串,此时会比较字符串的Unicode编码,而不会转换为Number。

相等运算符

  • ==

    • 相等,判断左右两个值是否相等,如果相等返回true,如果不等返回false
    • 相等会自动对两个值进行类型转换,如果对不同的类型进行比较,会将其转换为相同的类型然后再比较,转换后相等它也会返回true
    • null == undefined //true
    • NaN==NaN //false
  • !=

    • 不等,判断左右两个值是否不等,如果不等则返回true,如果相等则返回false
    • 不等也会做自动的类型转换。
  • ===

    • 全等,判断左右两个值是否全等,它和相等类似,只不过它不会进行自动的类型转换,

      如果两个值的类型不同,则直接返回false

      +0===-0 //true

      NaN===NaN //false

      null === undefined //false

  • !==

    • 不全等,和不等类似,但是它不会进行自动的类型转换,如果两个值的类型不同,它会直接返回true

特殊的值:

  • null和undefined

    • 由于undefined衍生自null,所以null == undefined 会返回true

    • 但是 null === undefined 会返回false。

  • NaN

    • NaN不与任何值相等,包括它自身 NaN == NaN //false
  • 判断一个值是否是NaN

    • 使用isNaN()函数
  • Object.is():与===基本一致(Object.is(+0,-0) false;Object.is(NaN,NaN) true)

三元运算符:

  • ?:
    • 语法:条件表达式?语句1:语句2;

    • 执行流程:

      先对条件表达式求值判断,

      如果判断结果为true,则执行语句1,并返回执行结果
      
      如果判断结果为false,则执行语句2,并返回执行结果
      

优先级:

  • 和数学中一样,JS中的运算符也是具有优先级的,

    比如 先乘除 后加减 先与 后或

  • 具体的优先级可以参考优先级的表格,在表格中越靠上的优先级越高,

    优先级越高的越优先计算,优先级相同的,从左往右计算。

  • 优先级不需要记忆,如果越到拿不准的,使用()来改变优先级。

从上到下,优先级递减

image.png

流程控制语句

  • 程序都是自上向下的顺序执行的,

    通过流程控制语句可以改变程序执行的顺序,或者反复的执行某一段的程序。

  • 分类:

    1.条件判断语句

    2.条件分支语句

    3.循环语句

条件判断语句

  • 条件判断语句也称为if语句

  • 语法一:

    if(条件表达式){
      语句...
    }
    
    • 执行流程:

      if语句执行时,会先对条件表达式进行求值判断,

      如果值为true,则执行if后的语句
      
      如果值为false,则不执行
      
  • 语法二:

    if(条件表达式){
      语句...
    }else{
      语句...
    }
    
    • 执行流程:

      if...else语句执行时,会对条件表达式进行求值判断,

      如果值为true,则执行if后的语句
      
      如果值为false,则执行else后的语句
      
  • 语法三:

    if(条件表达式){
      语句...
    }else if(条件表达式){
      语句...
    }else if(条件表达式){
      语句...
    }else if(条件表达式){
      语句...
    }else{
      语句...
    }
    
    • 执行流程
      • if...else if...else语句执行时,会自上至下依次对条件表达式进行求值判断,

          如果判断结果为true,则执行当前if后的语句,执行完成后语句结束。
        
          如果判断结果为false,则继续向下判断,直到找到为true的为止。
        
          如果所有的条件表达式都是false,则执行else后的语句
        

条件分支语句

  • switch语句
    • 语法:

      switch(条件表达式){
        case 表达式:
          语句...
          break;
        case 表达式:
          语句...
          break;
        case 表达式:
          语句...
          break;
        default:
          语句...
          break;
      }
      
    • 执行流程:

      • switch...case...语句在执行时,会依次将case后的表达式的值和switch后的表达式的值进行全等比较,

          如果比较结果为false,则继续向下比较。如果比较结果为true,则从当前case处开始向下执行代码。
        
          如果所有的case判断结果都为false,则从default处开始执行代码。
        

循环语句

  • 通过循环语句可以反复执行某些语句多次

  • while循环

    • 语法:

      while(条件表达式){
        语句...
      }
      
    • 执行流程:

      while语句在执行时,会先对条件表达式进行求值判断,

      如果判断结果为false,则终止循环

      如果判断结果为true,则执行循环体

      循环体执行完毕,继续对条件表达式进行求值判断,依此类推

  • do...while循环

    • 语法:

      do{
        语句...
      }while(条件表达式)
      
    • 执行流程

      do...while在执行时,会先执行do后的循环体,然后在对条件表达式进行判断,

      如果判断判断结果为false,则终止循环。
      
      如果判断结果为true,则继续执行循环体,依此类推
      
  • 和while的区别:

    while:先判断后执行

    do...while: 先执行后判断

    • do...while可以确保循环体至少执行一次。
  • for循环

    • 语法:

      for(①初始化表达式 ; ②条件表达式 ; ④更新表达式){
        ③语句...
      }
      
    • 执行流程:

      首先执行①初始化表达式,初始化一个变量,

      然后对②条件表达式进行求值判断,如果为false则终止循环

      如果判断结果为true,则执行③循环体

      循环体执行完毕,执行④更新表达式,对变量进行更新。

      更新表达式执行完毕重复②

  • break

    break关键字,可以用来退出switch或循环语句,不能在if语句中使用break和continue。

    break关键字,会立即终止离它最近的那个循环语句。

  • label

    可以为循环语句创建一个label,来标识当前的循环。

    • 使用break语句时,可以在break后跟着一个label,这样break将会结束指定的循环,而不是最近的。

image.png

  • continue

    continue关键字可以用来跳过当次循环,同样continue也是默认只会对离它最近的循环循环起作用。

  • 死循环

    while(true){
    }
    for(;;){
    }
    

计时器:console.time()、console.timeEnd()

//求质数的例子--改进后的例子
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript">
      //测试如下的程序的性能
      //在程序执行前,开启计时器
      //console.time("计时器的名字") // 可以用来开启一个计时器
      //它需要一个字符串作为参数,这个字符串将会作为计时器的标识
      console.time("test");
 
      //打印2-100之间所有的数
      for (var i = 2; i <= 100000; i++) {
        var flag = true;
        for (var j = 2; j <= Math.sqrt(i); j++) {
          if (i % j == 0) {
            //如果进入判断则证明i不是质数,修改flag值为false
            flag = false;
            //一旦进入判断,则证明i不可能是质数了,此时循环再执行已经没有任何意义了
            //使用break来结束循环
            break;
            //不加break 215ms
            //加break 25ms
            //修改j<=后 2.6
          }
        }
        //如果是质数,则打印i的值
        if (flag) {
          //console.log(i);
        }
      }
 
      //终止计时器
      //console.timeEnd()用来停止一个计时器,需要一个计时器的名字作为参数
      console.timeEnd("test");
 
      /*
       * 36
       * 1 36
       * 2 18
       * 3 12
       * 4 9
       * 6 6
       */
      //可以通过Math.sqrt()对一个数进行开方
      var result = Math.sqrt(97);
      console.log("result = " + result)
    </script>
  </head>
  <body>
  </body>
</html>

参考:blog.csdn.net/weixin_4494…