《JavaScript高级程序设计》总结——第3章:Javascript基本概念

版权声明:转载请先告知哦 https://blog.csdn.net/PINK789/article/details/87544793

一:语法

1:区分大小写

  • ECMAScript中的一切(变量名,函数名,操作符)都区分大小写

2:标识符

  • 标识符:变量名,函数名,属性的名字,函数的参数;
    • 开头:下划线 || 字符 || 美元符号$
    • 其他:字母 || 数字 || 下划线 || 美元符号
  • !:不能把true、false、null、关键字、保留字用做标识符

3:注释

  • 单行注释:// 注释部分
  • 多行注释:
/*这个*必须
* 这个*非必须
* 这个*非必须
*/

4:严格模式

  • ECMAScript5引入了严格模式,为javascript定义了严格模式
  • 作用:在严格模式下,ECMAScript3中的一些不确定行为将得到处理;而且将对某些不安全的操作抛出错误;
  • 使用:在函数内部/脚本顶部添加 ** “use strict” **

5:语句

二:关键字和保留字

  • ECMAScript全部关键字(带*是第五版新增的)
break do instanceof typeof case else new var
catch finally return void continue for switch while
debugger* function this with default if throw delete
in try
  • ECMAScript全部保留字
abstract booleam byte const char class debugger double
enum export extends float final goto int import
interface implements long native public private package protected
static short super synchronized throws transient volatile

ECMAScript5 新增保留字

implements package public interface private static let protected

ECMAScript5 非严格模式下保留字缩减为

class const enum export extends import super

三:变量

  • 松散类型:可以用来保存任意类型的数据;

四:数据类型

  • 6种基本数据类型:Undefined,Null,Boolean,Number,String,Symbol
  • 1种复杂数据类型:Object;

1:typeof操作符

  • 用途:检测给定变量的数据类型;
  • 用法:typeof 95; typeof(95);
  • typeof操作符可能返回值
操作数 对象或null 值未声明或声明未赋值 函数 布尔值 数值 字符串
返回值 “Object” “undefined” “function” “Boolean” “number” “string”
  • typeof null; //“object”,因为特殊值null被认为是一个空对象的引用;
  • Safari 5及之前版本、Chrome 7 及之前版本对typeof调用正则表达式返回"function",其他浏览器返回"object";
  • 操作符typeof和运算符instanceof 区别
    https://blog.csdn.net/PINK789/article/details/87915865

2:Undefined类型

  • 只有一个值
  • 声明但是未初始化的变量的值为undefined;var message; message==undefined;//true
  • 未声明的变量;typeof message;//undefined

3:Null类型

  • 只有一个值;
  • 若定义的对象在将来用于保存对象,最好将其初始化为null;
  • null == undefined; //true

4:Boolean类型

  • 两个字面值:true和false;//true不一定等于1,false不一定等于0
  • Boolean区分大小写,True和False都不是布尔值;
  • 方法:Boolean() 转型函数,将其他类型的值转为Boolean值;
    转换规则
数据类型 转换为true的值 转换为false的值
Boolean true false
String 任何非空字符串 “”(空字符串)
Number 任何非零数字值(包括无穷大) 0和NAN
Object 任何对象 null
Undefined a/A(不适用) undefined

5:Number类型

  • 例子
    var a=55; //整数
    var b=025; //八进制的21
    var c=029; //无效的八进制,解析为29
    var d=0xA; //十六进制,解析为10
  • 严格模式下八进制无效;
  • 进行算数计算时,所有以八进制和十六进制表示的数值都会被转换为十进制数值;
    5.1:浮点数值
  • a、保存浮点数值所需空间是整数的二倍;
  • b、e表示法:var floatNum = 3.12e7; //等于31200000
  • c、浮点数的最高精度是17位小数;
  • d、0.1+0.2; //0.30000000000000004
  • e、永远不要测试某个特定的浮点数值;
    5.2:数值范围
  • a、ECMAScript表示的最小数值:Number.MIN_VALUE //5e-324
  • b、ECMAScript表示的最小数值:Number.MAX_VALUE //1.7976931348623157e+308;
  • c、若计算中得到一个超出JacaScript数值范围的值,则该值将被自动转换成Infinity值,(+Infinity或-Infinity)该值无法进行下一次的运算;
  • 函数:isFinite(),判断某值是否位于最大和最小值之间,若是返回true;
    5.3:NaN
  • 用处:用于表示一个本来要返回数组的操作数但是未返回数值的情况;
  • 特点1:0除以0返回NaN;正数/0 => Infinity;负数/0 => -Infinity;
  • 特点2:任何涉及NaN的操作都会返回NaN;
  • 特点3:NaN与任何职都不相等,包括NaN本身;
  • 方法:isNaN(),接受一个参数,用于判断该参数是否"不是数值";
  • 例子:
    isNaN(NaN); //true
    isNaN(10); //false
    isNaN("10"); //false
    isNaN("blue"); //true
    isNaN(true); //false(可被转换为数字1)
  • 在基于对象调用isNaN()时,会首先嗲用对象的valueOf()方法确定该对象能否被转为数值,若不能,则基于该方法调用toString()方法,在测试返回值;
    5.4:数值转换
  • 将非数值转换为数值的三个函数:Number()parseInt()parseFloat()
  • Number()函数用于任何数据类型(转换字符串)
