JavaScript 高级程序设计(1~3章 基本概念)

第1章 JavaScript简介

1. javaScript实现
  • javaScript三个组成部分


    javascript组成部分

    *核心(ECMAScript),由ECM-262定义,提供核心语法。
    *文档对象模型(DOM),提供访问和操作网页内容的方法和接口。
    *浏览器对象模型(BOM),提供与浏览器交互的方法和接口。

第2章 在HTML中使用JavaScript

1. <script>元素

  • async:表示应该立即下载脚本,但不妨碍页面中的其他操作,比如说下载其他资源或等待加载其他脚本。只对外部脚本有效,不保证按照指定它们的先后顺序执行。
  • defer:脚本可以延迟到文档完全被解析和显示之后再执行。(脚本将延迟到浏览器遇到</html>标签后再执行)。只对外部脚本有效,延迟脚本不一定会按照顺序执行。
  • charset:表示通过src属性指定代码的字符集。
  • src:表示要执行的外部文件。
  • type:表示编写代码使用的脚本语言内容类型。默认值:text/javascript

使用<script>元素的两种方式:
* 直接嵌入javascript代码:在代码的任何地方不能出现</script>字符串。使用转义字符“<\/script>”
* 引入外部javascript文件:<script>和</script>标签之间不能再有javascript代码。

2. 标签的位置

  • <head>元素中
  • <body>元素中页面内容的最后。

在文档的<head>元素中包含所有javascript文件,意味着必须等到全部Javascript代码都被下载、解析和执行完成以后,才能开始呈现页面内容。会导致浏览去在呈现页面内容时出现明显延迟。

3. <noscript>元素

浏览器不支持脚本或浏览器支持脚本,但脚本被禁用。<noscript>元素内容会被显示。

第3章 基本内容

1. 语法

  • 区分大小写
  • 标识符由字母、下滑钱、美元符号、数字组成,数字不可以作为首字母
  • 严格模式:顶部添加use strict一条编译指示。在严格模式下。ECMAScript3中一些不明确的行为将得到处理,某些不安全的操作也会抛出错误。

2. 数据类型

undefine null boolean number string
(1) typeof操作符

typeof 操作符返回值:
"undefine" -未定义
"boolean"-布尔值
"string"-字符串
"number"-数值
"object"-对象或null
"function"-函数

var message = "some string ";
alert(typeof message); //string
alert(typeof 95 )//number

(2)undefine类型

  • 未经初始化的变量,默认值为undefined
var message;
alert(message == undefined); // true
  • 未初始化和未声明的变量不相同
var message ;
alert(message);//undefined
alert(age);//发生错误
  • 未初始化和未声明的变量执行typeof操作符都返回undefined。
var message;
alert(typeof message);//undefined
alert(typeof age);//undefined

(3)null类型
null值表示一个空对象指针,typeof检测null值的结果是“object”。

var car = null;
alert(typeof car);//"object"

如果定义的变量准备用于保存对象,要将该变量初始化为null。

(4)boolean类型
true 不一定等于 1,而 false 也不一定等于 0。
要将一个值转换为boolean值,调用函数Boolean()。

var message = " hello world!";
var messageAsBoolean = Boolean(message);

(5)number 类型

  • 十进制
  • 八进制 首位为0 ,如果字面数值超出范围(0~7),前导零被忽略,后面的数值当作十进制来解析
 var num1 = o70;//八进制的56
var num2 = 079;//无效八进制数值-解析为79
  • 十六进制 首两位为ox

在进行算术计算时,所有八进制和十六进制表示的数值都将被转换为十进制数值。

* 浮点数值

  1. 保存浮点数值需要的内存空间是保存整数值的两倍,因此 ECMAScript 会不失时机地将浮点数值 转换为整数值。
var floatNum1 = 1.; // 小数点后面没有数字——解析为 1
 var floatNum2 = 10.0; // 整数——解析为 10
  1. 科学计数法表示浮点数值
var floatNum = 3.125e7; // 等于31250000

* 数值范围

  • 最小数值 Number.MIN_VALUE = 5e-324
  • 最大数值Number.MAX_VALUE = 1.7976931348623157e+308

超出 JavaScript 数值范围的值,那么这个数值将被自动转换成特殊的 Infinity 值。具 体来说,如果这个数值是负数,则会被转换成-Infinity(负无穷),如果这个数值是正数,则会被转 换成 Infinity(正无穷)。

