js高程笔记1-3章

1 一个完整的JavaScript实现应该由下列三个不同的部分组成
·核心(ECMScript) //ta定义了这门语言的基础
·文档对象模型(DOM) //ta把HTML页面映射为一个多节点结构
·浏览器对象模型(BOM) //开发人员可以通过ta控制器浏览器显示的界面以外的部分

2 向HTML页面插入JavaScript的主要方法,就是使用<script></script>元素。无论是嵌入还是包含,
只要不存在defer和async属性,浏览器都会按照<script>元素在页面中的先后顺序对他们依次进行解析。

3 按照传统的做法,所有<script>元素应放在页面的<head>元素中,但这意味着等到全部的js代码被下载-解析-执行后,
才能开始呈现内容(浏览器在遇到<body>标签时才开始呈现内容)。为避免延迟,现代web程序一般把js引用放在<body>
元素中页面内容的后面。

4 <noscript></noscript> 这个元素可以包含能够出现在文档<body>中的任何HTML元素(script元素除外)。其包含的内容在下列情况
下才会显示出来。
·浏览器不支持js脚本
·浏览器支持js脚本,但js脚本被禁用

5 js标识符
含义:变量、函数、属性的名字(或者函数的参数
规则:
·第一个字符必须是字母、下划线_或者一个美元符号$
·其他字符可以是字母、下划线、美元符号或者数字
规范:
·采用驼峰大小写格式,也就是第一个字母小写,剩下的每个单词首字母大写
注意:
不能把关键字、保留字、true、false和null作为标识符

6 变量
js的变量是松散的类型,所谓松散类型就是可以用来保存任何类型的数据。话句话说,每个变量仅仅是一个用于保存值的占位符而已。
例如:
var message;
上面的代码定义了一个名为message的变量,该变量可以保存任何值(这种未初始化的变量,会保存一个特殊的值--undefined
作用域:
·使用var操作符定义的变量将成为定义该变量作用域中的局部变量。换言之,在函数内使用var定义一个变量,
那个这个变量在函数退出之后就会被自动销毁。
·在函数内省略var操作符,可以创建一个全局变量。但是由于在局部作用域定义的全局变量很难维护,所以我么不建议这么做。
而且如果有意的省略var操作符,也会由于相应变量不会马上就有定义而导致不必要的混乱。

7 数据类型
基本数据类型
·Undefined
·Undefined类型只有一个值,即特殊的undefined。在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined
var message;
console.log(message == undefined); // true
·包含undefined值的变量和尚未定义的变量还是不一样。比如:
var message; // 这个变量声明之后默认取得了undefined值
// 下面这个变量没有声明
// var age;
console.log(message); // undefined
console.loog(age);
·对于未声明过的变量,只能执行一项操作,即使用type操作符检测其数据类型
console.loog(typeof age); // "undefined"
·一般不存在需要显式地把一个变量设置为undefined值的情况。字面值undefined的主要目的是用于比较
·ECMA第三版之前没有这个值,第三版引进这个值是为了正式区分空对象指针与未经初始化的变量
·Null
·Null类型是第二个只有一个值的数据类型,这个值是特殊的null。从逻辑角度来看,null值表示一个空对象指针。
这也是使用typeof操作符检测null值会返"object"的原因
var car = null;
console.log(typeof car) // "object"
·如果定义的变量在将来准备用于保存对象,那么最好将其初始化为null而不是其他值。这样一来,直接检查null值
就可以知道相应的变量是否已经保存了一个对象的引用
if (car != null){
// 对对象执行某些操作
}
·实际上,undefined值是派生自null值的,因此,ECMA-262规定它们的相等性测试要返回true
console.log(null == undefined); // true
·null和undefined虽然有上面那种关系,但是它们的用途完全不同。如前所述,无论在什么情况下,都没有必要把一个变量
的值显式的设置为undefined,可同样的规则对null却不适用。换句话说,只要意在保存对象的变量还没有真正保存对象时,
就应该明确让该变量保存null值。这样做不仅可以体现null作为空对象指针的惯例,也有助于进一步区分null和undefined

·Boolean
·Boolean类型是ECMAScript中使用的最多的一中类型,该类型只有两个字面值:true、false.
·虽然Boolean类型的值只有两个,但ECMAScript中所有类型的值都有与这两个Boolean值等价的值,要将
一个值转换为其对应的Boolean值,可以调用转型函数Boolean()
var message = "Hello Word!";
var messageAsBoolean = Boolean(message);
·下面给出各种数据类型及其对应的转换规则
数据类型 转换为true值 转换为false值
Boolean true false
String 任何非空字符串 ""(空字符串)
Number 任何非零数组(包括无穷大) 0和NaN
Object 任何对象 null
Undefined undefined
·上面这些转换对于理解流程控制语句自动执行的Boolean转换非常重要
var message = "Hello Word!";
if (message){
console.log("Value is true");
}
·Number
·浮点数值
·由于保存浮点数值需要的内存空间是保存整数值的两倍,因此,ECMAScript会不失时机地将浮点数值转换为
整数值
var floatNum1 = 1.; // 小数点后面没有数字---解析为1
var floatNum2 = 10.0; // 整数--解析为10
·计算误差。浮点数的最高精度是17位小数,但是进行算数计算时,其精度远远不如整数。例如
console.log(0.1+0.2) // 0.30000000000000004
究竟是什么原因造成了这个问题?实际上是因为计算机内部的信息都是又二进制方式表示的,即
0和1组成的各种编码,但由于某些浮点数没法用二进制准确的便是出来,也就带来了一系列精度问题。
当然这也不是js独有的问题,而是弱类型语言的通病。
解决方案:将浮点数乘以(扩大)10的n次方倍,把浮点数变成整数后再进行相应的运算,最后将
得到的结果除以(缩小)10的n次方倍
console.log((0.1*10 + 0.2*10)/10);
·数值范围
·由于内存的限制,ECMAScript并不能保存世界上所有的数值。
ECMAScript能保存的最小数值保存在Number.MIN_VALUE中 ----5e-324 (e表示法即科学记数法
最大数值保存在Number.MAX_VALUE中 ----1.7976931348623157e+308
·如果某次计算的结果得到了一个超出JavaScript数值范围的值,那么这个数值会被自动转换成特殊的Infinity值。
具体来说,如果这个数值是负数,则会被转换成-Infinity(负无穷),如果这个值是正数,则会被转换成
Infinity(正无穷)
·如上所述,如果某次计算返回了正或负的Infinity值,那么该值将无法继续参与下一次的计算,因为Infinity不是能参与
计算的数值
·要确定一个数值是不是有穷的,换句话说,是不是位于最大和最小数值之间,可以使用isFinite() 函数
var result = Number.MAX_VALUE + Number.MAX_VALUE;
console.log(result); // false
·尽管计算中很少出现某些值超出表示范围的情况,但是执行极小或极大数值的计算时,检测监控这些值是可能的,也是必须的

·NAN
·NaN,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数却未返回数值的情况(这样就不会抛出错误了).
例如,在其他编程语言中,任何数值除以非数值都会导致错误,从而停止代码执行。但在ECMAScript中,任何数值除以非数值都会返回NaN,因此
不会影响其他代码的执行
·NaN本身有两个特点。首先,任何涉及NaN的操作(例如NaN/10)都会返回NaN。其次,NaN与任何值都不相等,包含NaN本身,例如:
console.log(NaN == NaN); // false
·针对以上两个特点,ECMAScript定义了isNaN()函数。这个函数接受一个参数,该参数可以是任何类型,而函数会帮我们确定这个参数是否'不是数值'。
isNaN()在接收到一个值之后,会尝试将这个值转换成数值。某些不是数值的值会直接转换为数值,例如字符串'10'或boolean值。而任何不能被转换成
数值的值都会导致这个函数返回true
console.log(isNaN(NaN); // true
console.log(isNaN(10)); //false (10是一个数值)
console.log(isNaN("10")); //false(可以被转换成数值10)
console.log(isNaN("blue")); //true(不能被转换成数值)
console.log(isNaN(true)); // false(可以被转换成数值1)
·尽管有些不可思议,但isNaN()确实也适用于对象。在基于对象调用isNaN()函数时,会首先调用对象的valueOf()方法,然后确定该方法返回的值是否
可以转换成数值。如果不能,则基于这个返回值再调用toString()方法,再测试返回值
·数值转换
有三个函数可以把非数值转换成数值:Number()、parseInt()和parseFolat()。第一个函数,即转型函数可以用于任何数据类型,而另两个函数则专门
用于把字符串转换成数值。这三个函数对于同样的输入会返回不同的结果
·Number()
数据类型 转换为普通数值 返回特殊数值NaN
Boolean true(1),false(0) 其他

只包含数字或浮点数,包括到正负号的情况
String 空字符串(0) 其他
只包含有效的十六进制格式(相同大小的十进制整数值)

Number 数值 其他

Object null(0) 其他
非null的对象,即isNaN(object) == false

Undefined 其他
·parseInt()
由于Number()函数在转换字符串时比较复杂而且不够合理。因此,在处理整数的时候常用的是parseInt()函数。它在转换字符串时,更多的
是看其是否符合数值模式。它会忽略字符串前面的空格,直到找到第一个非空格字符,如果第一个字符不是数字符号或者负号,parseInt()
就会返回NaN;如果第一个字符是数字字符,parseInt()会继续解析第二个字符,知道解析完所有的后续字符或遇到了一个非数字字符。
如果字符串的第一个字符是数字字符,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 (十进制数)
parseInt()函数提供了第二个参数:转换时使用的基数(即多少进制)。多数情况下,我们要解析的都是十进制数值,因此始终将10作为第二个参数是非常必要的
var num7 = parseInt("070",10) // 70 (指定了转换基数为十进制)
·parseFloat()
与parseInt()函数类似。但有两个区别
·parseFloat()解析到字符串的第一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符串将被忽略
·parseFloat()始终会忽略字符串前导的零。因为它只解析十进制数值
注:如果字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后都是0),parseInt()会返回整数

var num1 = parseFloat("12345blue"); //1234 (整数)
var num2 = parseFloat("0xA"); // 0
var num3 = parseFloat("22.5"); // 22.5
var num3 = parseFloat("22.34.5"); // 22.34
var num3 = parseFloat("0904.4"); // 904
var num3 = parseFloat("3.125e7"); // 31250000
·String
与PHP中的双引号和单引号会影响字符串的解释方式不同,ECMAScript中的这两种语法形式没有什么区别。
·字符字面量
String数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符,或者具有其他用途的字符
\n 换行
\t 制表
\b 退格
\r 回车
\f 进纸
\\ 斜杠
\' 单引号(') ,在用单引号表示的字符串中使用。例如:'He said, \'hey.\'';
\' 双引号(") ,在用双引号表示的字符串中使用。例如:"He said, \"hey.\"";
\xnn 以十六进制代码nn表示的一个字符(其中n为0-F) 。例如:\x41表示 "A"
\unnn 以十六进制代码nnn表示的一个Unicode字符(其中n为0-F)。例如, \u03a3表示希腊字母Σ
这些字符字面量可以出现在字符中的任意位置,而且也将被作为一个字符来解析
·字符串的特点
ECMAScript中的字符串是不可变的,也就是说字符串一旦创建,他们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后
再用另一个包含新值的字符串填充改变量
·转换为字符串
方式1:
使用几乎每个值都有的toString方法,这个方法唯一要做的就是返回相应值的字符串表现。
var age = 11;
console.log(age.toString()); // 字符串"11"
var found = true;
console.log(found.toString); //字符串"true"
数值,布尔值,对象和字符串(没错,每个字符串也都有一个toString()方法,该方法返回字符串的一个副本)都有toString方法,但null和undefined
值没有这个方法。
默认情况下,toString方法不必传递参数,此时,toString()方法以十进制格式返回数值的字符串表示。而通过传递基数,toString()可以输出以二进制
,八进制,十六进制,乃至其他任意有效进制格式表示的字符串:
var num = 10;
console.log(num.toString()); // "10"
console.log(num.toString(2)); // "1010"
console.log(num.toString(8)); // "12"
console.log(num.toString(10)); // "10"
console.log(num.toString(16)); // "a"
方式2:
在不知道要转换的值是不是null或undefined 的情况下,还可以使用转型函数String(),这个函数能够将任何类型的值转换成字符串。String()函数遵循下列转换规则:
·如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果
·如果值是null,则返回"null"
·如果值是undefined,则返回"undefined"
方式3:
使用加号操作符把它与一个字符串""加在一起
复杂数据类型
·Object
ECMAScript中的对象其实就是一组数据和功能的集合。对象可以通过执行new操作符后跟要创建的对象类型的名称来创建。而创建Object类型的实例,就可以创建
自定义对象。
var o = new Object();
·如果不给构造函数传递参数,可以省略后面的一对圆括号
var o = new Object; // 有效,但不推荐省略圆括号
·仅仅创建Object实例并没有什么用处,但关键要理解一个重要的思想:即在ECMAScript中,Object类型是所有它的实例的基础。换句话说Object类型所具有的
任何属性和方法也同样存在于更具体的对象中。Object中的每个实例都具有下列属性和方法
·constructor :保存着用于创建当前对象的函数。对于前面的例子而言,构造函数(constructor)就是Object()
·hasOwnProperty(propertyName): 用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,作为参数的属性名(propertyName)
必须以字符串形式指定
·isPrototypeof(Object):用于检查传入的对象是否是当前对象的原型
·propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in来枚举。其中,作为参数的属性名(propertyName)必须以字符串形式指定。
·toLocaleString() :返回对象的字符串表示,该字符串与执行环境的地区对应。
·toString() :返回对象的字符串表示
·valueOf() :返回对象的字符串、数值、或布尔值表示。通常与toString()方法的返回值相同
由于在ECMAScript中的Object是所有类型的基础,因此所有的对象都具有这些基本的属性和方法。BOM和DOM中的对象是浏览器环境中的对象,属于宿主对象。
因为它们是由宿主提供和定义的,因此宿主对象可能也也可能不会继承Object


8 typeof操作符
由于ECMAScript是松散类型的,因此需要有一种手段来检测给定变量的数据类型
对一个值使用typeof操作符 ,可能返回下列某个字符串
·"undefined" ---值未定义
·"boolean" --值是布尔值
·"string" --值是字符串
·"number" --值是数值
·"object" --值是对象或null
·"function" --值是函数

9 操作符
·一元操作符
只能操作一个值的操作符叫做一元操作符
·递增和递减操作符
递增和递减直接借鉴于C,而且各有两个版本:前置型和后置型
·前置型和后置型的区别
前置型:变量的值是在语句被求值之前改变的。后置型:变量的值是在包含它们的语句被求值之后才改变的。例如:
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2; // 等于22;
var num4 = ++num1 + 1; //等于3
·非数值执行递增或递减的规则
自动将其用Number()函数转换成数值,然后再执行加一或者减一的操作。
·一元加和减操作符
·一元加操作符以一个加号表示,放在数值前面,对数值不会产生任何影响。一元减操作符主要用于表示负数,例如将1转换成-1。
·在对非数值应用一元操作符时,该操作符会像Number()转型函数一样对这个值进行转换。最后将得到的数值转换为负数。
·位操作符
//设计二进制知识,以后补档

·布尔操作符
在一门编程语言中,布尔操作符的重要性堪比相等操作符。如果没有测试两个值关系的能力,那么诸如if...else和循环之类的语句就不会有用武之地了。
·逻辑非
逻辑非操作符由一个谈好(!)表示,可以应用于ECMAScript中的任何值。无论这个值是什么数据类型,这个操作符都会返回一个布尔值。
逻辑非操作符首先会将它的操作数转换为一个布尔值(调用转型函数Boolean()),然后再对其求反。
逻辑非操作符也可以用于将一个值转换为与其对应的布尔值。同时使用两个逻辑非操作符,实际上会模拟Boolean()转型函数的行为。
·逻辑与
逻辑与操作符由两个和号( && )表示,有两个操作数,
逻辑与操作可以应用于任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值。此时:
·如果第一个操作数是对象,则返回第二个操作数
·如果第二个操作数是对象,则只有在第一个操作数的求值结果为true的情况下才会返回该对象
·如果两个操作数都是对象,则返回第二个操作数
·如果第一个操作数是null,则返回null
·如果第一个操作数是NaN,则返回NaN
·如果第一个操作数是undefined,则返回undefined
逻辑与属于短路操作,即如果第一个操作数能决定结果,那么就不会再对第二个操作数求值。对于逻辑与操作而言,如果第一个操作数是false,则无论
第二个操作数是什么值,结果都不可能是true了。
var found = false;
var result = found && someUndefinedVariable; // 不会发生错误
console.log(result); // false
上述代码,虽然someUndefinedVariable变量没有定义,但也不会报错。因为第一个操作数的值是false,而这也就意味着逻辑与运算的结果必定是false,
根本不用再对&&右侧的操作数求值了。
·逻辑或
逻辑或操作符由两个竖线符号( || )表示,有两个操作数。
与逻辑与操作符相似,如果有一个操作数不是布尔值,逻辑或也不一定返回布尔值;此时:
·如果第一个操作数是对象,则返回第一个操作数
·如果第一个操作数的求值结果为false,则返回第二个操作数
·如果两个操作数都是对象,则返回第一个操作数
·如果两个操作数都是null,则返回null
·如果两个操作数都是NaN,则返回NaN
·如果两个操作数都是undefined,则返回undefined
逻辑或的短路操作示例:
var found = true;
var result = (found || someUndefinedVariable); //短路了,不会对未定义变量someUndefinedVariable求值,不会报错。
我们可以利用逻辑或的这一行为来避免为变量赋null或undefined值。例如:
var preferred = null;
var backup = new Object();
var result = found || backup;
//在上面的例子中,变量result将被赋予等号后面两个值的一个。变量preferred中包含优先赋给变量result的值,变量backup负责在preferred中不包含
有效值情况下提供后备值。ECMAScript程序的赋值语句经常会使用这种模式,本书也将采用这种模式。
·乘性操作符
ECMAScript定义了3个乘性操作符:乘法、除法、求模。这些操作符与Java、C或者Perl中的相应操作符用途类似,只不过在操作数为非数值的情况下会执行自动的
类型转换。如果参与乘性计算的某个操作数不是数值,后台会先使用Number()转型函数将其转换为数值。也就是说:空字符串会被当做0,布尔值true会被当做1

·乘法
乘法操作符由一个星号( * )表示,用于计算两个数值的乘积。其语法类似于C;
在处理特殊值的情况下,乘法操作符遵循下列特殊的规则:
·如果操作数都是数值,执行常规的乘法计算。如果乘积超过了ECMAScript数值的表设计范围,则返回Infinity或-Infinity
·如果有一个操作数是NaN,则结果是NaN
·如果是Infinity与0相乘,则结果是NaN
·如果是Infinity与非0数值相乘,则结果是Infinity或-Infinity
·如果Infinity与Infinity相乘,则结果是Infinity
·如果有一个操作数不是数值,则在后台调用Number()将其转换为数值,然后再应用上面的规则。
·除法
除法操作符由一个斜线符号( / )表示,执行第二个操作数除以第一个操作数的计算。
在处理特殊值的情况下,乘法操作符遵循下列特殊的规则:
·如果操作数都是数值,执行常规的除法计算。如果乘积超过了ECMAScript数值的表设计范围,则返回Infinity或-Infinity
·如果有一个操作数是NaN,则结果是NaN
·如果是Infinity被Infinity除,则结果是NaN
·如果是零被零除,则结果是NaN
·如果是非零的有限数被零除,则结果是Infinity或-Infinity
·如果是Infinity被任何非零数值除,则结果是Infinity或-Infinity
·如果有一个操作数不是数值,则在后台调用Number()将其转换为数值,然后再应用上面的规则。
·求模
求模(余数)操作符由一个百分号(%)表示,用法如下:
var result = 26 % 5; // 1
与另外两个乘性操作符类似,求模操作符会遵循下列特殊规则来处理特殊的值:
·如果操作数都是数值,执行常规的除法计算,返回除得的余数
·如果被除数是无穷大值而除数是有限大的数值,则结果是NaN
·如果被除数是有限大的数值而除数是零,则结果是NaN
·如果Infinity被Infinity除,则结果是NaN
·如果被除数是有限大的数值而除数是无穷大的数值,则结果是被除数
·如果被除数是零,则结果是零
·如果有一个操作数不是数值,则在后台调用Number()将其转换为数值,然后再应用上面的规则。

·加性操作符
加法和减法这两个加性操作符应该说是编程语言中最简单的。但在ECMAScript中,这两个操作符都有一系列的特殊行为。与乘性操作符类似,加性操作符也会在
后台转换不同的数据类型。然而,对于加性操作符而言,相应的转换规则还稍微有点复杂。
·加法
规则:
·如果两个操作数都是数值,执行常规的加法计算
·如果有一个操作数是NaN,则结果是NaN
·如果是Infinity加Infinity,结果是Infinity
·如果是Infinity加-Infinity,结果是NaN
·如果是-Infinity加-Infinity,结果是-Infinity
·如果是+0 加 +0,则结果是+0
·如果是-0 加 -0,则结果是-0
·如果是+0 加 -0,则结果是+0
·如果有一个操作数是字符串,那么,就要遵循如下规则
·如果两个操作数都是字符串,则将第二个操作数与第一个操作数拼接起来
·如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后再将两个字符串拼接起来
·如果有一个操作数是对象、数值、布尔值,则调用它们的toString()方法取得相应的字符串值,然后再应用前面的字符串规则。对于undefined和null,
则分别调用String()函数并取得字符串"undefined"和"null"
·如果两个操作数都不是数值或字符串,则分别调用Number()转型函数转换为数值,再进行加法计算

·减法
遵循规则:
·如果两个操作数都是数值,执行常规的减法计算
·如果有一个操作数是NaN,则结果是NaN
·如果是Infinity减Infinity,结果是NaN
·如果是Infinity减-Infinity,结果是Infinity
·如果是-Infinity减-Infinity,结果是NaN
·如果是+0 减 +0,则结果是+0
·如果是-0 减 +0,则结果是-0
·如果是-0 减0 -0,则结果是+0
·如果有一个操作数不是数值,现在后台调用Number()转型函数将其转换为数值,然后进行减法计算

·关系操作符
小于(<) 、大于(>)、小于等于(<=)和大于等于(>=)这几个操作符用于对两个值进行比较。
与ECMAScript中的其他操作一样,当关系操作符的操作数使用了非数值时,也要进行数据转换或完成某些奇怪的操作。
·如果两个操作数都是数值,则执行数值比较
·如果两个操作数都是字符串,则比较两个字符串对应的字符编码值
·如果一个数是数值,则将另一个操作数转换为一个数值,然后执行数值比较
·如果一个操作数是对象,则调用这个对象的valueOf()方法,用得到的结果按照前面的规则执行比较,如果没有valueOf()方法,则
调用toString()方法
·如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较
注意:任何数与NaN进行关系比较,结果都是false
·相等操作符
·相等和不相等
== 和!= 操作符都会先转换操作数(通常称为强制转型),然后再比较它们的相等性
在转换不同的数据类型时,相等和不相等操作符遵循下列基本规则:
·如果有一个操作数是布尔值,则在比较相等性之前像将其转换为数值
·如果有一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值
·如果有一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型按照前面的规则进行比较。
·null和undefined是相等的
·要比较相等性之前,不能将null和undefined转换乘其他任何值
·如果有一个操作数是NaN,不管另一个操作数是什么,都返回false
·如果两个操作数都是对象,则比较它们是不是同一个对象。
·全等和不全等
·全等操作符由 === 表示,不全等操作符由 !== 表示
除了在比较之前不转换操作数之外,全等和不全等与相等和不相等操作符没有什么区别。
注:由于相等和不相等操作符存在类型转换问题,而为了保持代码中数据类型的完整性,我们推荐使用全等和不全等操作符。
·条件操作符
variable = boolean_expression ? true_value : false_value;
·赋值操作符
简单的赋值操作符由等号(=)表示,其作用就是把右侧的值赋给左侧的变量。
每个算术操作符(以及个别的其他操作符)都由对应的复合赋值操作符。这些操作符如下所示:
·乘/赋值(*=)
·除/赋值(/=)
·模/赋值(%=)
·加/赋值(+=)
·减/赋值(-=)
·左移/赋值(<<=)
·有符号右移/赋值(>>=)
·无符号右移赋值(>>>=)

·逗号操作符
使用逗号操作符可以在一条语句中执行多个操作。
var num1 = 1, num2 = 2, num3 = 3;

10.语句
·if语句
大多数编程语言中最为常用的语句就是if语句。
if(true) alert(1) else alert(2);
·do-while语句
do-while语句是一种后测试循环语句,即只有循环体中的代码执行之后,才会测试出口条件。
do {
alert(1);
}while(true);
·while语句
while语句属于前测试循环语句。也就是说,在循环体内的代码被执行之前,就会对出口条件求值。
·for语句
for语句也是一种前测试次循环语句。
var count = 10;
for(var i = 0; i < count; i++){
alert(i);
}
alert(i);
由于ECMAScript中不存在块级作用域,因此在循环内部定义的变量也可以在外部访问到。
此外,for语句中的初始化表达式、控制表达式和循环后表达式都是可选的,将这三个表达式全部省略,就会创建一个无限循环,例如:
for(;;){
doSomething;
}

·for-in语句
for-in是一种精准的迭代语句,可以用来枚举对象的属性。
for (var propName in window){
document.write(propName);
}
以上的例子中,我们使用for-in循环来显示BOM中window对象的所有属性。
与for语句类似,这里控制语句中的var操作符也不是必需的。但是,为了保证使用局部变量,我们推荐上面例子的这种用法。
ECMAScript对象的属性没有顺序。因此,通过for-in循环输出的属性名的顺序是不可预测的。具体来讲,所有属性都会被返回一次,但返回的先后次序可能会因浏览器而异。
但是,如果要迭代的对象的变量值为null或undefined,for-in语句会抛出错误。ECMAScript5更正了这一行为;对这种情况不会再抛出错误,而只是不执行循环体。
·label语句
使用label语句可以在代码中添加标签,以便将来使用。一下是label语句的用法:
start: for(var i = 0; i < 10; i++){
console.log(i);
}
·break 和 continue语句
break 和 continue语句用于在循环中精确地控制代码的执行。其中,break语句会立即退出循环,强制执行循环后面的语句。而continue语句虽然也是立即
退出循环,但退出循环后会从循环的顶部继续执行。以下是label和break语句的混合使用:
start: for(var x = 0; x < 2; x++){
for(var y = 0; y < 2; y++){
if(y == 1){
break start;
}
console.log('x:'+x+',y:'+y);
}
}
当最外层的for循环进行到第二次循环之后,使用break语句跳出循环,start标签表示外部的for语句。此时,不仅会跳出内部的for语句,也会跳出外部的for语句。

·switch语句
switch语句与if语句关系最为密切,而且也是在其他语言中普遍使用的一种流控制语句。
var name = '程琳';
switch( true){
case name === '程琳':
/*合并两种情形*/
case name === '王琳':
console.log('bingo');
break;
default:
console.log('other');
}
虽然ECMAScript中的switch语句借鉴自其他语言,但这个语句也有自己的特色。首先,可以在switch语句中使用任何数据类型(在很多其他语言中是能使用数值),无论是
字符串,还是对象都没有问题。其次,每个case的值不一定是常量,也可以是变量,甚至是表达式
注意:switch在比较值使用的是全等操作符,因此不会发生类型转换。

·函数
函数对于任何语言都是核心的概念。通过函数可以封装任意多条语句,而且可以在任何地方任何时候调用执行。ECMAScript中的函数使用function关键词来声明,后跟一组参数以及函数体。
function functionName(arg0 , arg1 , ...,argN){
statements;
}
函数可以没有return 语句或者return语句不带任何返回值。在这两种情况下,函数返回的是undefined值。后者一般用于在需要提前停止函数而又不需要返回值的情况下。
推荐的做法要么让函数始终都返回一个值,要么永远都不要返回值。否则,如果函数有时候返回值,有时候不返回值,会给调试代码带来不便。
·理解参数
·ECMAScript函数的参数与大多数其他语言中函数的参数有所不同。ECMAScript不介意传递进来多少个参数,也不在乎传进来参数是什么类型。也就是说,即便你定义的函数
只接受两个参数,在调用这个函数时也未必一定要传递两个参数,可以传递一个、三个甚至不传递参数,而解析器永远不会有什么怨言。
·之所以会这样,原因是ECMAScript中的参数在内部是用一个数组表示的。函数接收到的始终都是这个数组,而不关心数组中包含哪些参数(如果有参数的话)。
如果这个数组中不包含任何元素,无所谓;如果包含多个元素,也没有问题。实际上,在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。
·其实,arguments对象只是与数组类似(它并不是Araay实例),因为可以使用方括号语法访问它的每个元素,使用length属性来确定传递将来多少个参数:
function demo(){
for(var i = 0; i < arguments.length ; i++){
//打印传递将来的每一个参数
console.log(arguments[i]);
}
}
demo('a','b','c');
·以上事实说明了ECMAScript函数的一个重要特点:函数的参数只提供便利,但不是必需的。
·没有传递值的命名参数被自动赋予了undefined值。这跟定义了变量但是又没有初始化一样。
·没有重载
·ECMAScript函数不能像传统意义上那样实现重载。而在其他语言(如 Java)中,可以为一个函数编写两个定义,只要这两个定义的签名(接受的参数的类型和数量)不同即可。
如前所述,ECMAScript函数没有签名,因为其参数是由包含零或多个值的数组来表示的,而没有函数签名,真正的重载是不可能做到的。
·如果在ECMAScript中定义了两个名字相同的函数,则该名字只属于后定义的函数。
·通过检查传入函数中参数的类型和数量并作出不同的反应,可以模仿方法的重载。
posted @ 2019-07-28 09:28  cl94  阅读(182)  评论(0编辑  收藏  举报