操作值 返回值
undefined NaN
null 0
Boolean true和false转换为1或0
Number 简单的传入传出
String——【若字符串只包含数字(包括前面带正负号情况)】 数值
String——【若字符串包含有效浮点格式】 转换为对应的浮点数值,忽略前导0
String——【若字符串为空】 转换0
String——【若字符串包含有效十六进制】 转换为相同大小十进制
String——【若字符串包含除上述格式之外的自付】 转换为NaN
Object 调用对象的valueOf()方法,然后依照前面的规则转换返回值,若转换的结果是NaN,则调用对象的toString()方法然后依照前面的规则返回的字符串值
  • parseInt() 方法:
    • 始终忽略前导空格,直到找到第一个非空格字符;
    • 若第一个字符不是数字字符或负号,返回NaN;
    • 可指定进制;
例子 返回值
parseInt("") NaN
parseInt(“70”) 70(十进制)
parseInt(“0xA”) 10(十六进制)
parseInt(“070”) 【ECMAScript 5 =》70】【ECMAScript 3 =》56(八进制)】)
parseInt(“070”,8) 56(八进制)
parseInt(“1234blue”) 1234
parseInt(“22.5”) 22
  • parseFloat() 函数
    • 第一个小数点有效,第二个无效
    • 始终忽略前导0
    • 只解析十进制;
操作 返回值
parseFloat(“1234bule”) 1234
parseFloat(“0xA”) 0
parseFloat(“22.5”) 22
parseFloat(“22.5.6”) 22.5
parseFloat(“0308”) 308
parseFloat(“3.125e7”) 31250000

6:String类型

  • 字符字面量
字面量 \n \t \b \r \ " \xnn \unnnn
含义 换行 制表 空格 回车 斜杠 单引号 双引号 以十六进制代码nn表示的一个字符(其中n为0~F)。例如,\x41表示"A" 以十六进制代码nnnn表示的一个Unicode字符(其中n为0~F)。例如,\u03a3表示希腊字符Σ
  • \u03a3表示一个字符
  • 方法一:toString() 方法
    • 数值,布尔值,对象,字符串值都有toString()方法,null和undefined没有
    • 返回字符串的副本
    • 可给toString()方法指定基数 var num=10;num.toString(2); //"1010"
  • 方法二:String() 方法
    • 在不知道要转换的值是不是null或undefined的情况下,用这个安全;
    • 转换规则
      • 若值有toString()方法,则调用该方法并返回相应的结果;
      • 若值是null,返回null;
      • 若值是undefined,返回undefined;

7:Object类型

  • ECMAScript中的对象:一组数据和功能的集合;
  • Object的每个实例都具有下列属性和方法
    • constructor:保存着用于创建当前对象的函数;
    • hasOwnProperty(propertyName):用于检测给定的属性在当前对象中(而非实例的原型中)是否存在,其中作为参数的PrptertyName必须以自妇产形式指定;
    • isPrototypeOf(Object):用于检查对象是否是传入对象的原型;
    • propertyIsEnumerable(propertyName):用于检查给定的属性能否被for-in语句枚举;与 hasOwnProperty()方法一样,作为参数的属性名必须以字符
      串形式指定;
    • toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应;
    • toString():返回对象的字符串表示;
    • valueOf():返回对象的string、number或boolean表示。通常与 toString()方法的返回值相同;
  • 在ECMAScript中Object是所有对象的基础,因此所有的对象都具有这些基本的属性和方法;
  • 从技术上讲,ECMA-262中对象的行为不一定适用于JavaScript中的其他对象,浏览器环境中的对象,比如BOM和DOM中的对象,都属于宿主对象,他们是由宿主实现提供和定义的。ECMA-262不负责定义宿主对象,因此宿主对象可能会也可能不继承Object;

