高程(第三章) 基本概念

1 语法

1.1 辨别大小写

ECMAScript中的统统(变量、函数名和操纵符)都辨别大小写。

1.2 严厉情势

ECMAScript 5 引入了严厉情势(strict mode)的观点。严厉情势是为JavaScript定义了一种差别的剖析与实行模子。
在严厉情势下,ECMAScript 3 中的一些不肯定的行动将获得处置惩罚,而且对某些不安全的操纵也会抛出毛病。
要在悉数剧本中启用严厉情势,可以再顶部增添以下代码:

"use strict" 

指定函数在严厉情势下实行:

function  doSomething(){
    "use strict";
    //函数体
}

2 关键字和保留字

关键字
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

保留字
ECMA-262 第五版非严厉情势:class、enum、extends、super、const、export、import

ECMA-262 第五版严厉情势增添以下限定:implements、package、public、interface、private、static、let、protected、yield

3 变量

ECMAScript的变量是松懈范例的,所谓松懈范例就是可以用来保留任何范例的数据。换句话说,每一个变量仅仅是一个用于保留值得占位符罢了。

var message;

像如许未经由初始化的变量,会保留一个特别的值——undefined

给未经声明的变量赋值在严厉情势下会致使抛出PeferenceError毛病

4 数据范例

ES 5
5种简朴数据范例(也称为基本数据范例):Undefined、Null、Boolean、Number、String
1种庞杂数据范例——Object,Object本质上是由一组无序的名值对构成的。

ES 6 新增一种数据范例——标记对象(Symbol)

4.1 typeof 操纵符

typeof 用来检测给定变量的数据范例

“undefined”——假如这个值未定义
“boolean”——假如这个值是布尔值
“string”——假如这个值是字符串
“number”——假如这个值是数值
“object”——假如这个值是对象null
“function”——假如这个值是函数

  • 挪用typeof null会返回”object“,因为特别值null被认为是一个空的对象援用

4.2 Undefined 范例

Undefined范例只需一个值,即特别的undefined。在运用var声明变量但未对其加以初始化时,这个变量的值就是undefined

var message;
console.log(message == undefined); //true

字面量undefined的主要目标是用于比较,为了正式辨别空对象指针与未经初始化的变量

4.3 Null 范例

Null范例是第二个只需一个值的数据范例,这个特别的值是null。从逻辑角度来看,null值示意一个空对象指针,而这也正式运用typeof操纵符检测null值时会返回”object”的缘由

var car = null;
console.log(typeof null); //object

假如定义的变量预备在未来用于保留对象,那末最好将该变量初始化为null而不是其他值。如许一来,只需直接搜检null值就可以晓得响应的变量是不是已保留了一个对象的援用。

实际上,undefined值是派生自null值得,因而ECMA-262划定对他们的相称性测试要返回true

console.log(null == undefined); //true

4.4 Boolean 范例

Boolean范例只需两个字面值:truefalse

Boolean范例的字面值true和false是辨别大小写

可以对任何数据范例的值挪用Boolean()函数,而且总会返回一个Boolean值

数据范例转换为true的值转换为false的值
Booleantruefalse
String任何非空字符串“” (空字符串)
Number任何非零数字值0和NaN
Object任何对象null
UndefinedN/Aundefined

n/a (N/A),是not applicable的缩写,意义是”不实用”。

4.5 Number范例

Number范例运用IEEE754花样来示意整数和浮点数值(双精度值)。为支撑种种数值范例ECMA-262定义了差别的数值字面量花样。

  • 十进制

var intNum == 55;
  • 八进制
    八进制字面值的第一位必需是零(0),然后是数字序列(0~7)。假如字面值中的数值超越了局限,那末_前导零_ 将被疏忽,背面的数值将被当作十进制十进制数值剖析

var octalNum1 = 070; //八进制的56
var octalNum2 = 079; //无效的八进制数值——剖析为79
var octalNum3 = 08;  //无效的八进制数值——剖析为8

八进制字面量在严厉情势下是无效的,会致使支撑该情势的JavaScript引擎抛出毛病。

  • 十六进制
    十六进制字面值的前两位必需是0x,后跟任何十六进制数字(0~9 及 A~F)。字母A~F可以大写,也可以小写

