您的位置:首页 > Web前端 > JavaScript

JavaScript细节知识点复习笔记

2018-03-15 21:47 288 查看
1.JavaScript的官方名称是ECMA-262,是脚本语言。浏览器会在读取代码时,逐行地执行脚本代码。而对于传统编程来说,会在执行前对所有代码进行编译。2.JavaScript 语句和 JavaScript 变量都对大小写敏感。关键词 function 必须是小写的,并且必须以与函数名称相同的大小写来调用函数。
3.如果把值赋给尚未声明的变量,该变量将被自动作为全局变量声明,例如:carname="Volvo";将声明一个全局变量carname,即使它在函数内执行。
4.在运算符中,如果把数字与字符串相加,结果将成为字符串。如x=5+"5";document.write(x);结果为55。
5.break 和 continue 语句的不同之处:break 语句可以立即退出循环,阻止再次反复执行任何代码。而 continue 语句只是退出当前循环,根据控制表达式还允许继续进行下一次循环。


6.throw 语句用来创建自定义错误消息。如果把throw与try和catch一起使用,那么能够控制程序并生成自定义的错误消息。例如:


7.window.location.href=“url”用于改变url地址。location.href是一个属性,而window.location.assign("url")  加载新的文档,效果与location.href相当,不过前者是属性,后者是方法,或许在使用内存等方面有细微差别。Window.location.replace(“url”)将地址替换成新url,该方法通过指定URL替换当前缓存在历史里(客户端)的项目。与以上两者的区别在于:在replace之后,浏览历史就被清空了(href与assign方法会产生历史记录),因此若使用replace页面跳转后是不能后退的。8.JavaScript为弱类型语言,无需明确的类型声明。用同一个 var 语句定义的变量不必具有相同的类型,如:var test = "hi", age = 25;变量可以存放不同类型的值,例如,可以把变量初始化为字符串类型的值,之后把它设置为数字值,如:
vartest = "hi";alert(test);test= 55;alert(test);但事实上,在使用变量之前甚至不必声明,如:varsTest = "hello ";sTest2= sTest + "world";alert(sTest2);9.尽管这undefined与null相等,但它们的含义不同。undefined 是声明了变量但未对其初始化时赋予该变量的值,null 则用于表示尚未存在的对象。如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是 null。10.字符串字面量是由双引号(")或单引号(')声明的。而 Java 则是用双引号声明字符串,用单引号声明字符。但是由于 ECMAScript没有字符类型,所以可使用这两种表示法中的任何一种。11.在JavaScript的数字类型的toString()方法中,在默认模式中,无论最初采用什么表示法声明数字,Number 类型的 toString() 方法返回的都是数字的十进制表示。因此,以八进制或十六进制字面量形式声明的数字输出的都是十进制形式的。如:variNum1 = 10;variNum2 = 10.0;alert(iNum1.toString()); //输出 "10"alert(iNum2.toString()); //输出 "10"12.在美国,英语是ECMAScript 实现的标准语言,localeCompare() 是区分大小写的,大写字母在字母顺序上排在小写字母之后。不过,在其他区域,情况可能并非如此。13.slice() 和 substring()这两种方法返回的都是要处理的字符串的子串,都接受一个或两个参数。第一个参数是要获取的子串的起始位置,第二个参数(如果使用的话)是获取子串终止前一个的位置(也就是说,终止位置处的字符不包括在返回的值内)。如果省略第二个参数,终止位就默认为字符串的长度。例如:varoStringObject = new String("hello world");
alert(oStringObject.slice("3"));            //输出 "lo world"
alert(oStringObject.substring("3"));             //输出 "lo world"
alert(oStringObject.slice("3","7"));             //输出 "lo w"
alert(oStringObject.substring("3","7"));      //输出 "lo w"
在这个例子中,slice() 和 substring() 的用法相同,返回值也一样。当有两个参数 "3" 和 "7" 时,两个方法返回的值都是 "lo w"("world" 中的字母 "o" 位于位置 7 上,所以它不包括在结果中)。但是事实上,这两个方法并不完全相同,不过只在参数为负数时,它们处理参数的方式才稍有不同。对于负数参数,slice()方法会用字符串的长度加上参数,substring() 方法则将其作为 0 处理(也就是说将忽略它)。例如:varoStringObject = new String("hello world");
alert(oS
4000
tringObject.slice("-3"));           //输出 "rld"
alert(oStringObject.substring("-3"));    //输出 "hello world"
alert(oStringObject.slice("3,-4"));       //输出 "lo w"
alert(oStringObject.substring("3,-4")); //输出 "hel"
当只有参数 -3 时,slice() 返回 "rld",substring() 则返回 "hello world"。这是因为对于字符串 "hello world",slice("-3") 将被转换成 slice("8"),而 substring("-3") 将被转换成 substring("0")。同样,使用参数 3 和 -4 时,差别也很明显。slice() 将被转换成 slice(3, 7),与前面的例子相同,返回 "lo w"。而 substring() 方法则将两个参数解释为 substring(3, 0),实际上即 substring(0, 3),因为 substring() 总把较小的数字作为起始位,较大的数字作为终止位。因此,substring("3, -4") 返回的是 "hel"。14.没有返回值的函数真正返回的都是 undefined。15.尽管一元加法对数字无作用,但对字符串却有有趣的效果,会把字符串转换成数字。
varsNum = "20";
alert(typeofsNum); //输出 "string"
variNum = +sNum;
alert(typeofiNum); //输出 "number"
这段代码把字符串 "20" 转换成真正的数字。当一元加法运算符对字符串进行操作时,它计算字符串的方式与 parseInt() 相似,主要的不同是只有对以 "0x" 开头的字符串(表示十六进制数字),一元运算符才能把它转换成十进制的值。因此,用一元加法转换 "010",得到的总是 10,而"0xB" 将被转换成 11。16.左移运算<<会保留数字的符号位。例如,如果把 -2 左移 5 位,得到的是 -64,而不是 64。符号仍然存储在第 32 位中,不过这在 ECMAScript 后台进行,开发者不能直接访问第 32 个数位。即使输出二进制字符串形式的负数,显示的也是负号形式(例如,-2 将显示 -10)。17.与逻辑 OR 和逻辑 AND 运算符不同的是,逻辑 NOT 运算符返回的一定是 Boolean 值。逻辑 NOT 运算符的行为如下:
· 如果运算数是对象,返回 false
· 如果运算数是数字 0,返回 true
· 如果运算数是 0 以外的任何数字,返回 false
· 如果运算数是 null,返回 true
· 如果运算数是 NaN,返回 true
· 如果运算数是 undefined,发生错误
判断 ECMAScript 变量的 Boolean 值时,可以使用逻辑 NOT 运算符。这样做需要在一行代码中使用两个 NOT 运算符。无论运算数是什么类型,第一个 NOT 运算符返回 Boolean 值。第二个 NOT 将对该 Boolean 值求负,从而给出变量真正的 Boolean 值。例如:varbFalse = false;
varsRed = "red";
variZero = 0;
variThreeFourFive = 345;
varoObject = new Object;
 
document.write("bFalse的逻辑值是 " +(!!bFalse));
document.write("sRed的逻辑值是 " +(!!sRed));
document.write("iZero的逻辑值是 " +(!!iZero));
document.write("iThreeFourFive的逻辑值是 " +(!!iThreeFourFive));
document.write("oObject的逻辑值是 " +(!!oObject));
结果为:bFalse的逻辑值是 false
sRed的逻辑值是 true
iZero的逻辑值是 false
iThreeFourFive的逻辑值是 true
oObject的逻辑值是 true
18.逻辑 AND 运算的运算数可以是任何类型的,不止是 Boolean 值。如果某个运算数不是原始的 Boolean 型值,逻辑 AND 运算并不一定返回 Boolean 值:· 如果一个运算数是对象,另一个是 Boolean 值,返回该对象。
· 如果两个运算数都是对象,返回第二个对象。
· 如果某个运算数是 null,返回 null。
· 如果某个运算数是 NaN,返回 NaN。
· 如果某个运算数是 undefined,发生错误。
19.与逻辑 AND 运算符相似,如果某个运算数不是 Boolean 值,逻辑 OR 运算并不一定返回 Boolean 值:· 如果一个运算数是对象,并且该对象左边的运算数值均为 false,则返回该对象。
· 如果两个运算数都是对象,返回第一个对象。
· 如果最后一个运算数是 null,并且其他运算数值均为 false,则返回 null。
· 如果最后一个运算数是 NaN,并且其他运算数值均为 false,则返回 NaN。
· 如果某个运算数是 undefined,发生错误。
与逻辑 AND 运算符一样,逻辑 OR 运算也是简便运算。对于逻辑 OR 运算符来说,如果第一个运算数值为 true,就不再计算第二个运算数。
20.0除一个任何非无穷大的数字,结果为 NaN。对于特殊值,取模运算符%也有特殊的行为:
如果被除数是 Infinity,或除数是 0,结果为 NaN。
Infinity 被 Infinity 除,结果为 NaN。
如果除数是无穷大的数,结果为被除数。
如果被除数为 0,结果为 0。

21.Infinity 加 -Infinity,结果为 NaN。在处理特殊值时,减法运算符-也有一些特殊行为:
某个运算数是 NaN,那么结果为 NaN。
Infinity 减 Infinity,结果为 NaN。
-Infinity 减 -Infinity,结果为 NaN。
Infinity 减 -Infinity,结果为 Infinity。
-Infinity 减 Infinity,结果为 -Infinity。
+0 减 +0,结果为 +0。
-0 减 -0,结果为 -0。
+0 减 -0,结果为 +0。
某个运算符不是数字,那么结果为 NaN。

22.等号与非等号运算(==和!=)执行类型转换的规则如下:
如果一个运算数是 Boolean 值,在检查相等性之前,把它转换成数字值。false 转换成 0,true 为 1。
如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字。
如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串。
如果一个运算数是对象,另一个是数字,在检查相等性之前,要尝试把对象转换成数字。

在比较时,该运算符还遵守下列规则:
值 null 和 undefined 相等。
在检查相等性时,不能把 null 和 undefined 转换成其他值。
如果某个运算数是 NaN,等号将返回 false,非等号将返回 true。
如果两个运算数都是对象,那么比较的是它们的引用值。如果两个运算数指向同一对象,那么等号返回 true,否则两个运算数不等。

重要:即使两个数都是 NaN,等号仍然返回 false,因为根据规则,NaN 不等于 NaN。
23.与在 Java 中一样,函数在执行过 return 语句后立即停止代码。因此,return 语句后的代码都不会被执行。例如,在下面的代码中,alert 窗口就不会显示出来:
functionsum(iNum1, iNum2) {returniNum1 + iNum2;alert(iNum1+ iNum2);}如果函数无明确的返回值,或调用了没有参数的 return 语句,那么它真正返回的值是 undefined。24.与其他程序设计语言不同,ECMAScript 不会验证传递给函数的参数个数是否等于函数定义的参数个数。开发者定义的函数都可以接受任意个数的参数(根据 Netscape 的文档,最多可接受 255 个),而不会引发任何错误。任何遗漏的参数都会以 undefined 传递给函数,多余的函数将忽略。25.把对象的所有引用都设置为 null,可以强制性地废除对象。例如:
varoObject = new Object;
//do something with the object here
oObject= null;
当变量 oObject 设置为 null 后,对第一个创建的对象的引用就不存在了。这意味着下次运行无用存储单元收集程序(garbage collection routine)时,该对象将被销毁。每用完一个对象后,就将其废除,来释放内存,这是个好习惯。这样还确保不再使用已经不能访问的对象,从而防止程序设计错误的出现。此外,旧的浏览器(如 IE/MAC)没有全面的无用存储单元收集程序,所以在卸载页面时,对象可能不能被正确销毁。废除对象和它的所有特性是确保内存使用正确的最好方法。
注意:废除对象的所有引用时要当心。如果一个对象有两个或更多引用,则要正确废除该对象,必须将其所有引用都设置为 null。26.所谓绑定(binding),即把对象的接口与对象实例结合在一起的方法。
早绑定(early binding)是指在实例化对象之前定义它的属性和方法,这样编译器或解释程序就能够提前转换机器代码。在Java这样的语言中,有了早绑定,就可以在开发环境中使用IntelliSense(即给开发者提供对象中属性和方法列表的功能)。ECMAScript不是强类型语言,所以不支持早绑定。
另一方面,晚绑定(late binding)指的是编译器或解释程序在运行前,不知道对象的类型。使用晚绑定,无需检查对象的类型,只需检查对象是否支持属性和方法即可。ECMAScript 中的所有变量都采用晚绑定方法。这样就允许执行大量的对象操作,而无任何报错。27 .ECMAScript 中只存在公用作用域。ECMAScript 中的所有对象的所有属性和方法都是公用的。因此,定义自己的类和对象时,必须格外小心。由于缺少私有作用域,开发者规定了一个惯例,说明哪些属性和方法应该被看做私有的。这种惯例规定在属性前后加下划线:
obj._color_= "blue";
这段代码中,属性color被看作是私有的。注意,下划线并不改变属性是公用属性的事实,它只是告诉其他开发者,应该把该属性看作私有的。有些开发者还喜欢用单下划线说明私有成员,例如:obj._color。28.目前使用最广泛的是混合的构造函数/原型方式。此外,动态原始方法也很流行,在功能上与构造函数/原型方式等价。可以采用这两种方式中的任何一种。不过不要单独使用经典的构造函数或原型方式,因为这样会给代码引入问题。详情:http://www.w3school.com.cn/js/pro_js_object_defining.asp29.ECMAScript 中最常见的一个问题是字符串连接的性能。与其他语言类似,ECMAScript的字符串是不可变的,即它们的值不能改变。例如:
var str = "hello ";str += "world";实际上,这段代码在幕后执行的步骤如下:(1)创建存储 "hello " 的字符串。(2)创建存储 "world" 的字符串。(3)创建存储连接结果的字符串。(4)把 str 的当前内容复制到结果中。(5)把 "world" 复制到结果中。(6)更新 str,使它指向结果。每次完成字符串连接都会执行步骤 2 到 6,使得这种操作非常消耗资源。如果重复这一过程几百次,甚至几千次,就会造成性能问题。解决方法是用 Array 对象存储字符串,然后用 join() 方法(参数是空字符串)创建最后的字符串。例如:var arr = new Array();arr[0] = "hello ";arr[1] = "wor
ae87
ld";var str = arr.join("");这样,无论数组中引入多少字符串都不成问题,因为只在调用 join() 方法时才会发生连接操作。此时,执行的步骤如下:(1)创建存储结果的字符串。(2)把每个字符串复制到结果中的合适位置。虽然这种解决方案很好,但还有更好的方法。问题是,这段代码不能确切反映出它的意图。要使它更容易理解,可以用 StringBuffer 类打包该功能:function StringBuffer () { this._strings_ = new Array();} StringBuffer.prototype.append = function(str){ this._strings_.push(str);}; StringBuffer.prototype.toString = function(){ return this._strings_.join("");};这段代码首先要注意的是 strings 属性,本意是私有属性。它只有两个方法,即 append() 和 toString() 方法。append() 方法有一个参数,它把该参数附加到字符串数组中,toString() 方法调用数组的 join 方法,返回真正连接成的字符串。要用 StringBuffer 对象连接一组字符串,可以用下面的代码:var buffer = new StringBuffer ();buffer.append("hello ");buffer.append("world");var result = buffer.toString();30 .prototype 属性用于向对象添加属性和方法。例如:function employee(name,job,born){this.name=name;this.job=job;this.born=born;} var bill=new employee("BillGates","Engineer",1985); employee.prototype.salary=null;bill.salary=20000; document.write(bill.salary);输出:2000031.原型链的弊端是不支持多重继承。原型链会用另一类型的对象重写类的prototype 属性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JavaScript