JS高级程序设计第3章--精简版
前言:纯手打!!!按照自己思路重写!!!这次是二刷了,想暑假做一次完整的笔记,但用本子来写笔记的话太贵了,可能哪天还丢了。。所以还是博客好==
第三章:基本概念(语法、数据类型、流控制语句、函数)
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的七次方。
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“。
- String()转型函数:在不知道要转换的值是不是null或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章--精简版的更多相关文章
- JS高级程序设计第2章--精简版
前言:这次是二刷了,想暑假做一次完整的笔记,但用本子来写笔记的话太贵了,可能哪天还丢了..所以还是博客好== 第二章:在HTML中使用JavaScript 2.1 <script>元素: ...
- JS高级程序设计第4章--精简版
前言:纯手打!!!按照自己思路重写!!!这次是二刷了,想暑假做一次完整的笔记,但用本子来写笔记的话太贵了,可能哪天还丢了..所以还是博客好== 第四章:变量.作用域和内存问题 4.1 基本类型和引用类 ...
- js 高级程序设计 第三章学习笔记——Number数据类型需要注意的事项
1.浮点数值 虽然小数点前面可以没有整数,但是并不推荐这种写法. 由于保存浮点数值需要的内存空间是保存整数值的两倍,因此ECMAScript会不失时机地将浮点数值转化为整数数值.显然,如果小数点后面没 ...
- 读书笔记 - js高级程序设计 - 第五章 引用类型
引用类型 和 类 不是一个概念 用typeof来检测属性是否存在 typeof args.name == "string" 需要实验 访问属性的方法 .号和[] 一般情况下要 ...
- JS高级程序设计第3章读书笔记
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- js 高级程序设计 第四章学习笔记
问题:怎么才能形象的理解堆栈空间? 1. 声明变量 使用 var 声明的变量会自动被添加到最接近的环境中.在函数内部,最接近的环境就是函数的局部 环境:在 with 语句中,最接近的环境是函数环境.如 ...
- 读书笔记 - js高级程序设计 - 第十一章 DOM扩展
对DOM的两个主要的扩展 Selectors API HTML5 Element Traversal 元素遍历规范 querySelector var body = document.query ...
- 读书笔记 - js高级程序设计 - 第七章 函数表达式
闭包 有权访问另一个函数作用域中的变量的函数 匿名函数 函数没有名字 少用闭包 由于闭包会携带包含它的函数的作用域,因此会比其它函数占用更多的内存.过度使用闭包可能会导致内存占用过多,我们建议读者 ...
- 读书笔记 - js高级程序设计 - 第六章 面向对象的程序设计
EcmaScript有两种属性 数据属性 和 访问器属性 数据属性有4个特性 Configurable Enumerable Writable Value 前三个值的默认值都为false ...
随机推荐
- Shuttle ESB(六)——在工程中的应用
假设你可能浏览在前面几篇文章ESB介绍,我相信,在这篇文章中,你会发现很多共鸣. 虽然.市面上开源的ESB确实很之多.像Java中的Mule ESB.Jboss ESB:.Net中的NServiceB ...
- WPF特效-绘制实时2D激光雷达图
原文:WPF特效-绘制实时2D激光雷达图 接前两篇: https://blog.csdn.net/u013224722/article/details/80738619 https://blog.cs ...
- 修改window.external使JS可调用Delphi方法
原文地址:http://hi.baidu.com/rarnu/blog/item/4ec80608022766d663d986ea.html 在js中,有一个比较特殊的对象,即window.exter ...
- 命名管道的C#实现
1. 命名管道简介 "命名管道"或"命名管线"(Named Pipes)是一种简单的进程间通信(I P C)机制,Microsoft Windows NT ...
- iis7下查看站点日志对应文件夹
原文:iis7下查看站点日志对应文件夹 IIS7下面默认日志文件的存放路径:%SystemDrive%\inetpub\logs\LogFiles 查看方法:点击对应网站 -> 右侧功能视图 - ...
- miniui处理多重子表级联,一次性提交多表数据的ui要点
在一个ui界面上 有a,b,c三个表 a表只有一条记录,b表有多条记录,c表有多条记录 b是a的子表,c是b的子表 都是一对多关系 一次性下载相关联的c表记录 然后mini-datagrid采用cli ...
- 微信小程序把玩(二十三)modal组件
原文:微信小程序把玩(二十三)modal组件 modal弹出框常用在提示一些信息比如:退出应用,清楚缓存,修改资料提交时一些提示等等. 常用属性: wxml <!--监听button点击事件-- ...
- 【Windows10 IoT开发系列】Powershell命令行实用程序
原文:[Windows10 IoT开发系列]Powershell命令行实用程序 更新帐户密码: 强烈建议你更新默认的管理员帐户密码.若要更新帐户密码,你可以发出以下命令: net user Admin ...
- 关于EF ORM 框架的使用问题
1.无法更新 EntitySet“System_UserInfo20140218001”,因为它有一个 DefiningQuery,而 <ModificationFunctionMapping& ...
- 认识Docker
以下是个人学习过程中所记,仅作为学习经历和备忘,有问题不负责,但可以交流和探讨. 1 什么是Docker? 在Docker的官网,Docker的设计师们对Docker的定义是: Docke ...