isFinite()函数可以判断数值是否在JavaScript 数值范围内。

var result = Number.MAX_VALUE +Number.MAX_VALUE;
alert(isFinite(result)); // false

*NaN
非数值,用于表示一个本来要返回数值的操作数未返回数值的情况(这样不会抛出错误)。

  • 在 ECMAScript 中,任何数值除以 0 会返回 NaN。
  • 任何涉及 NaN 的操作(例如 NaN/10)都会返回 NaN。
  • NaN 与任何值都不相等,包括 NaN 本身。
    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()函数的转换规则:

(1) 如果是 Boolean 值,true 和 false 将分别被转换为 1 和 0。
(2) 如果是数字值,只是简单的传入和返回。
(3) 如果是 null 值,返回 0。
(4) 如果是 undefined,返回 NaN。
(5) 如果是字符串,遵循下列规则:

  • 如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即"1" 会变成 1,"123"会变成 123,而"011"会变成 11(注意:前导的零被忽略了);
  • 如果字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值(同样,也会忽 略前导零);
  • 如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整 数值;
  • 如果字符串是空的(不包含任何字符),则将其转换为 0;
  • 如果字符串中包含除上述格式之外的字符,则将其转换为 NaN。
  • 如果是对象,则调用对象的 valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是 NaN,则调用对象的 toString()方法,然后再次依照前面的规则转换返回的字符串值。
  • parseInt()函数的转换规则:

var num1 = parseInt("1234blue");// 1234
var num2 = parseInt("");// NaN
var num3 = parseInt("0xA");// 10(十六进制数)
var num4 = parseInt(22.5); // 22
var num5 = parseInt("070");// 56(八进制数)
var num6 = parseInt("70");// 70(十进制数)
var num7 = parseInt("0xf");// 15(十六进制数)

parseInt的第二个参数,用于确定按什么禁止解析。

var num1 = parseInt("AF", 16); //175 
var num2 = parseInt("AF"); //NaN

var num1 = parseInt("10", 2);//2 (按二进制解析)
var num2 = parseInt("10", 8);//8 (按八进制解析)
var num3 = parseInt("10", 10);  //10(按十进制解析)
var num4 = parseInt("10", 16); //16(按十六进制解析)
  • parseFloat()函数转换规则:

var num1 = parseFloat("1234blue");//1234 (整数)
var num2 = parseFloat("0xA"); //0
var num3 = parseFloat("22.5");//22.5
var num4 = parseFloat("22.34.5");//22.34
var num5 = parseFloat("0908.5"); //908.5
var num6 = parseFloat("3.125e7"); //31250000

(6)String 类型

  • 字符字面量

(1) \xnn 以十六进制代码nn表示的一个字符(其中n为0~F)。例如,\x41表示"A"
(2) \unnnn 以十六进制代码nnnn表示的一个Unicode字符(其中n为0~F)。例如,\u03a3表示希腊字符Σ

任何字符串的长度都可以通过访问其length属性取得。

var text = "This is the letter sigma: \u03a3.";
alert(text.length); // 输出28
  • 字符串特点
    字符串一旦创建,它们的值就不能改变。要改变 某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量。
  • 转换为字符串
    toString()方法(数值,布尔值,字符串可以使用)
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()方法

var value1 = 10;
var value2 = true;
var value3 = null;
var value4;
alert(String(value1));// "10"
alert(String(value2));// "true"
alert(String(value3));// "null"
alert(String(value4));// "undefined"

(7)object类型
object实例属性和方法:

(1) constructor:保存着用于创建当前对象的函数。对于前面的例子而言,构造函数(constructor)就是 Object()。
(2) hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例 的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串形式指定(例如:o.hasOwnProperty("name"))。
(3) isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型。
(4) propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用 for-in 语句来枚举。与 hasOwnProperty()方法一样,作为参数的属性名必须以字符串形式指定。
(5) toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。
(6) toString():返回对象的字符串表示。
(7) valueOf():返回对象的字符串、数值或布尔值表示。通常与 toString()方法的返回值相同。

3.操作符

(1) 一元操作符

  • 递增和递减操作符
    前置型:前置递增和递减操作时,变量的值都是在语句被求值以前改变。