var hexNum1 = 0xA;    //十六进制的10
var hexNum2 = 0x1f;    //十六进制的31

在举行算数盘算时,一切以八进制和十六进制示意的数值终究都将被转换成十进制数值

4.5.1 浮点数值

保留浮点数值须要的内存空间是保留整数值得两倍,假如小数点背面没有跟任何数字,或许浮点数值自身示意的就是一个整数(如1.0),那末该值将会被转换成整数

var floatNum1 = 1;        //小数点背面没有数字——剖析为1
var floatNum2 = 10.0;    //整数——剖析为10

关于那些极大或极小的数值,可以用e示意法(即科学计数法)示意浮点数值。用e示意法示意的数值即是e前面的数值乘以10的指数次幂。

var floatNum1 = 3.125e7;    //即是31250000
var floatNum2 = 3e-7;        //即是0.0000003

浮点数值得最高精度是17位小数,但在举行算术盘算时其精度远远不如整数。比方,0.1加0.2的效果是0.30000000000000004

4.5.2 数值局限

因为内存的限定,ECMAScript并不能保留世界上一切的数值。

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

假如某次盘算的效果获得了一个超越JavaScript数值局限的值,那末这个值将被自动转换成特别的Infinity值

正无穷大 Infinity
负无穷大 -Infunity
isFinite()函数可以推断一个数值是不是又穷的

4.5.3 NaN

NaN,即非数值(Not a Number),是一个特别的数值,这个数值用于原本要返回数值的操纵数未返回数值的状况(如许就不会抛出毛病了)

任何触及NaN的操纵(比方NaN/10)都邑返回NaN
NaN与任何值都不相称,包括NaN自身

console.log(NaN == NaN);    //false

ECMAScript定义了isNaN()函数,这个函数接收一个参数,该参数可以是任何范例,而函数会帮我们肯定这个函数是不是”不是数值”

isNaN()也实用于对象,基于对象挪用isNaN()函数时,会先挪用对象的valueOf()要领,再肯定该要领返回的值是不是可以转换为数值。假如不能,则基于这个返回值再挪用toString()要领,在测试返回值

4.5.4 数值转换

Number()parseInt()parseFloat()

4.6 String范例

4.6.1 字符字面量

String数据范例包括一些特别的字符字面量,也叫转义序列,用于示意非打印字符,或许具有其他用处的字符。

  • n:换行

  • t:制表

  • b:退格

  • r:回车

  • f:进纸

  • x_nn_:以十六进制代码_nn_示意的一个字符(个中_n_为0~F)。比方,x41示意”A”

  • u_nnnn_:以十六进制代码_nnnn_示意的一个Unicode字符(个中_n_为0~F)。比方,u03a3示意希腊字符Σ

任何字符串的长度都可以经由过程接见其length属性获得:

var text = "This is the letter sigma: \u03a3.";
console.log(text.length);    //输出28

这个属性返回的字符数包括16位字符的数量。假如字符串中包括双字节字符,那末length属性可以不会精确地返回字符串中的字符数量。

4.6.2 字符串的特性

ECMAScript中的字符串是不可变的。字符串一旦建立,它们的值就不能转变。要转变某个变量保留的字符串,首先要销本来的字符串,然后再用另一个包括新值的字符串添补该变量

4.6.3 转换为字符串

要把一个值转换为一个字符串有两种要领:

  • 险些每一个值都有的toString()要领

nullundefined没有这个要领
toString()要领接收一个参数:输出数值的基数,toString()可以输出以二进制、八进制、十六进制,以致其他恣意有用进制花样示意的字符串值(默许基数为10)

  • String()函数可以将任何范例的值转换为字符串

假如值有toString()要领,则挪用该要领(没有参数)并返回响应的效果;
假如值是null,则返回”null”;
假如值是undefined,则返回”undefined”。

4.7 Object 范例

ECMAScript中的对象实在就是一组数据和功用的鸠合。对象可以经由过程实行new操纵符后跟要建立的对象范例的称号来建立。

var o = new Object();    //无传参时可以省略括号,但不引荐这么做

