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


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


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 高级程序设计 第三章学习笔记——Number数据类型需要注意的事项

    1.浮点数值 虽然小数点前面可以没有整数,但是并不推荐这种写法. 由于保存浮点数值需要的内存空间是保存整数值的两倍,因此ECMAScript会不失时机地将浮点数值转化为整数数值.显然,如果小数点后面没 ...

  4. 读书笔记 - js高级程序设计 - 第五章 引用类型

      引用类型 和 类 不是一个概念 用typeof来检测属性是否存在 typeof args.name == "string"  需要实验 访问属性的方法 .号和[] 一般情况下要 ...

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

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

  6. js 高级程序设计 第四章学习笔记

    问题:怎么才能形象的理解堆栈空间? 1. 声明变量 使用 var 声明的变量会自动被添加到最接近的环境中.在函数内部,最接近的环境就是函数的局部 环境:在 with 语句中,最接近的环境是函数环境.如 ...

  7. 读书笔记 - js高级程序设计 - 第十一章 DOM扩展

      对DOM的两个主要的扩展 Selectors API HTML5  Element Traversal 元素遍历规范 querySelector var body = document.query ...

  8. 读书笔记 - js高级程序设计 - 第七章 函数表达式

      闭包 有权访问另一个函数作用域中的变量的函数 匿名函数 函数没有名字 少用闭包 由于闭包会携带包含它的函数的作用域,因此会比其它函数占用更多的内存.过度使用闭包可能会导致内存占用过多,我们建议读者 ...

  9. 读书笔记 - js高级程序设计 - 第六章 面向对象的程序设计

      EcmaScript有两种属性 数据属性 和 访问器属性 数据属性有4个特性 Configurable Enumerable Writable Value   前三个值的默认值都为false   ...

随机推荐

  1. Shuttle ESB(六)——在工程中的应用

    假设你可能浏览在前面几篇文章ESB介绍,我相信,在这篇文章中,你会发现很多共鸣. 虽然.市面上开源的ESB确实很之多.像Java中的Mule ESB.Jboss ESB:.Net中的NServiceB ...

  2. WPF特效-绘制实时2D激光雷达图

    原文:WPF特效-绘制实时2D激光雷达图 接前两篇: https://blog.csdn.net/u013224722/article/details/80738619 https://blog.cs ...

  3. 修改window.external使JS可调用Delphi方法

    原文地址:http://hi.baidu.com/rarnu/blog/item/4ec80608022766d663d986ea.html 在js中,有一个比较特殊的对象,即window.exter ...

  4. 命名管道的C#实现

    1.    命名管道简介 "命名管道"或"命名管线"(Named Pipes)是一种简单的进程间通信(I P C)机制,Microsoft Windows NT ...

  5. iis7下查看站点日志对应文件夹

    原文:iis7下查看站点日志对应文件夹 IIS7下面默认日志文件的存放路径:%SystemDrive%\inetpub\logs\LogFiles 查看方法:点击对应网站 -> 右侧功能视图 - ...

  6. miniui处理多重子表级联,一次性提交多表数据的ui要点

    在一个ui界面上 有a,b,c三个表 a表只有一条记录,b表有多条记录,c表有多条记录 b是a的子表,c是b的子表 都是一对多关系 一次性下载相关联的c表记录 然后mini-datagrid采用cli ...

  7. 微信小程序把玩(二十三)modal组件

    原文:微信小程序把玩(二十三)modal组件 modal弹出框常用在提示一些信息比如:退出应用,清楚缓存,修改资料提交时一些提示等等. 常用属性: wxml <!--监听button点击事件-- ...

  8. 【Windows10 IoT开发系列】Powershell命令行实用程序

    原文:[Windows10 IoT开发系列]Powershell命令行实用程序 更新帐户密码: 强烈建议你更新默认的管理员帐户密码.若要更新帐户密码,你可以发出以下命令: net user Admin ...

  9. 关于EF ORM 框架的使用问题

    1.无法更新 EntitySet“System_UserInfo20140218001”,因为它有一个 DefiningQuery,而 <ModificationFunctionMapping& ...

  10. 认识Docker

      以下是个人学习过程中所记,仅作为学习经历和备忘,有问题不负责,但可以交流和探讨. 1 什么是Docker?   在Docker的官网,Docker的设计师们对Docker的定义是:   Docke ...