var num1 = 2;
var num2 = 20;
var num3 = --num1 + num2;// 等于 21 
var num4 = num1 + num2;// 等于 21

后置型:后置递增和递减操作是在包含它们的语句被求值之后才执行。

var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2;// 等于 22
 var num4 = num1 + num2;// 等于 21

自增自减不仅适用于整数,还可以用于字符串、布尔值、浮 点数值和对象。
递增和递减操作符遵循下列规则:

(1) 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减 1 的操作。字 符串变量变成数值变量。
(2) 在应用于一个不包含有效数字字符的字符串时,将变量的值设置为 NaN。 字符串变量变成数值变量。
(3) 在应用于布尔值 false 时,先将其转换为 0 再执行加减 1 的操作。布尔值变量变成数值变量。
(4) 在应用于布尔值 true 时,先将其转换为 1 再执行加减 1 的操作。布尔值变量变成数值变量。
(5) 在应用于浮点数值时,执行加减 1 的操作。
(6) 在应用于对象时,先调用对象的 valueOf()方法以取得一个可供操作的值。然后对该值应用前述规则。如果结果是 NaN,则在调用 toString()方法后再应用前述规则。对象变量变成数值变量。

var s1 = "2";
var s2 = "z";
var b = false;
var f = 1.1;
var o = {
    valueOf: function() {
        return -1;
} };
s1++; //值变成数值 3
s2++; //值变成 NaN
b++; //值变成数值1
f--; //值变成0.10000000000000009(由于浮点舍入错误所致)
o--; // 值变成数值-2
  • 一元加减操作符
    一元加操作以一个加号(+)表示,放在数值前面,对数值不会产生影响。
var num = 25;
num = +num; // 仍然是25

var s1 = "01";
var s2 = "1.1";
var s3 = "z";
var b = false;
var f = 1.1;
var o = {
    valueOf: function() {
        return -1;
} };
s1 = +s1;// 值变成数值 1
s2 = +s2; // 值变成数值 1.1
s3 = +s3;// 值变成 NaN
 b= +b;// 值变成数值 0
 f= +f;// 值未变,仍然是 1.1
 o= +o; // 值变成数值-1

一元减操作符主要用于表示负数。

var num = 25;
num = -num; // 变成了-25

var s1 = "01";
var s2 = "1.1";
var s3 = "z";
var b = false;
var f = 1.1;
var o = {
   valueOf: function() {
       return -1;
} };
s1 = -s1;// 值变成数值 -1
s2 = -s2; // 值变成数值- 1.1
s3 = -s3;// 值变成 NaN
b= -b;// 值变成数值 0
f= -f;// 值未变,仍然是- 1.1
o= -o; // 值变成数值1

(2)位操作符

  • 64 位的数值被转换成 32 位数值,然后执行位操作,最后再将 32 位的结果转换回 64 位数值。
  • 负数以32二进制补码形式存储,最高位为符号位。
  • 对特殊的 NaN 和 Infinity 值应用位操作时,这两个值都会被当成 0 来处理。
  • 对非数值应用位操作符,会先使用 Number()函数将该值转换为一个数值(自动完成),然后再应用位操作。得到的结果将是一个数值。
  1. 按位非(NOT):按位非操作符由一个波浪线(~)表示。
    按位非操作的本质:操作数的负值减 1。
var num1 = 25;// 二进制00000000000000000000000000011001
var num2 = ~num1;// 二进制11111111111111111111111111100110 
alert(num2); // -26

//本质
var num1 = 25;
var num2 = -num1 - 1;
alert(num2);            // "-26"
  1. 按位与(AND):按位与操作符由一个和号字符(&)表示。
  2. 按位或(OR):按位或操作符由一个竖线符号(|)表示。
  3. 按位异或(XOR):按位异或操作符由一个插入符号(^)表示。
  4. 左移:左移操作符由两个小于号(<<)表示。
var oldValue = 2; // 等于二进制的10
var newValue = oldValue << 5; // 等于二进制的1000000,十进制的64

左移不会影响操作数的符号位。换句话说,如果将-2 向左移动 5 位,结果将是-64,而非 64。

  1. 有符号的右移:有符号的右移操作符由两个大于号(>>)表示。
    这个操作符会将数值向右移动,但保留符号位(即 正负号标记)。
  2. 无符号右移:无符号右移操作符由 3 个大于号(>>>)表示。
    对于负数,无符号右移是以 0 来填充空位,而不是像有符号右移那 样以符号位的值来填充空位。

