本文记录了我在进修前端上的笔记,轻易今后的温习和稳固。
3.1.4 严厉情势
严厉情势是JavaScript
定义了一种差别的剖析和实行模子。在严厉情势下ECMAScript3中的一些不肯定行动将获得处置惩罚,而且对某些不安全的操纵也会抛出毛病。要在悉数剧本中启用严厉情势,可以在顶部增加以下代码:
"use strict";
这段代码看起来像字符串,而且也没赋值给使命变量,但实在它是一个编译指导(pragma),用于通知支撑的JavaScript引擎切换到严厉情势。这是为不损坏ECMAScript3而特地选定的语法。
在函数内部的上方包含这条编译提醒,也可以指定函数在严厉情势下实行:
function doSomething() {
"use strict";
//函数体
}
3.2 关键字和保留字
ECMAScript5关键字:
break、case、catch、continue、default、delete、do、else、finally、for、function、if、in、instanceof、new、return、switch、this、throw、try、typeof、var、void、while、with
ECMAScript5非严厉情势保留字:
class、enum、extends、super、const、export、import
在严厉情势下,第5版还对一下保留字施加了限定:
implements、package、public、interface、private、static、let、protected、yield
3.3 变量
部分变量被函数挪用后,当前函数退出后就会被烧毁,比方:
function test(){
var message = "hi"; //部分变量
}
test();
alert(message); //毛病
全局变量就不会:
function test(){
message = "hi"; //全局变量
}
test();
alert(message); // "hi"
如许,只需挪用过一次test()函数,这个变量就有了定义,就可以在函数外部任何地方被接见到。但全局变量的做法不引荐。因为在部分作用域中定义的全局变量很难保护。严厉情势
下不能定义名为eval
或arguments
的变量,不然会致使语法毛病。
3.4 数据范例
ECMAScript中有五种简朴数据范例:
Undefined
Null
Boolean
Number
String
另有一种庞杂数据范例——Object
注重:ECMAScript6还新增了一种数据范例标记对象 –
(Symbol)
– 标记对象简介
3.4.1 typeof操纵符
用于检测给定变量的数据范例——typeof
就是担任供应这方面信息的操纵符。对一个值运用typeof
操纵符可以返回以下某个字符串:
“undefind”——假如这个值未定义;
“boolean”——假如这个值是布尔值;
“string”——假如这个值是字符串;
“number”——假如这个值是数值;
“object” ——假如这个值是对象或null;
“function”——假如这个值是函数
下面是几个运用typeof操纵符的例子:
var message = "some string";
alert(typeof message); //"string"
alert(typeof (message)); //"string"
alert(typeof 95); //"number"
注重:挪用typeof null 会返回 “object”,因为特别值null被认为是一个空的对象援用。
3.4.2 Undefind范例
Undefined
范例只要一个值即undefind
。在运用var声明变量后但未对其加以初始化时,这个变量的值就是undefined
,比方:
var message;
alert(message == undefined); //true
var message1 == undefined
alert(message1 == undefined); //true
typeof操纵符对未初始化和未声明的变量都返回undefined
3.4.3 Null范例
Null
范例是第二个只要一个值的数据范例,这个特别的值是null
。从逻辑角度看,null
值示意一个空对象指针,而这也恰是运用typeof
操纵符检测null值会返回"object"
的缘由
var car = null;
console.log(typeof car); //"object"
假如定义的变量是为了今后要保留对象,那末最好该变量初始化为null值。
if(car != null){
//对car对象实行某些操纵
}
undefined值是派生自null的值得所以:
console.log(null == undefined); //true
3.4.4 Boolean范例
该范例只要两个字面值: true
和false
。
虽然Boolean
范例只要两个字面值,然则可以挪用Boolean()函数把值转换为对应的Boolean值:
var message = "Hello World!";
var messageAsBoolean = Boolean(message);
转换规程:
数据范例 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | “”(空字符串) |
Number | 任何非零数字值(包含无穷大) | 0和NaN |
Object | 任何对象 | null |
Undefined | n/a | undefined |
3.4.5 Number范例
//十进制
var intNum = 55; //整数
//八进制
var octalNum1 = 070;//八进制56
var octalNum1 = 079;//无效的八进制数值——剖析为79
var octalNum1 = 08;//无效的八进制数组——剖析为8
//十六进制
var hexNum1 = 0xA; //十六进制的10
var hexNum2 = 0x1f; //十六进制的31
八进制:第一位必需是零(0),然后是八进制数字序列(0~7).假如字面值中的数值超出了局限,那末前导零将被疏忽,背面的数值当做十进制剖析。
十六进制:前两位必需是0x,后跟任何十六进制数字(0~9,A~F)。
注重:在算数盘算时,一切的八进制和十六进制示意的数值终究都将被转换成十进制。
1.浮点数值
浮点数值中必需包含个小数点
var floatNum1 = 1.1;
var floatNum2 = 0.1;
var floatNum3 = .1 //有用但不引荐
因为保留浮点数值须要的空间是整数数值的两倍,因而ECMAScript会不失时机的将浮点数值转换成整数值。
var floatNum1 = 1.; //小数点背面没有数字——剖析为1
var floatNum2 = 10.0 //整数——剖析为10
关于极大或极小的数值,可以用e示意法。
var floatNum = 3.125e7; //31250000
浮点数值最高精度是17位小数,但在举行算数盘算时它的精度远远不如整数。比方0.1加0.2不是0.3 ,而是0.30000000000000004。这个小小的舍入偏差会致使没法测试特定的浮点数值。比方:
if(a + b == 0.3){ //不要如许做测试
alert("You got 0.3");
}
在这个例子中假如两个数是0.05和0.25或许是0.15和0.15都不会有题目。因而永久不要测试某个特定的浮点数值。
3.NaN
NaN,既非数值,是这个特别的数值,这个数值用于示意一个原本要返回的数值的操纵数未返回数值的状况(如许就不会抛出毛病了)。
NaN自身有两个非同寻常的特性。起首,任何触及NaN的操纵(比方NaN/10)都邑返回NaN。其次NaN与任何值都不想等,包含NaN自身。比方:
console.log(NaN == NaN); //false
针对NaN这两个特性,ECMAScript定义了isNaN()函数。这个函数接收一个参数,该参数可以是任何范例,2️⃣函数会帮我们肯定这个参数是不是”不是数值”。
isNaN()接收到第一值后,会尝试将这个值转换为数值。任何不能被转换的数值的值都邑致使这个函数返回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)); //flase(可以被转换成数值1)
isNaN
也适用于对象,在基于对象挪用isNaN()
函数时,会起首挪用valueOf()
要领,然后肯定该要领返回的值是不是可以转换为数值。假如不能,则基于这个返回值再挪用toString()要领
,再测试返回值
4.数值转换
有3分函数可以把非数值转换为数值:
Number()
——可用于任何数据范例parseInt()
——特地用于把字符串转换成整数数值parseFloat()
——特地用于把字符串转换成浮点数值
Number()函数的转换划定规矩以下
假如是
Boolean
值,true
和false
将分别被转换为1和0.假如是数字值,只是简朴的传入和返回
假如是
null
值,返回0假如是
undefined
,返回NaN
var num1 = Number("Hello world!"); //NaN
var num2 = Number(""); //0
var num3 = Number("000011"); //11
var num4 = Number("true"); //1
parseInt()
因为Number()
在转换字符串时比较庞杂而且不够合理,因而在处置惩罚整数的时刻更经常使用的事parseInt()
函数。
var num1 = parseInt("1234bule"); //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(十六进制数)
//在ES3和ES5存在不合。比方:
var num = parseInt("070"); //ES3认为是56(八进制) ES5认为是70(十进制)
//parseInt()函数有第二个参数:转换时运用的基数(进制)
var num = parseInt("0xAF", 16) //175(按十六进制剖析)
//运用了16进制参数,字符串可以不带0x
var num1 = parseInt("AF", 16) //175
var num1 = parseInt("AF") //NaN
不知道基数意味着让
parseInt()
决议怎样剖析字符串,因而为了防止毛病的剖析,发起不管在什么状况都明白指定基数。
parseFloat()
var num1 = parseFloat("123bule"); //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
3.4.6 String范例
1.字符字面量
String
数据范例包含一些特别的字符字面量,也叫转义序列,用于示意非打印字符,或许具有其他用途的字符。
2.字符串的特性
ECMAScript中的字符串是不可变的,也就是说,字符串一旦建立,它们的值就不能转变。要转变某个变量保留的字符串,起首要烧毁本来的字符串,然后在用另一个包含新值得字符串添补该变量比方:
var lang = "Java";
lang = lang + "Script"; //JavaScript
3.转换为字符串
toString()要领
var age = 11;
var ageAsString = age.toString; //字符串"11";
var found = true;
var foundAsString = found.toString; //字符串"true";
数值、布尔值、对象、字符串值都有toString()
要领。但null
和undefined
值没有这个要领。toString()
要领也跟上面的parseInt()
要领类似一样有一个参数:输出数值的基数;
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"
在不知道要转换的值是不是是null或undefined的状况下,还可以运用转型函数String(),这个函数可以将任何范例的值转换成字符串。String()函数遵照以下转换划定规矩:
假如值有toString()要领,则挪用该要领(没有参数)并返回响应的结果;
假如值是null,则返回”null”;
假如值是undefined,则返回”undefined”。
下面看几个例子:
var value1 = 10;
var value2 = true;
var value3 = null;
var value4;
console.log(String(value1)); //"10"
console.log(String(value2)); //"true"
console.log(String(value3)); //"null"
console.log(String(value4)); //"undefined"
3.4.7 Object范例
ECMAScript
中的对象实在就是一组数据和功用的鸠合。对象可以经由过程实行new
操纵符后跟要建立的对象范例的称号来建立。而建立Object
范例的实例并为其增加属性和要领,就可以建立自定义对象,以下所示:
var o = new Object();
假如不给组织函数通报参数,则可以省略背面的括号,然则这做法不引荐
var o = new Object; //有用,但不引荐省略圆括号
仅仅建立Object
的实例并没有什么用途,但关键是要明白一个重要的头脑:即在ECMAScript
中,Object
范例是一切它的实例的基础。换句话说,Object
范例所具有的任何属性和要领也一样存在于更详细的对象中。
Object的每一个实例都具有以下属性和要领:
constructor:保留着用于建立当前对象的函数。关于前面的例子罢了,
组织函数(constructor)
就是Object()
;返回一个指向建立了该对象原型的函数
援用。该属性的值就是谁人函数自身
。hasOwnProperty(propertyName):用于搜检给定的属性在当前对象实例中(而不是在实例的原型中)是不是存在,个中,作为参数的
属性名(propertyName)
必需以字符串的情势指定比方:o.hasOwnProperty("name");
isPrototypeOf(Object):用于搜检传入的对象是不是是当前对象的原型
propertyIsEnumerable(propertyName):用于搜检给定的属性是不是可以运用
for-in
语句来罗列。与hasOwnProperty()
要领一样,作为参数的属性名必需以字符串情势指定。toLocaleString():返回对象的字符串示意,该字符串与实行环境的区域对应。
toString():返回对象的字符串示意。
valueOf():返回对象的字符串、数值、或布尔值示意。平常与
toString()要领
的返回值雷同。
因为在ECMAScript
中Object
是一切对象的基础,因而一切对象都具有这些基础的属性和要领。
3.5 操纵符
ECMA-262
形貌了一组用于操纵数据值的操纵符,包含算数操纵符(如加号和减号)、位操纵符、关联操纵符和相称操纵符。ECMAScript
操纵符的异乎寻常的地方在于,它们可以运用于很多值,比方字符串、数字值、布尔值、以至对象。不过在应用于对象时,响应的操纵符平常都邑挪用对象的valueOf()
和(或)toString()
要领,以便获得可以操纵的值。
3.5.1 一元操纵符
1.递增和递减操纵符
实行前置递增和递减操纵时,变量的值都是在语句被求值之前转变的。
var age = 29;
var anotherAge = --age + 2;
console.log(age); //28
console.log(anotherAge); //30
因为前置递增和递减操纵与实行语句的优先级相称,因而悉数语句会从左至右被求值。
var num1 = 2;
var num2 = 20;
var num3 = --num1 + num2;//21
var num4 = num1 + num2; //21
num4响应的加法操纵运用了num减去1以后的值
后置递增和递减操纵符语法稳定,他们的区分就是前置递增和递减被操纵时变量的值都是在语句被求值之前转变的。而后置是求值以后才实行的。
把递增操纵符放在背面并不会转变语句的结果。
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2;//22
var num4 = num1 + num2; //21
递增和递减操纵符对任何值都运用,字符串,布尔值,浮点数值,对象
3.5.3 布尔操纵符
1.逻辑非
逻辑非操纵符由一个叹号( ! )示意,可以应用于ECMAScript
中的任何值。不管这个值是什么数据范例,这个操纵符都邑返回一个布尔值。逻辑非操纵符起首会将她的操纵数转换为一个布尔值,然后再对其求反。
逻辑非操纵符也可以用于将一个值转换为与其对应的布尔值。而同时运用两个逻辑非操纵符。实际上就会模仿Boolean()
转型函数的行动。个中,第一个逻辑非操纵会基于不管什么操纵数返回一个布尔值,而第二逻辑非操纵则对该布尔值求反,因而就获得了这个值正对应的布尔值。固然,终究的结果与对这个值运用Boolean()
雷同
2.逻辑与
逻辑与操纵符由两个和号(&&)示意,有两个操纵数,以下面的例子所示:
var result = true && false;
逻辑与操纵可以应用于任何范例的操纵数,而不仅仅是布尔值。在有一个操纵数不是布尔值的状况下,逻辑与操纵就不肯定返回布尔值;此时它遵照以下划定规矩:
假如第一个操纵数是对象,则会返回第二个操纵数;
假如第二个操纵数是对象,则只要在第一个操纵数的求值结果为
true
的状况下才会返回该对象;假如两个操纵数都是对象,则返回第二个操纵数;
假若有一个操纵数是
null
,则返回null
;假若有一个操纵数是
NaN
,则返回NaN
;假若有一个操纵数是
undefined
,则返回undefined
。
逻辑与操纵属于短路操纵,即假如第一个操纵数可以决议结果,那末就不会再对第二个操纵数求值。关于逻辑与而言,假如第一个操纵数是false
,则不管第二个操纵数是什么值,结果都不再多是true
了。例子:
var found = true;
var result = (found && someUndefinedVariable) //这里会发作毛病
alert(result) 这一行不会实行
上面例子发作毛病,因为变量someUndefinedVariable
没有声明。因为变量found
的值是true
,所以逻辑与操纵符会继承对变量someUndefinedVariable
求值。所以逻辑与操纵符会继承对变量someUndefinedVariable
求值。但someUndefinedVariable
没定义所以就致使毛病。将found的值设置为false,就不会发作毛病了。
3.逻辑或
逻辑或操纵符由两个和号(||)示意,有两个操纵数,以下面的例子所示:
var result = true || false;
与逻辑与操纵类似,假若有一个操纵数不是布尔值,逻辑或也不肯定返回布尔值;此时它遵照以下划定规矩:
假如第一个操纵数是对象,则会返回第一个操纵数;
假如第一个操纵数的求值结果为
false
,则返回第二个操纵数。假如两个操纵数都是对象,则返回第一个操纵数;
假若有两个操纵数是
null
,则返回null
;假若有两个操纵数是
NaN
,则返回NaN
;假若有两个操纵数是
undefined
,则返回undefined
。
与逻辑与操纵符类似,逻辑或操纵符也是短路操纵符。假如第一个操纵数的求值结果为true,就不会对第二个操纵值求值了,跟逻辑与是相反的。
3.5.6
小于(<)、大于(>)、小于即是(<=)和大于即是(>=)
与ECMAScript
中的其他操纵符一样,当关联操纵符的操纵数运用了非数值时,也要举行数据转换或完成某些新鲜的操纵。一下就是响应的划定规矩。
假如两个操纵符都是数值,则实行数值比较;
假如两个操纵数都是字符串,则比较两个字符串对应的字符编码值;
假如一个操纵数是数值,则另一个操纵数转换为一个数值,然后实行数值比较;
假如一个操纵数是对象,则挪用这个对象的
valueOf()
要领,并用获得的结果依据前面的划定规矩实行比较。假如对象没有valueOf()
要领,则挪用toString()
要领,并用获得的结果依据前面的划定规矩实行比较;假如一个操纵数是布尔值,则将他转换为数值,然后实行比较。
任何数与
NaN
比较都返回false
3.5.7 相称操纵符
1.相称和不相称
== 两个数相称 返回true
!= 两个数不相称 返回ture
要比较相称性之前,不能将null和undefined转换成其他任何值。
假如两个操纵数都是对象,则比较它们是不是是同一个对象,假如两个操纵数都指向同一个对象则true,不是则false;
注重:
null
和undefined
是相称的,NaN
不即是NaN
2.全等和不全等
全等和相称类似,二者最大区分是全等比较时不转换成数值。
全等和不全等的比较都是在操纵数未经转换的状况下比较。
注重:
null == undefined
返回true
,因为他们类似的值;但null === undefined
返回false
,因为他们是差别范例的值
3.5.8 前提操纵符
variable = boolean_expression ? true_value : false_value;
var max = (num1 > num2) ? num1 : num2;
3.6语句
3.6.1 if语句
if(condition) statement1 else statement2
if(i > 25) {
alert("Greater than 25.");
}else{
alert("Less than of equal to 25.");
}
3.6.2 do-while
var i = 0;
do {
i+=2;
}while(i < 10);
console.log(i);
3.6.3 while
var i = 0;
while(i < 10) {
i += 2;
}
3.6.4 for 语句
var count = 10;
for(var i = 10; i < count; i++){
console.log(i);
}
因为ECMAScript中不存在块级作用于,因而在轮回内部定义的变量也可以在外部接见到。
注重:
for语句
中的初始化表达式、掌握表达式和轮回后表达式都是可选的。将这三个表达式悉数省略,就会建立一个无穷轮回。
3.6.5 for-in语句
var data = [1,3,2,4,5];
for(var propName in data){
console.log(data[propName]); //1,3,2,4,5
console.log(propName); //0,1,2,3,4
}
for(var propName in window){
console.log(propName); //window对象属性名
}
注重:ECMAScript对象属性没有递次。因而经由过程for-in轮回输出的属性名的递次是不可展望的。
注重:发起在运用for-in之前,先检测确认该对象的值不是null或undefined。
3.6.6 label语句
运用label
语句可以再代码中增加标签,以便未来运用。
start: for (var i = 0; i < count; i++){
alert(i);
}
这个例子中定义的start标签可以在未来有break
或continue
语句援用。加标签的语句平常都要与for语句等轮回语句合营运用
3.6.7 break和continue语句
break:
var num = 0;
for(var i = 1; i < 10; i++){
if(i % 5 == 0){
break;
}
num++;
}
console.log(num); //4
continue:
var num = 0;
for(var i = 1; i < 10; i++){
if(i % 5 == 0){
continue;
}
num++;
}
console.log(num); //8
label可以和break和continue:
var num = 0;
outermost: //轮回外标签
for(var i = 1; i < 10; i++){
for(var j= 0; j < 10; j++){
if(i == 5 && j == 5){
//一般来讲break只能跳出一层轮回,但表面运用了label语句的标签outrmost可以直接跳出悉数轮回到outermost的位置;
break outermost;
}
num++;
}
}
console.log(num); //55
3.6.8 with语句
with
语句的作用是将代码的作用域设置到一个特定的对象中。with
语句的语法以下:
with (expression) statement;
定义with语句的目标重要是为了简化屡次编写同一个对象的事情,以下:
var qs = location.search.substring(1);
var hostName = location.hostname;
var url = localion.href;
上面几行代码都包含location
对象。假如运用with
语句以下:
width(location){
var qs = search.substring(1);
var hostName = hostname;
var url = href;
}
注重:严厉情势不许可运用
with
语句,会视为语法毛病。with
语句大批运用会致使机能下落,同时也会给调试代码形成难题,因而在开辟大型项目时,不发起运用with
语句
3.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
语句在比较值时运用的是全等操纵符。
3.7 函数
return语句也可以不带任何返回值。在这类状况下,函数在住手实行后将返回undefined值。
引荐做法:是要么让函数运用都返回一个值,要么永久都不要返回值。不然,假如函数有时刻返回值,有时刻不反回,会给调试代码带来不方便
3.7.1 明白参数
在函数体内可以使经由过程arguments
对象来接见这个参数的数组,从而猎取通报给函数的每一个参数。
经由过程接见argments
对象的length
属性可以获知有多少个参数通报给了函数
function doAdd(num1,num2){
arguments[1] = 10;
console.log(arguments[1]); //10
console.log(num2); //10
console.log(arguments[0] + num2); //20
console.log(arguments.length); //2 也可以接见arguments对象的length属性可以猎取有多少个参数通报给函数
}
doAdd(10,20);
每次实行这个doAdd()
函数都邑重写第二参数,将第二个参数的值修正成10
。因为arguments
对象中的值会自动反应到对应的定名函数,所以修正arguments[1]
,也就修正了num2
,结果它们的值都邑变成10
,不过,这并非说读取这个两个值会接见雷同的内存空间;它们的内存空间是自力的,但它们的值会同步。你也可以反过来修正num2
的值结果也是一样的。
function doAdd(num1,num2){
num2 = 10;
console.log(arguments[1]); //10
}
doAdd(10,20);
arguments对象可以与定名参数一同运用,如:
function doAdd(num1, num2){
if(arguments.length == 1){
console.log(num1 + 10)
}else{
console.log(argments[0] + num2);
}
}
arguments
对象只是与数组类似(它并非Array
的实例).arguments
的值永久与对应定名参数的值坚持同步没有通报值得定名参数将自动被给予
undefined
值。
严厉情势下不许可重写定名参数或许
arguments
的值,虽然可以实行,然则定名参数与arguments
对应的值将不再同步
3.7.2 没有重载
ECMAScript
函数没有署名,因为其参数是由包含零或多个值的数组来示意的。而没有函数署名,真正的重载是不可以做到的。
末了,若有毛病和迷惑请指出,多谢列位老大
假如在ECMAScript
中定义了两个名字雷同的函数,则该名字只属于后定义的函数。