JavaScript语言精粹知识点总结
Posted 莫尤公子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript语言精粹知识点总结相关的知识,希望对你有一定的参考价值。
1.NaN是一个数值,它表示一个不能产生正常结果的运算结果。NaN不等于任何值,包括它自己。
2.Infinity表示所有大于1.79769313486231570e+308的值,所以Infinity其实是没有具体值的,它是一个集合。
3.javascript中的所有字符都是16位
4.下面列出的值被当做假:
- false
- null
- undefined
- 数字0
- 数值NaN
- 空字符串""
5.其他所有的值都被当做真,包括true,字符"false"
6.for循环有形式:
第一种是常见的形式:for(初始化从句;条件从句;增量从句)
第二种:for in语句,会枚举一个对象所有属性名称(或键名)。在每次循环中,object的下一个属性名字符串被赋值给variable。
通常用来检测object.hasOwnProperty(variable)来确定这个属性名是该对象的成员,还是来自原型链。
用法如下:
1 for(myvar in obj){ 2 if(obj.hasOwnProperty(myvar)){//如果对象独有的属性,将返回true。该方法不会返回原型链 3 …… 4 } 5 }
7.运算符优先级:从上到下:
- . [] ():提取属性与调用函数
- delete new typeof + - !:一元运算符
- * / %:乘法、除法、取余(实际上的求余运算,尤其显示在两个运算数中存在负数时,求模运算和求余运算的值则不相同)
- + -:加法/连接、减法
- >= <= > <:不等式运算符
- === !==:不等式运算符
- &&:逻辑与
- ||:逻辑或
- ?:三元
8.数字、字符串与布尔值“貌似”对象,但其实是不可变的。数组、函数、正则表达式是对象。
9.字面量:
var empty_object={};
或
var stooge={
"first-name":"Jerome",
"last-name":"Howard"
};
或
var flight = {
airline: "Oceanic",
number: 815,
departure: {
IATA: "SYD",
time: "2004-09-22 14:55",
city: "Sydney"
},
arrival: {
IATA: "LAX",
time: "2004-09-23 10:42",
city: "Los Angeles"
}
};
属性名可以是包括空字符串在内的任何字符串。如果属性名是一个合法的javascript标识符且不是保留字,则不强制要求用引号括住属性名。
尝试检索一个并不存在的成员属性的值会返回undefined,尝试从undefined成员属性中取值会导致TypeError异常,这是可以通过&&运算符避免错误。
例如:
flight.equipment && flight.equipment.model//undefined,第一个是不存在属性,第二个是不存在属性的值
10.原型与继承:
首先定义一个变量:
1 var stooge = { 2 "first-name": "Jerome", 3 "last-name": "Howard" 4 };
当需要创建一个新对象时,可以选择某个对象作为他的原型。这里给Object添加一个create方法,创建一个对象使用stooge对象作为其原型。
1 if(typeof Object.beget!==‘function‘){ 2 Object.create=function(o){ 3 var f=function(){}; 4 f.prototype=o; 5 return new f(); 6 }; 7 } 8 var another_stooge=Object.create(stooge);
当我们对某个对象作出改变的时候并不涉及该对象的原型:
1 another_stooge[‘first-name‘] = ‘Harry‘; 2 another_stooge[‘middle-name‘] = ‘Moses‘; 3 another_stooge.nickname = ‘Moe‘;
原型链接只有在检索值的时候才被用到。如果我们尝试去获取对象的某个属性值,但该对象没有此属性名,那么js会尝试从原型中获取属性值。如果原型对象中也没有属性值,那么就会在该原型对象的原型中寻找,依次类推,直到到达Object.propotype。如果想要查找的属性不存在与原型链中,那么结果就是undefined值。这个过程称为委托。
for in循环会遍历一个对象中所有属性名。该枚举过程会列出所有的属性--包括函数和原型中的属性。如果想要对象中属性的值,就可以使用hasOwnPrototype以及typeof,例如:
1 var name; 2 for(name in another_stooge){ 3 if(typeof another_stooge[name]!=="function"){ 4 document.writein(name+": "+another_stooge[name]); 5 } 6 } 7
以上方法属性名出现的顺序是不确定的。
删除:delete运算符可以用来删除对象的属性。如果对象包含该属性,那么该属性就会被移除,不会触及原型链中的任何对象。而删除对象中的属性可能会让来自原型链中的属性显现出来,例如:
1 another_stooge.nickname // ‘Moe‘ 2 3 // Remove nickname from another_stooge, revealing 4 // the nickname of the prototype. 5 6 delete another_stooge.nickname; 7 8 another_stooge.nickname // ‘Curly‘
11.减少全局污染:
第一种方法:建立一个唯一的全局变量,其余的全局变量都是它的属性。
1 var MYAPP = {}; 2 3 MYAPP.stooge = { 4 "first-name": "Joe", 5 "last-name": "Howard" 6 }; 7 8 MYAPP.flight = { 9 airline: "Oceanic", 10 number: 815, 11 departure: { 12 IATA: "SYD", 13 time: "2004-09-22 14:55", 14 city: "Sydney" 15 }, 16 arrival: { 17 IATA: "LAX", 18 time: "2004-09-23 10:42", 19 city: "Los Angeles" 20 } 21 };
第二种方法:闭包
12.当函数的实际参数个数超出形式参数个数时,超出的参数会被忽略。如果实际参数过少,缺失的值会被替换为undefined。
13.this在面向对象编程中非常重要,他的值取决于调用的模式。javascript中存在4中调用模式:
第一种:方法调用模式:当一个函数被保存为对象的一个属性时,我们称之为一个方法。当一个方法被调用时,this被绑定到该对象,如果调用表达式包含一个提取属性的动作(包含一个.表达式或者下标表达式),那么他就是被当做一个方法来调用。
例如:
1 var myObject = { 2 value: 0; 3 increment: function (inc) { 4 this.value += typeof inc === ‘number‘ ? inc : 1; 5 } 6 }; 7 8 myObject.increment( ); 9 document.writeln(myObject.value); // 1 10 11 myObject.increment(2); 12 document.writeln(myObject.value); // 3
第二种,函数调用模式:当一个对象并非一个对象的属性的时候,那么它就是被当做一个函数来调用。以此模式调用函数时,this被绑定到全局对象上。这样就无法实现该方法对对象的访问权。有一个解决方法:
如果该方法定义一个变量并给他复制为this,那么内部函数就可以通过新赋值的变量访问到this。
我们把这个新赋值的变量称为that
例如:
1 <script type="text/javascript"> 2 var value=4; 3 var myObject = { 4 value: 0, 5 }; 6 7 8 myObject.double = function ( ) { 9 // var that = this; // Workaround. 10 console.log(this.value);//0 11 var helper = function ( ) { 12 console.log(this.value);//4 13 }; 14 15 helper( ); // 以函数的形式调用helper 16 }; 17 18 //以方法的形式调用double 19 20 myObject.double( ); 21 document.writeln(myObject.value); // 0 22 </script>
以上代码中,首先以方法的形式调用double,这样如果double中含有this,该this指向myObject,所以第10行输出的是myObject内部的value,值为0。在double方法内部,存在以函数形式调用的helper函数,那么helper函数中的this指向的全局变量,所以会输出全局变量的value值,为4。
可见这样的形式中,helper是无法通过this来访问myObject对象内部的其他属性的。如果将var that=this;添加进去,将double函数内部的this赋值给that变量,这样就然后把helper函数内部的代码改成console.log(that.value);这样就可以指向myObject内部的value了,输出为0.代码如下:
1 <script type="text/javascript"> 2 var value=4; 3 var myObject = { 4 value: 0, 5 }; 6 7 8 myObject.double = function ( ) { 9 var that = this; // Workaround. 10 console.log(this.value);//0 11 var helper = function ( ) { 12 console.log(that.value);//0 13 }; 14 15 helper( ); // Invoke helper as a function. 16 }; 17 18 // Invoke double as a method. 19 20 myObject.double( ); 21 document.writeln(myObject.value); // 0 22 </script>
第三种模式:构造器调用模式,在函数面前使用new来调用,那么背地里会创建一个连接到该函数prototype成员的新对象,this会被绑定到那个新对象上。例如:
1 var Quo=function(string){ 2 this.value="string"; 3 }; 4 5 6 Quo.prototype.get_status=function(){ 7 return this.value; 8 }; 9 10 var myQuo=new Quo("confused"); 11 console.log(myQuo.get_status());//confused
第四种调用模式:apply调用:
apply方法让我们构建一个参数数组传递给调用函数。它润徐我们选择this的值。apply接收两个参数,第一个就是要绑定给this的值,通过设定这个参数可以改变函数的运行时的上下文,就是this的值,如果设置为null或者没有指定该参数,则this指定它本身。
以上是关于JavaScript语言精粹知识点总结的主要内容,如果未能解决你的问题,请参考以下文章