(3)布尔操作数

  1. 逻辑非:逻辑非操作符由一个叹号(!)表示。
    无论这个值是什么数据 类型,这个操作符都会返回一个布尔值。逻辑非操作符首先会将它的操作数转换为一个布尔值,然后再 对其求反。
  2. 逻辑与:逻辑与操作符由两个和号(&&)表示。
    在有一个操作数不是布尔值的情况 下,逻辑与操作就不一定返回布尔值;此时,它遵循下列规则:

(1) 如果第一个操作数是对象,则返回第二个操作数;
(2) 如果第二个操作数是对象,则只有在第一个操作数的求值结果为 true 的情况下才会返回该对象;
(3) 如果两个操作数都是对象,则返回第二个操作数;
(4) 如果有一个操作数是 null,则返回 null;
(5) 如果有一个操作数是 NaN,则返回 NaN;
(6) 如果有一个操作数是 undefined,则返回 undefined。

逻辑与操作属于短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值。

  1. 逻辑或:逻辑或操作符由两个竖线符号(||)表示。
    如果有一个操作数不是布尔值,逻辑或也不一定返回布尔值;此时,它遵循下 列规则:

(1) 如果第一个操作数是对象,则返回第一个操作数;
(2) 如果第一个操作数的求值结果为 false,则返回第二个操作数;
(3) 如果两个操作数都是对象,则返回第一个操作数;
(4) 如果两个操作数都是 null,则返回 null;
(5) 如果两个操作数都是 NaN,则返回 NaN;
(6) 如果两个操作数都是 undefined,则返回 undefined。

逻辑或操作符也是短路操作符。也就是说,如果第一个操作数的求值结果为 true,就不会对第二个操作数求值了。

(4) 乘性操作符
3 个乘性操作符:乘法、除法和求模,操作数为非数值的情况下会执行自动的类型转换。

  1. 乘法:乘法操作符由一个星号(*)表示,用于计算两个数值的乘积。
    乘法操作符遵循下列特殊的规则:

(1) 如果操作数都是数值,执行常规的乘法计算,即两个正数或两个负数相乘的结果还是正数,而如果只有一个操作数有符号,那么结果就是负数。如果乘积超过了 ECMAScript 数值的表示范围, 则返回 Infinity 或-Infinity;
(2) 如果有一个操作数是 NaN,则结果是 NaN;
(3) 如果是 Infinity 与 0 相乘,则结果是 NaN;
(4) 如果是 Infinity 与非 0 数值相乘,则结果是 Infinity 或-Infinity,取决于有符号操作数的符号;
(5) 如果是 Infinity 与 Infinity 相乘,则结果是 Infinity;
(6) 如果有一个操作数不是数值,则在后台调用 Number()将其转换为数值,然后再应用上面的规则。

  1. 除法:除法操作符由一个斜线符号(/)表示。
    除法操作符遵循下列特殊的规则:

(1) 如果操作数都是数值,执行常规的除法计算,即两个正数或两个负数相除的结果还是正数,而如果只有一个操作数有符号,那么结果就是负数。如果商超过了 ECMAScript 数值的表示范围,则返回 Infinity 或-Infinity;
(2) 如果有一个操作数是 NaN,则结果是 NaN;
(3 )如果是 Infinity 被 Infinity 除,则结果是 NaN;
(4) 如果是零被零除,则结果是 NaN;
(5) 如果是非零的有限数被零除,则结果是 Infinity 或-Infinity,取决于有符号操作数的符号;
(6) 如果是 Infinity 被任何非零数值除,则结果是 Infinity 或-Infinity,取决于有符号操作数的符号;
(7) 如果有一个操作数不是数值,则在后台调用 Number()将其转换为数值,然后再应用上面的规则。

  1. 求模:求模(余数)操作符由一个百分号(%)表示。
    求模操作符会遵循下列特殊规则来处理特殊的值:

(1) 如果操作数都是数值,执行常规的除法计算,返回除得的余数;
(2) 如果被除数是无穷大值而除数是有限大的数值,则结果是 NaN;
(3) 如果被除数是有限大的数值而除数是零,则结果是 NaN;
(4) 如果是 Infinity 被 Infinity 除,则结果是 NaN;
(5) 如果被除数是有限大的数值而除数是无穷大的数值,则结果是被除数;
(6) 如果被除数是零,则结果是零;
(7) 如果有一个操作数不是数值,则在后台调用 Number()将其转换为数值,然后再应用上面的规则。

(5) 加性操作符
1.加法

(1) 如果有一个操作数是 NaN,则结果是 NaN;
(2) 如果是 Infinity 加-Infinity,则结果是 NaN;
(3) 如果是 Infinity 加 Infinity,则结果是 Infinity;
(4)如果是-Infinity 加-Infinity,则结果是-Infinity;
(5) 如果两个操作数都是字符串,则将第二个操作数与第一个操作数拼接起来;
(6) 如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后再将两个字符串拼接起来。
(7)如果有一个操作数是对象、数值或布尔值,则调用它们的 toString()方法取得相应的字符串值,然后再应用前面关于字符串的规则。对于 undefined 和 null,则分别调用 String()函数并取得字符 串"undefined"和"null"。

  1. 减法

(1) 如果有一个操作数是 NaN,则结果是 NaN;
(2) 如果是 Infinity 减 Infinity,则结果是 NaN;
(3) 如果是-Infinity 减-Infinity,则结果是 NaN;
(4) 如果是 Infinity 减-Infinity,则结果是 Infinity;
(5) 如果是-Infinity 减 Infinity,则结果是-Infinity;
(6)如果是+0 减-0,则结果是-0;
(7) 如果是-0 减-0,则结果是+0;
(8) 如果有一个操作数是字符串、布尔值、null 或 undefined,则先在后台调用 Number()函数将其转换为数值,然后再根据前面的规则执行减法计算。如果转换的结果是 NaN,则减法的结果就是 NaN;
(9) 如果有一个操作数是对象,则调用对象的 valueOf()方法以取得表示该对象的数值。如果得到的值是 NaN,则减法的结果就是 NaN。如果对象没有 valueOf()方法,则调用其 toString()方法并将得到的字符串转换为数值。

(6) 关系操作符
[小于(<)、大于(>)、小于等于(<=)和大于等于(>=)]

(1)如果两个操作数都是字符串,则比较两个字符串对应的字符编码值
(2) 如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较。
(3) 如果一个操作数是对象,则调用这个对象的 valueOf()方法,用得到的结果按照前面的规则执行比较。如果对象没valueOf()方法,则调用 toString()方法,并用得到的结果根据前面的规则执行比较。
(4) 如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较。
(5) 任何操作数与NAN进行关系比较,结果都是false。

(7) 相等操作符
相等和不相等——先转换再比较,全等和不全等——仅比较而不转换。

  1. 相等(==)和不相等(!==)
    先转换操作数(通常称为强制转型),然后再比较它们的相等性。
    在转换不同的数据类型时,相等和不相等操作符遵循下列基本规则:

(1)如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false 转换为 0,而true 转换为 1;
(2)如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
(3)如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf()方法,用得到的基本类型值按照前面的规则进行比较;

两个操作符在进行比较时则要遵循下列规则:

(1) null 和 undefined 是相等的。
(2) 要比较相等性之前,不能将 null 和 undefined 转换成其他任何值。
(3) 如果有一个操作数是 NaN,则相等操作符返回 false,而不相等操作符返回 true。重要提示:即使两个操作数都是 NaN,相等操作符也返回 false;因为按照规则,NaN 不等于 NaN。
(4) 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回 true;否则,返回 false

相等与不相等特殊情况
  1. 全等(===)和不全等(!===)
var result1 = ("55" == 55); //true,因为转换后相等
var result2 = ("55" === 55); //false,因为不同的数据类型不相等

(8) 条件操作符

variable = boolean_expression ? true_value : false_value;
var max = (num1 > num2) ? num1 : num2;

(9) 赋值操作符(=)
(10) 逗号操作符

  • 逗号操作符多用于声明多个变量。
var num1=1, num2=2, num3=3;
  • 逗号操作符还可以用于赋值。在用于赋值时,逗号操作符总会返回表达式中的最后一项
var num = (5, 1, 4, 8, 0); // num的值为0

4.语句