五:操作符

  • 适用于很多值,如Boolean,String,Number,甚至对象,不过在应用于对象时相应的操作符通常都会调用对象的**valueOf()**和(或)**toString()**方法

1:一元操作符

  • 定义:只能操作一个值的操作符
  • 1.1:递增递减操作符
  • 规则
    • 应用于包含有效数字字符的字符串时:先将其转换为数字值,再执行加减1操作,字符串变量变成数值变量;var s1 = "2";++s1; //3
    • 应用于不包含有效数字字符的字符串时:先将变量设置为NaN,字符串变量变成数值变量;var s2 = "aa";++s2; //NaN
    • 应用于布尔值:分贝转换为0 和 1再执行加减1操作,布尔值变量变成数值变量;var s3 = false;++s3; //1
    • 应用于浮点数值:执行加减1操作;var s4 = 0.2;++s4; //1.2
    • 应用于对象时:先调用对象的valueOf()方法,以取得一个可供操作的值,然后对该值应用前述规则,若结果是NaN,则在调用toString()方法后再应用前述规则;对象变量变成数值变量;var o = { valueOf: function() { return -1; } };
  • 1.2一元加和减操作符
  • 规则
    • 应用于数值:和数学一样;var a=5;a = +5; //5,无变化
    • 应用于非数值:该操作符会像调用Number()函数一样对该值进行转换;布尔值转为0和1;字符串按照其规则转换;对象调用valueOf()和(或)toString()

2:位操作符

  • ECMAScript 中的所有的数值都以IEEE-754 64位格式存储,但位操作符并不直接操作64位的值,而是先将64位的值转换为32位的整数,然后执行操作,最后再将结果转换为64位;对开发人员来说,由于64位格式是透明的,因此整个过程就像是只存在32位的整数中一样;
  • 对于有符号整数,32位中的前31位用于表示整数值,32位是符号位;
  • 默认情况下,ECMAScript中的所有整数都是有符号整数;
  • 正数:以纯二进制存储,31位中的每一位都表示2的幂;
  • 负数:以二进制补码存储;
    • 计算一个数值的二进制补码
    • (1):求这个数值绝对值的二进制码;
    • (2):求二进制反码,即0替换为1,1替换为0;
    • (3):得到的二进制反码加一;
  • 对特殊的NaN和Infinity值应用位操作符时,这两个值都会被当做0;
  • 对非数值应用位操作符,会先使用Number()函数将该值转换为一个数值(自动完成),然后再应用位操作;
  • 2.1按位非(NOT)(~):返回数值的反码,相当于操作数负值-1操作;
  • 2.2按位与(AND)(&):同1返回1;
  • 2.3按位或(OR)(|):有1返回1;
  • 2.4按位异或(XOR)(^)
  • 2.5左移(<<):操作数将数值的所有值向左移动指定位数,空位0补充;
  • 2.6有符号的右移(>>):用符号位的值补充空位;
  • 2.7无符号的右移(~):以0补充空位;

3:布尔操作符(将值转换为布尔值)

  • 3.1 逻辑非(NOT)(!)
    • 将值转换为布尔值然后对其求反;
    • 规则:
      • 对象:false;
      • 空字符串:true;
      • 非空字符串:false;
      • 0:true;
      • 任意非0数值(包含Infinity):false;
      • null:true;
      • NaN:true;
      • undefined:true;
  • 3.2 逻辑与(&&):短路操作符=》若操作数1为false,则无论操作数2是啥都返回false;
    • 两个操作数
    • 都true返回true;
    • 规则:
      • 操作数1为对象,返回操作数二;
      • 操作数2为对象,则只有在操作数1位true时返回该对象;
      • 操作数1,2均为对象,返回操作数2;
      • 若有一个操作数为null,返回null;
      • 若有一个操作数为NaN,返回NaN;
      • 若有一个操作数为undefined,返回undefined;
  • 3.3 逻辑或(||):短路操作符=》若操作数1为true,则无论操作数2是啥都返回true;
    • 若操作数1是对象,则返回操作数1;
    • 若操作数1的求值结果为false,则返回操作数2;
    • 若俩操作数均为对象,则返回操作数1;
    • 若俩操作数都是NaN,则返回NaN;
    • 若俩操作数都是undefined,则返回undefined;

