前言:纯手打!!!按照自己思路重写!!!这次是二刷了,想暑假做一次完整的笔记,但用本子来写笔记的话太贵了,可能哪天还丢了。。所以还是博客好==


第三章:基本概念(语法、数据类型、流控制语句、函数)


3.1 语法:

  ECMAScript的语法大量借鉴了C及其他语言。

3.1.1 区分大小写

3.1.2 标识符:

  指的是变量、函数、属性的名字、函数的参数。注意:首字符必须是一个字母、下划线、或者美元$符号。

  ES标识符采用驼峰大小写格式(首字母小写,其他单词的首字母大写,如:setData),不可以把关键字、保留字、true、false、null作为标识符。

3.1.3 注释:

  单行注释: //

  块级注释: /* *内容 */

3.1.4 严格模式:对某些不安全的操作抛出错误

  在脚本中启动严格模式,可以在其顶部写一行代码:"use strict" 。

3.1.5 语句:

  以分号结尾,其实也可以不写,但最好写。。。

3.2 关键字和保留字:(这些都不可以作为标识符)

  关键字大致为:  break、else、new、var、 case、  finally 、 return、 void 、 catch  、for  、switch 、 while 、 continue、  function  、this 、 with 、default 、 if 、 throw 、 delete 、 in 、  try 、do 、 instranceof、  typeof。。。

  保留字大致位: abstract 、 enum   、int 、 short 、 boolean  、export  、interface、  static、  byte  、extends 、 long 、 super 、 char 、 final  、native  、synchronized 、 class  、float 、 package  、throws 、 const  、goto  、private 、transient 、 debugger 、 implements  、protected 、 volatile 、 double  、import  、public、class、entends、super、const、export、import、let、public。。。、

3.3 变量:

  • var message;   即定义一个变量,该变量成为该变量作用域中的局部变量,此变量未初始化,会保存一个值----undefined、
  • var message = "hi";
  • message = "hi";   全局变量

3.4 数据类型:

  • 五种简单数据类型(即基本数据类型):Undefined、Null、Boolean、Number、String
  • 一种复杂数据类型:Object

3.4.1 typeof操作符:

  检测给定变量的数据类型——typeof

  • “undefined”——如果这个值未定义;
  • “boolean”——如果这个值是布尔值;
  • “string"——如果这个值是字符串;
  • ”number“——如果这个值是数值;
  • ”object”——如果这个值是对象或者null;
  • “function"——如果这个值是函数!!!虽然函数是对象,但可以通过typeof区分是不是函数。

  如:var message = "some string";

    alert(type of message);  //"string"

    alert(type of null);  //”object"

3.4.2 Underfined类型:

      var message; var message1 = undefined; var age

   alert(message == undefined);  //true

   alert(message);  //undefined

      alert(age);  //产生错误

    alert(message1 == underfined);  //true

3.4.3 Null类型:

   null值表示一个空对象指针,所以用typeof检测会返回“object”。

   var car = null;

   alert(typeof car);  //"object"

   !!!注意 undefined值是派生自null值的,所以 alert(null == undefined);  //true

3.4.4 Boolean类型:

  该类型只有两个字面值:true和false。

数据类型

转换为true的值

转换为false的值

Boolean

true

false

String

任何非空字符串

" "(空字符串)

Number

任何非0数字值(包括无穷大)

0和NaN

Object

任何对象

null

Undefined

n/a(不适用)

undefined

  这些转换规则对理解流控制语句(如if语句)自动执行相应的Boolean转换非常重要:

  var mesage = "Hello World";

  if (message) {  // 这个message自动转换了对应的Boolean值——ture

    alert("Value is true");

  }