Object的每一个实例都具有以下属性和要领:

  • constructor:保留着用于建立当前对象的函数。关于前面的例子而言,组织函数(constructor)就是Object()

  • hasOwnProperty(propertyName):用于搜检给定的属性在当前对象实例中(而不是在实例的原型中)是不是存在。个中,作为参数的属性名(_propertyName_)必需以字符串情势指定(比方:o.hasOwnProperty("name"))

  • isPrototypeOf(Object):用于搜检传入的对象是不是是当前对象的原型

  • propertyIsEnumerable(propertyName):用于搜检给定的属性是不是可以运用for-in语句来罗列。与hasOwnProperty()要领一样,作为参数的属性名必需以字符串情势指定

  • toLocaleString():返回对象的字符串示意,该字符串与实行环境的区域对应

  • toString():返回对象的字符串示意

  • valueOf():返回对象的字符串、数值或布尔值示意。平常与toString()要领的返回值雷同

因为在ECMAScript中Object是一切对象的基本,因而一切对象都具有这些基本的属性和要领。

5 操纵符

5.1 一元操纵符

只能操纵一个值的操纵符叫做一元操纵符

5.1.1 递增和递减操纵符

  • 实行前置递增和递减操纵符时,变量的值都是在语句被求值之前转变的(在盘算机范畴,这类状况平常被称作副效应)

var age = 29;
var antherAge = --age + 2;

console.log(age);            //输出28
console.log(anotherAge);    //输出30
  • 实行后置递增和递减操纵符时,变量的值都是在语句被求值以后转变的

var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2;    //即是22
var num4 = num1 + num2;        //即是21

递增递减操纵符对任何值都实用

5.1.2 一元加和减操纵符

在对非数值运用一元加(减)操纵符时,该操纵符会像Number()函数一样对这个值实行转换。

5.2 位操纵符

……

5.3 布尔操纵符

5.3.1 逻辑非

逻辑非操纵符由一个叹号(!)示意,可以运用于ECMAScript中的任何值。不管这个值是什么数据范例,这个操纵符都邑返回一个布尔值。
同时运用两个逻辑非操纵符,实际上就会模仿Boolean()转型函数的行动

5.3.2 逻辑与

逻辑与操纵符由两个和号(&&)示意,有两个操纵数
逻辑与操纵可以运用于任何范例的操纵数,而不仅仅是布尔值。在有一个操纵数不是布尔值的状况下,逻辑与操纵就不肯定返回布尔值:

  • 假如第一个操纵数是对象,则返回第二个操纵数

  • 假如第二个操纵数是对象,则只需在第一个操纵数的求值效果为true的状况下才会返回该对象

  • 假如两个操纵数都是对象,则返回第二个操纵数

  • 假如第一个操纵数是null,则返回null

  • 假如第一个操纵数是NaN,则返回NaN

  • 假如第一个操纵数是undefined,则返回undefined

逻辑与操纵属于短路操纵,假如第一个操纵数可以处理效果,那末久不会再对第二个操纵数求值

var found = true;
var result = (found && someUndefinedVariable);    //这里会发作毛病
console.log(result);    //这一行不会实行

上面代码中,当实行逻辑与操纵符时会发作毛病,因为变量someUndefinedVariable没有声明

var found = false;
var result = (found && someUndefinedVariable);    //不会发作毛病
console.log(result);    //会实行("false")

5.3.3 逻辑或

逻辑或操纵符由两个竖线标记(||)示意,有两个操纵数
与逻辑与类似,假如有一个操纵数不是布尔值,逻辑或也不肯定返回布尔值:

  • 假如第一个操纵数是对象,则返回第一个操纵数

  • 假如第一个操纵数的求值效果为false,则返回第二个操纵数

  • 假如两个操纵数都是对象,则返回第一个操纵数

  • 假如两个操纵数都是对象,则返回第一个操纵数

  • 假如两个操纵数都是null,则返回null

  • 假如两个操纵数都是undefined,则返回undefined

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

5.6 关联操纵符

小于(<)、大于(>)、小于即是(<=)、大于即是(>=)
当关联操纵符的操纵数运用了非数值时,会举行数据转换或完成某些新鲜的操纵:

  • 假如两个操纵数都是数值,则实行数值比较

  • 假如两个操纵数都是字符串,则比较两个字符串对应的字符编码值

  • 假如一个操纵数是数值,则将另一个操纵数转换为一个数值,然后实行数值比较

  • 假如一个操纵数是对象,则挪用这个对象的valueOf()要领,用获得的效果依据前面的划定规矩实行比较。假如对象没有valueOf()要领,则挪用toString()要领,并用获得的效果依据前面的划定规矩实行比较

  • 假如一个操纵数是布尔值,则先将其转换为数值,然后再实行比较