4:乘性操作符:乘法,除法,求模

  • 乘法规则
    • 均为数值:执行常规乘法计算,若乘积超过了ECMAScript数值的表示范围,则返回Infinity 或-Infinity;
    • 若其中一个操作数是NaN,则结果是NaN;
    • 若Infinity 与0相乘,则结果是NaN;
    • 如果是 Infinity 与非 0 数值相乘,则结果是 Infinity 或-Infinity,取决于有符号操作数的符号;
    • 如果是 Infinity 与 Infinity 相乘,则结果是 Infinity;
    • 如果有一个操作数不是数值,则在后台调用 Number()将其转换为数值,然后再应用上面的规则;
  • 除法规则(/):
    • 均为数值:执行常规乘法计算,若乘积超过了ECMAScript数值的表示范围,则返回Infinity 或-Infinity;
    • 若其中一个操作数是NaN,则结果是NaN;
    • 若0/0,则结果是 NaN;
    • 若0/非0的有限数值,则结果是 Infinity 或-Infinity,取决于有符号操作数的符号;
    • 若非0数值/Infinity,则结果是 Infinity 或-Infinity,取决于有符号操作数的符号;
    • 若有一个操作数不是数值,则在后台调用 Number()将其转换为数值,然后再应用上面的规则
  • 求模规则(%):
    • 若操作数都是数值,执行常规的除法计算,返回除得的余数;
    • 若(无穷大值)%(有限大的数值),则结果是 NaN;
    • 若(有限大的数值)%(0),则结果是 NaN;
    • 若(Infinity)%(Infinity),则结果是 NaN;
    • 若(有限大的数值)%(无穷大的数值),则结果是被除数;
    • 若0%(任何数),结果是0;
    • 若有一个操作数不是数值,则在后台调用 Number()将其转换为数值,然后再应用上面的规则。

5:加性操作符

  • 加法使用规则:
操作数 操作
一个NaN 返回NaN
一个字符串 转另一个为字符串然后拼接
一个操作数是Number,Boolean,对象 toString()方法取得相应的字符串值,再运用字符串规则
undefined 和 null 分别调用 String()函数并取得字符"undefined"和"null"
Infinity+Infinity Infinity
-Infinity-Infinity -Infinity
Infinity-Infinity NaN
+0+0 +0
+0-0 +0
-0-0 -0
  • 减法使用规则
操作数 操作规则
一个操作数是String,Boolean,null,undefined 现在后台调用Number()函数将其转换为数值,再执行其他规则进行计算。若转换的结果是NaN,则结果就是NaN
一个操作数是对象 则调用对象的valueOf()方法取得该对象的数值,若得到的值是NaN,则减法的结果就是NaN。若对象没有valueOf()方法,则调用toString()方法并将得到的字符串转换为数值
一个操作数是NaN 结果是NaN

6:关系操作符

  • 应用于非数值时转换规则
操作数 操作规则
一个操作数是数值 将另一个操作数转换为数值,然后进行数值比较
一个操作数是对象 则调用对象的valueOf()方法取得该对象的数值,若得到的值是NaN,则减法的结果就是NaN。若对象没有valueOf()方法,则调用toString()方法并将得到的字符串转换为数值
两个操作数都是对象 比较字符编码值
一个操作数是布尔值 将其转换为数值,在执行比较
  • 若想使字符串按照字母表顺序排序,先使用toLowerCase()方法或toUpperCase()方法将其转换为相同大小写;
  • 任何操作数和NaN比较都返回false;

7:相等操作符

  • == 和!= 比较规则:先转换操作数(强制转型)再比较相等性
    | 操作数 | 转型规则 |
    |–|--|
    | 有一个对象,另一个不是 |调用对象的 valueOf()方法,用得到的基本类
    型值按照前面的规则进行比较 |
    | 两个对象 | 比较他们是不是同一个对象,若是返回true |
    | 有一个操作数是字符串,另一个是数值 | 将字符串转换为数值 |
    | 有一个布尔值 | 转换为0 或1 |
  • 特殊规则
    • null 和undefined是相等的
    • 在比较相等性之前,不能将null和undefined转换为其他值;
    • 操作数中NaN,==返回false;!=返回true;