3.4.5 Number类型:

  数值字面量格式:(在进行算术计算时,所有八进制和十六进制表示的数值最终都将被转换成十进制数值)

  • 十进制整数:var intNum = 55;
  • 八进制:(严格模式下无效)第一位是0,然后是八进制数字序列(0~7),若超过7,则第一位的0被忽略,

   后面的数值被当作十进制来看,var octalNum1 = 070;  //八进制的56          var octalNum2 = 079;  //无效的八进制,解析为79

  • 十六进制:前2位必须是0x,后跟任何十六进制数字(0~9及A~F 字母可大小写)

  浮点数值: 简单的不说,说说 var floatNum = 3.125e7;  //等于31250000,即3.125乘以10的七次方。

  0.1 + 0.2 结果不是0.3,而是0.30000000000000004,所以在进行算术计算时其精确度远远不如整数,所以最好不要做以下测试:
  if (a + b == 0.3) {
    alert ("You got 0.3" );
  }
  
  数值范围:有规定最大最小值,若超出,则转换成负无穷(-Infinity),正无穷(Infinity)。
  
  NaN:即非数值,它是一个特殊的数值。表示一个本来要返回数值的操作数未返回数值的情况(这样子就不会抛出错误)
     任何涉及NaN的操作都会返回NaN,NaN与任何值都不相等,包括NaN本身。 alert (NaN == NaN);  //false
     !!!所以ES定义了 isNaN() 函数,这个函数接受一个任何类型的参数,函数可以帮我们确定这个参数是否“不是数值”,某些不是数值的值会被自动直接地转换为数值。
     alert (isNaN(NaN));  //true,表示这个不是数值
     alert (isNaN(10));  //false,表示10是数值
        alert (isNaN(“10”));  //false,表示可以被转换成数值10
     alert (isNaN(“blue"));  //true,表示这个不能转换成数值
     alert (isNaN(true));  //false,表示可以转换成数值1
 
  数值转换:有三个函数可以把非数值转换成数值
 
 
 

  Number() :可以用于任何数据类型,转型函数将其转换为数值。

    • var num1 = Number(”Hello Wordl“);  //NaN,即字符串中若包含除了数字的字符,则将其转换为NaN
    • var num2 = Number(” “);        //0
    • var num3 = Number(”000011“);        //11,前面的0被忽略
    • var num4 = Number(true);   //1
    • var num5 = Number(null);  //0
    • var num6 = Number(undefined);  //NaN
    • 如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。若转换的结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串。

  parseInt():处理整数的时候常用:

    • var num1 = parseInt(”1234blue“);  //1234,忽略blue
    • var num2 = parseInt(” “);        //NaN,和Number()不同,因为parseInt()会拼命找第一个非空格字符。
    • var num3 = parseInt(”0xA“, 16);        //10(十六进制数转十进制)
    • var num4 = parseInt(22.5);   //22
    • var num5 = parseInt(”070“ ,8);  //56(八进制数转十进制)
    • var num6 = parseInt(”70“ ,10);  //70

  parseFloat() :与parseInt()的相似与区别是  都是从第一个字符开始解析,只认识一个小数点,会忽略一开始的0,只识别十进制,而十六进制的字符串会被转换为0

    • var num1 = parseFloat(”1234blue“);  //1234
    • var num2 = parseFloat(”0xA“);  //0,不认识十六进制~
    • var num3 = parseFloat(”22.4.33“);  //22.4
    • var num4 = parseFloat(”0202.4“);  //202.4
    • var num5 = parseFloat(”3.125e7“);  //31250000

3.4.6 string类型:即字符串

  可以由双引号和单引号表示。

  • String数据类型包含一些特殊的字符字面量(转义序列),用于表示非打印字符。常用的有:

  \n 表示换行,\t 表示制表,\b表示退格,\r表示回车,\\表示斜杠,\'表示单引号,\"表示双引号,\xnn表示以十六机制代码nn表示的一个字符(n为0~F),\unnnn表示以十六进制代码nnnn表示的一个Unicode字符(n为0~F)。

  !!!注意,n个字符长的转移序列只表示一个字符(在length里表示1)

  • 将一个值转换为字符串:有两种方法

    • toString()方法:返回相应值的字符串表现,相应值可以是数值、布尔值、对象和字符串值(返回字符串的一个副本)!但null和undefined值没有这个方法。

        可传参也可以不传参,参数表示以n进制格式(基数)返回数值,默认不填为十进制。

      var num = 10;

      alert (num.toString());  // "10"

      alert (num.toString(2));  // "1010"

      alert (num.toString(8));  // "12"

      alert (num.toString(10));  // "10"

      alert (num.toString(16));  // "a"

    • String()转型函数:在不知道要转换的值是不是null或undefined时可以使用。这个函数可以将任何类型的值转换为字符串!

      • 如果值有toString() 方法,则调用该方法并返回相应的结果。
      • var value1 = true;  alert(String(value1));  // “true" ,一个副本
      • var value2 = null;   alert(String(value2));  // "null" ,因为null没有toString()方法所以String()函数就返回了这个值的字面量"null"。
      • var value3;  alert(String(value3));  // ”undefined“ ,因为undefined没有toString()方法所以String()函数就返回了这个值的字面量”undefined“。

3.4.7 Object类型:就是对象!即一组数据和功能的集合。

  对象可以通过执行new操作符后跟要创建的对象类型的名称来创建,即 var o = new Object (); 如果不用给构造函数传参,也可以这么写:var o = new Object;但不推荐。

  关于Object的每个实例的具体属性和方法,第五、六章再讨论。

3.5 操作符:

  是用于操作数据值的操作符,包括算术操作符、位操作符、关系操作符、相等操作符。

3.5.1 一元操作符:

  • 前置操作符: var age = 29; ++age;  age变量的值都是在语句被求值以前改变的。
  • 后置操作符: var price = 29; price++;  price变量的值都是在包含它们的语句被求值之后才执行的。
  • 以上的意思可以从这段代码看出:

   var num1 = 2;  var num2 = 20;  var num3 = num1-- + num2;  //等于22,因为是后置,所以在var num3语句里它不改变先,等到这条语句被求值之后才改变  var num4 = num1 + num2 ;  //等于21,num1=1。

  • 加减前后置操作符不仅可以应用在整数上,还可以应用在字符串、布尔值、浮动数值和对象上哦!!!

    • var s1 = "2";  s1++;  // 3,包含有效数字字符的字符串先转换为数字值,再执行加减的操作,然后字符串变量变成数值变量。
    • var s2 = "x",  s2++;  // NaN,因为不包含数字,不过字符串变量还是会变成数值变量NaN;应用一元操作符都会变成NaN!!!
    • var b = false;  b++;  // 1,布尔值变成0或1,再执行加减1的操作,然后布尔值变量变成数值变量。
    • var f = 1.1;        f--;  //0.10000000000000009
    • var o = {         ;  o--;    //-2

        valueOf : function () {

            return -1;

        }

      }

  • 一元减操作符(-):主要用于表示负数

3.5.2 位操作符:本小节暂不讲解。。。。。。。

3.5.3 布尔操作符:

  • 逻辑非(!):短路操作符。应用于任何值,返回一个布尔值。生动的说就是:alert(!”我是好人“)   //false,返回一个坏人,因为有!存在。

    • alert(!false);  // true
    • alert(!"blue");  // false
    • alert(!0);    // true
    • alert(!NaN);  // true
    • alert(!" ");   // true
    • alert(!12345); //false

   若使用两个!那就是反过来咯。

  • 逻辑与(&&):全true则true。应用于任何类型的操作数,不仅仅是布尔值,但不可以在&&操作中使用未定义的值,不然会导致错误,不返回值。遵循以下规则:

   若第一个操作数能决定结果了,那第二个就无视。即第一个是false,那就不看第二个了。若第一个是true,那还是会去看第二个(第二个不可以使用未定义的值)。

   若两个操作数都是对象,则返回第二个操作数;若第一个操作数是null,则返回null;若第一个操作数是NaN,则返回NaN;若第一个操作数是undefined,则返回undefined;

第一个操作数

第二个操作数

结果

true

true

true

true

false

false

false

true

false

false

false

false

  • 逻辑或(||):有true则true,和逻辑与一样,不可以使用未定义的值

   若第一个操作数能决定结果了,那第二个就无视。即第一个是true,那就不看第二个了。若第一个是false,那还是会去看第二个(第二个不可以使用未定义的值)。

   若两个操作数都是对象,则返回第一个操作数;若两个操作数都是null,则返回null;若两个操作数都是NaN,则返回NaN;若两个操作数都是undefined,则返回undefined;

第一个操作数

第二个操作数

结果

true

true

true

true

false

true

false

true

true

false

false

false

3.5.4 乘性操作符:乘法、除法和求模,会自动把非数值的操作符转换位数值(即自动用Number()转换)

  • 乘法要注意的是: 结果超出ES数值表示范围,则返回Infinity或-Infinity;若有某一个操作数是NaN,那结果就是NaN;操作数是Infinity,那结果也是Infinity;Infinity乘以0等于NaN。
  • 除法要注意的是: 结果超出ES数值表示范围,则返回Infinity或-Infinity;若有某一个操作数是NaN,那结果就是NaN;操作数是Infinity,那结果也是Infinity;Infinity除以Infinity等于NaN;0除以0等于NaN。
  • 求模(%)主要需要注意的是:Infinity除以Infinity等于NaN;被除数是0,结果就是0。

3.5.5 加性操作符:加法、减法

  • 加法要注意的是:若有一个操作数是NaN,结果就是NaN;+0加+0等于+0;-0加-0等于-0;+0加-0等于+0;

   !!!最重要的来了,如果两个操作数都是字符串,则将第二个操作数与第一个操作数拼接起来;如果只有一个操作数是字符串,则将另外一个操作数转换为字符串,再将第二个操作数与第一个操作数拼接起来。

   如果有一个操作符是对象、数组或布尔值,则调用它们的toString() 方法取得相应的字符串值;对于undefined和null,则分别调用String()函数并取得”undefined“和”null“。

   例题:var num1 = 5;  var num2 = 10;  var message = "The sum of 5 and 10 is" + num1 + num2;  alert(message);  //"The sum of 5 and 10 is 510" ;

      var num1 = 5;  var num2 = 10;  var message = "The sum of 5 and 10 is" + (num1 + num2);  alert(message);  //"The sum of 5 and 10 is 15" ;

      var result1 = 2 + true;  // 3,因为true被Number()函数转换成1

  • 减法要注意的是:若有一个操作数是NaN,结果就是NaN;+0减+0等于+0;-0减-0等于+0;+0加-0等于-0;

   !!!最重要的来了,它和加法不一样,不拿来拼接什么鬼字符串。

   !!! (主要是使用了Number()函数)

   例题:var result1 = 5 - true;  //4

      var result2 = NaN - 1;  //NaN

      var result3 = 5 - 3;  //2

      var result4 = 5 - " ";  //5

      var result5 = 5 - ”2“;  //3

      var result6 = 5 - null;  //5

3.5.6 关系操作符:大于、小于、小于等于、大于等于:

  相应规则:

  • 若两个操作数都是数组,则执行数值比较。
  • 若两个操作数都是字符串,则比较两个字符串对应的字符编码值。
  • 若有一个操作数是数值,则将另外一个操作数转换为一个数值,然后执行数值比较。
  • 若有一个操作数是对象,则调用这个对象的valueOf()方法再比较,若没有此方法,则调用toString()方法,再比较。
  • 若一个操作数是布尔值,则先将其转换为数值然后再比较。
  • 任何数和NaN比较,结果都是false。

  例题:var result = "a" < 3;  //false,字符串a不能被转换成合理的数值,所以”a"被转换成NaN

     var result1 = "23" < "3";  //true,比较的是字符编码

     var result2 = "23" < 3;  //false,因为”23“变成了23

3.5.7 相等操作符:==、!= ,===、!== :

  • 相等与不相等:==、!=

    • 相等:相等和不相等是先强制转型再比较它们的相等性

      • 若两个操作数相等则返回true,不相等则返回false;
    • 不相等:
      • 若两个操作数相等则返回false,不相等则返回true;
    • 基本规则:
      • 若有布尔值,则先转换为数值,false=0,true=1;
      • 若有一个是字符串,另一个是数值,则先把字符串转换为数值;
      • 若有一个是对象,另一个不是,则调用对象的valueOf()方法,用得到的基本类型值再进行比较;
      • null == undefined(相等)
      • 若有一个是NaN,则相等操作符返回false,不相等操作符返回true;即使有两个都是NaN都一样,因为NaN不等于NaN;
      • 若两个都是对象,则比较它们是不是都指向同一对象,是则 相等操作符返回true,否则返回false;
      • null == 0 ,undefined == 0 //false,因为null和undefined在做相等判断时不进行转型,所以null、undefined和0是不同类型数据,所以返回false;

表达式

null == undefined、false == 0、NaN != NaN、”5“ == 5、true == 1

true

”NaN“ == NaN、5 == NaN、NaN == NaN、null == 0、undefined == 0

false

  • 全等和不全等:===、!==

    • 比较前不转换,所以比较的时候看数据类型相不相等
    • 其他规则和相等不相等一样~~

未完、待续。

JS高级程序设计第3章--精简版的更多相关文章

  1. JS高级程序设计第2章--精简版

    前言:这次是二刷了,想暑假做一次完整的笔记,但用本子来写笔记的话太贵了,可能哪天还丢了..所以还是博客好== 第二章:在HTML中使用JavaScript 2.1 <script>元素: ...

  2. JS高级程序设计第4章--精简版

    前言:纯手打!!!按照自己思路重写!!!这次是二刷了,想暑假做一次完整的笔记,但用本子来写笔记的话太贵了,可能哪天还丢了..所以还是博客好== 第四章:变量.作用域和内存问题 4.1 基本类型和引用类 ...

  3. JS高级程序设计第3章读书笔记

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. js高级程序设计笔记之-addEventListener()与removeEventListener(),事件解除与绑定

    js高级程序设计笔记之-addEventListener()与removeEventListener(),事件解除与绑定 addEventListener()与removeEventListener( ...

  5. 《JS高级程序设计》笔记 —— 解析查询字符串

    今天在继续翻阅<JS高级程序设计>的时候,正好翻到location对象这一小节,其中有一部分就是讲的解析查询字符串.看到这个内容立马想到了做去哪儿秋招笔试题的时候有这么一道题. 去哪儿笔试 ...

  6. angular.js高级程序设计书本开头配置环境出错,谁能给解答一下

    server.jsvar connect=require('connect');serveStatic=require('serve-static');var app=connect();app.us ...

  7. JS高级程序设计拾遗

    <JavaScript高级程序设计(第三版)>反反复复看了好多遍了,这次复习作为2017年上半年的最后一次,将所有模糊的.记不清的地方记录下来,方便以后巩固. 0. <script& ...

  8. JS高级程序设计第三版——JavaScript简介

    JavaScript简史 JavaScript由Netscape(网景)公司在1995年发布,最开始的主要目的是处理以前由服务器端语言负责的一些输入验证操作,以便提高用户体验,后来就慢慢的发展为一门强 ...

  9. JS高级程序设计学习笔记之第三章基本概念(语法,数据类型,流控制语句,函数)——查漏补缺

    一.语法: 区分大小写; 2.标识符:就是指变量.函数.属性的名字,或者函数的参数 a.标志符的规则:①第一个字符必须是一个字母.下划线(_)或一个美元符号($).                   ...

随机推荐

  1. 在.NET中使用JQuery 选择器精确提取网页内容

    1. 前言 相信很多人做开发时都有过这样的需求:从网页中准确提取所需的内容.思前想后,方法无非是以下几种:(本人经验尚浅,有更好的方法还请大家指点) 1. 使用正则表达式匹配所需元素.(缺点:同类型的 ...

  2. eclipse js 引用跳转

    引用 http://stackoverflow.com/questions/24505993/the-resource-is-not-on-the-build-path-of-a-javascript ...

  3. jmSlip WEB前端滑屏组件

    基于css3的滑屏组件 demo: http://slip.jm47.com 下载: https://github.com/jiamao/jmSlip 功能清单 区域横滚 整屏竖滚 滚动动画效果 区域 ...

  4. Node.js 究竟是什么?

    Node.js 究竟是什么? 一个 "编码就绪" 服务器 Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸 ...

  5. iOS swift使用xib绘制UIView

    目标:用xib绘制一个UIView,在某个ViewController中调用. 三个文件:ViewController.Swift    DemoView.swift     DemoView.xib ...

  6. BAE 环境下配置 struts2 + spring + hibernate(SSH)(二)struts2

    在myeclipse下开发的 应用但是 放到BAE下就出现了问题,虽然显示发布成功,但是访问的时候就会出现503 Service Unavailable 错误.通过调整 web.xml 发现纯Serv ...

  7. Java线程:线程状态

    线程可以创建6状态: New()新创建.Runnable(可运行).Blocked(被阻塞). Waiting(等待).Timed waiting(计时等待).Terminated(被终止)1 新建线 ...

  8. AppBoxFuture(四). 随需而变-Online Schema Change

      需求变更是信息化过程中的家常便饭,而在变更过程中如何尽可能小的影响在线业务是比较头疼的事情.举个车联网监控的例子:原终端设备上传车辆的经纬度数据,新的终端设备支持同时上传速度数据,而旧的车辆状态表 ...

  9. centos7 安装.net core的方法

    安装: sudo yum install libunwind libicu curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?li ...

  10. ViewPager+Fragment切换卡顿解决办法

    1.ViewPager设置预加载 我有4个tag,都不想被销毁,设置预加载个数为3. ViewPager viewPager; viewPager.setOffscreenPageLimit(3); ...