任何操纵数与NaN比较,都邑返回false

5.7 相称操纵符

5.7.1相称和不相称

假如两个操纵数数据范例差别,则会先转换数据范例(平常称为强迫转型)再比较

  • nullundefined是相称的

  • 要比较相称性之前,不能将nullundefined转换成其他任何值

  • 有一个操纵符为NaN时,相称操纵符返回falseNaN不即是NaN

  • 假如两个操纵数都是对象,则比较它们是不是是同一个对象

5.7.2 全等和不全等

除了在比较之前不转换操纵数以外,全等和不全等操纵符没有什么区别

5.8 前提操纵符

variable = boolean_expression ? true_value : false_value;

var max = (num1 > num2) ? num1 : num2;

5.9 赋值操纵符

即是号(=)

5.10 逗号操纵符

逗号(,)

6语句

6.1 if语句

if(1 > 25){
    console.log();
}else{
    console.log();
}

6.2 do-while语句

var i = 0;
do{
    i += 2;
}while(i < 10);
console.log(i);

6.3 while语句

var i = 0;
while(1 < 10){
    i += 2;
}

6.4 for语句

var count = 10;
for(var i = 0; i < count; i++){
    console.log(i);
}

因为ECMAScript中不存在块级作用域,因而在轮回内部定义的变量也可以在外部接见到

for语句中的初始化表达式、掌握表达式和轮回后表达式都是可选的。将这三个表达式悉数省略,就会建立一个无穷轮回

6.5 for-in语句

for-in语句是一种精准的迭代语句,可以用来罗列对象的属性

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

ECMAScript对象的属性没有递次。因而,经由过程for-in轮回输出的属性名的递次是不可展望的

6.6 label语句

运用label语句可以在代码中增添标签,以便未来运用

start: for(var i = 0; i < count; i++){
    console.log(i);
}

这个例子中定义的start标签可以在未来有breakcontinue语句援用。加标签的语句平常都要与for语句等轮回语句合营运用

6.7 break和continue语句

breakcontinue语句用于在轮回中精确地掌握代码的实行

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++;
    }
}
console.log(num);    //55
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++;
    }
}
console.log(num);    //95
                    //假如两个轮回都天然完毕,num的值应该是100

6.8 with语句(舍弃!)

严厉情势下不许可运用with语句,不然将视为语法毛病。
因为大批运用with语句会致使机能下落,同时也会给调试代码形成难题,因而不发起运用with语句

6.9 switch语句

var num = 25;
switch (true){
    case num < 0:
        console.log("0");
        break;
    case num >= 0 && num <= 10:
        console.log("0");
        break;
    default:
        console.log("0");
}

switch语句在比较值时运用的是全等操纵符,因而不会发作范例转换

7 函数

函数中的return语句可以不带有任何返回值。在这类状况下,函数在住手实行后将返回undefined值。

引荐的做法是要么让函数一直都返回一个值,要么永久都不要返回值。不然,假如函数有时候返回值,有时候不返回值,会给调试代码带来不方便

7.1 明白参数

ECMAScript中的参数在内部是用一个数组来示意的。函数接收到的一直都是这个数组,而不关心数组中包括哪些参数(假如有参数的话)。

在函数体内可以经由过程arguments对象来接见这个参数数组

ECMAScript函数有一个主要的特性:定名的参数只提供方便,但不是必需的。

定名参数可以与arguments对象一同运用,arguments的值永久与对应定名参数的值坚持同步。

没有通报值的定名参数将自动被给予undefined值。

严厉情势下不许可重写定名参数或许arguments的值,虽然可以实行,然则定名参数与arguments对应的值将不再同步

7.2 没有重载

ECMAScript函数不能像传统意义上那样完成重载。ECMAScript函数没有署名,因为其参数是由包括零或多个值的数组来示意的。而没有函数署名,真正的重载是不可以做到的。

假如定义了两个名字雷同的函数,则该名字只属于后定义的函数,先定义的函数将被掩盖

    原文作者:Cor
    原文地址: https://segmentfault.com/a/1190000009021774
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