(1) if语句
(2)do-while语句
在对条件表达式求值之前,循环体内的代码至少会被执行一次。
(3)while语句
(4)for语句
果执行了循环体中的代码,则一定会对循环后 的表达式(i++)求值,即递增 i 的值。
由于 ECMAScript 中不存在块级作用 域,因此在循环内部定义的变量也可以在外部访问到。

var count = 10;
    for (var i = 0; i < count; i++){
        alert(i); 
    }
    alert(i);    //10

(5)for-in语句
for-in 语句是一种精准的迭代语句,可以用来枚举对象的属性。
for (property in expression) statement

for (var propName in window) {
     document.write(propName);
}

(6)label语句
使用 label 语句可以在代码中添加标签,以便将来使用。
label: statement

 start: for (var i=0; i < count; i++) {
        alert(i);
}

这个例子中定义的 start 标签可以在将来由 break 或 continue 语句引用。加标签的语句一般都要与 for 语句等循环语句配合使用。
(7) break和continue语句

  • 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

outermost 标签表示外部的 for 语句,内部循环中 的 break 语句带了一个参数:要返回到的标签。添加这个标签的结果将导致 break 语句不仅会退出内 部的 for 语句(即使用变量 j 的循环),而且也会退出外部的 for 语句(即使用变量 i 的循环)。

var num = 0;
outermost:
for (var i=0; i < 10; i++) {
for (var j=0; j < 10; j++) { if (i == 5 && j == 5) { continue outermost;
}
num++; }
}
alert(num);    //95

continue 语句会强制继续执行循环——退出内部循环,执行外部循环。

(8)with语句
with 语句的作用是将代码的作用域设置到一个特定的对象中。
with (expression) statement;

//定义 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;
}

在 with 语句的代码块 内部,每个变量首先被认为是一个局部变量,而如果在局部环境中找不到该变量的定义,就会查询 location 对象中是否有同名的属性。如果发现了同名属性,则以 location 对象属性的值作为变量的值。

严格模式下不允许使用 with 语句,否则将视为语法错误。
(9)switch语句
可以在 switch 语句中使用任何数据类型。
switch 语句在比较值时使用的是全等操作符,因此不会发生类型转换。

5. 函数

function functionName(arg0, arg1,...,argN) {
    statements
}

* 无须指定函数的返回值,因为任何 ECMAScript 函数都可以在任何时候返回任何值。
* 未指定返回值的函数返回的是一个特殊的 undefined 值。

严格模式对函数有一些限制:
(1)不能把函数命名为 eval 或 arguments;
(2)不能把参数命名为 eval 或 arguments;
(3) 不能出现两个命名参数同名的情况。

  • 理解参数
    (1) ECMAScript函数不介意传递进来多少个参数,也不在乎传进来参数是什么数据类型。
    (2) ECMAScript 中的参数在内部是用一个数组来表示,可以通过 arguments 对象来访问这个参数数组,从而获取传递给函数的每一个参数。
    (3) arguments 对象只是与数组类似(它并不是 Array 的实例),因为可以使用方括号语法访问它的每一个元素(即第一个元素是arguments[0],第二个元素是 argumetns[1],以此类推)。
function sayHi(name, message) {
    alert("Hello " + name + "," + message);
}
//重写函数,不显示地使用命名参数
function sayHi() {
    alert("Hello " + arguments[0] + "," + arguments[1]);
}

(4)使用 length 属性来确定传递进来多少个参数(arguments.length)。
(5)arguments 对象可以与命名参数一起使用。
(6)arguments的值永远与对应命名参数的值保持同步。

function doAdd(num1, num2) {
    arguments[1] = 10; //arguments[1]和num2同步,相同
    alert(arguments[0] + num2);
}

1. 如果只传入了一个参数,那么为 arguments[1]设置的值不会反应到命名参数中。这是因为 arguments 对象的长度是由传入的参数个数决定的,不是由定义函数时的命名 参数的个数决定的。
2. 没有传递值的命名参数将自动被赋予 undefined 值
3.严格模式对arguments对象作出了一些限制:在函数中对arguments进行赋值将会变得无效(如:arguments[1]设置为10,num2 的值仍然还是undefined),重写arguments值将会导致语法错误。

  • 没有重载

在 ECMAScript 中定义了两个名字相同的函数,则该名字只属于后定义的函数。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容