表达式 表达式
null == undefined true true==1 true
“NaN” == NaN false true==2 false
5 == NaN false undefined ==0 false
NaN==NaN false null==0 false
NaN!= NaN true “5”==5 true
false==0 true
  • 全等和不全等
    • 比较操作数及其类型;
    • null===undefined; //false

8:条件操作符

  • result ? a:b;

9:赋值操作符

  • =
  • 复合赋值操作符(*=;/=;%=;+=;-=;<<=;>>=;>>>=),仅仅是简化操作,无任何性能提升;

10:逗号操作符

  • var num=1 , num2=2 , num3=3;

六:语句

  • 1:if语句;
  • 2:do while语句,至少执行一次;
  • 3:while语句;
  • 4:for语句;
  • 5:for-in:
    • 用来枚举对象的属性,顺序不可预测;
    • 先检测对象的变量值是都为null或undefined,因为ECMAScript对该情况不抛出错误而是不执行循环体;
    • 使用方法
	for(var propName inwindow){	//window对象的属性
		console.log(propName);
	}
  • 6:switch语句
switch (i) { 
 case 25: 
 alert("25"); 
 break; 
 case 35: 
 alert("35"); 
 break; 
 case 45: 
 alert("45"); 
 break; 
 default: 
 alert("Other"); 
} 
  • 7:label语句
    • 可以在代码中添加标签,以便将来使用;
    • 使用示例:
start:for(var i=0;i<count;i++){
	console.log(i);
}
//该start标签可以在将来由break或continue语句引用,加标签的一般都要与for语句等循环语句配合使用
  • 8:break 和continue语句
    • break:立即退出循环;
    • continue:立即退出循环从循环顶部继续执行;
    • 与label语句联合使用,从而返回代码中特定的位置;
var num = 0;
outermost:
for (var i=0 ; i<10; i++){
	for (var j=0; j < 10; j++) { 
		 if (i == 5 && j == 5) { 
 		break outermost; 
 	} 
 	num++; 
 } 
}
alert(num);	//55
  • 9:with语句(严格模式下使用该模式报错;该语句会导致性能下降不建议使用;)
    • 作用:将代码的作用域设置到一个特定的对象中
    • 示例:
var qs = location.search.substring(1); 
var hostName = location.hostname; 
var url = location.href; 
//上面几行代码都包含location对象,使用with语句改写如下
with(location){ 
 var qs = search.substring(1); 
 var hostName = hostname; 
 var url = href; 
} 

七:函数

1:理解参数

  • ECMAScript不理会传入参数数量以及类型
  • arguments对象保存传入函数的参数

2:没有重载

  • 定义:相同名称的函数或者函数有不同的参数列表,这样的函数或方法互相称之为重载函数或方法;
  • 因为ECMAScript函数的参数是由包含0或多个值的数组表示的,而没有函数签名(参数类型不同和数量不同),所以如果定义了两个名字相同的函数,该名字只属于后者

八:小结

  • ECMAScript 中的基本数据类型包括 Undefined、Null、Boolean、Number 和 String;
  • 与其他语言不同,ECMScript 没有为整数和浮点数值分别定义不同的数据类型,Number 类型可用于表示所有数值;
  • ECMAScript 中也有一种复杂的数据类型,即 Object 类型,该类型是这门语言中所有对象的基础类型;
  • 严格模式为这门语言中容易出错的地方施加了限制。
  • ECMAScript 提供了很多与 C 及其他类 C 语言中相同的基本操作符,包括算术操作符、布尔操作符、关系操作符、相等操作符及赋值操作符等;
  • ECMAScript 从其他语言中借鉴了很多流控制语句,例如 if 语句、for 语句和 switch 语句等。

ECMAScript 中的函数与其他语言中的函数有诸多不同之处。

  • 无须指定函数的返回值,因为任何 ECMAScript 函数都可以在任何时候返回任何值。
  • 实际上,未指定返回值的函数返回的是一个特殊的 undefined 值。
  • ECMAScript 中也没有函数签名的概念,因为其函数参数是以一个包含零或多个值的数组的形式传递的
  • 可以向 ECMAScript 函数传递任意数量的参数,并且可以通过 arguments 对象来访问这些参数
  • 由于不存在函数签名的特性,ECMAScript 函数不能重载

猜你喜欢

转载自blog.csdn.net/PINK789/article/details/87544793