这个是在公司没事一边看javascript语言精粹一边学习时记得笔记,时间有点长了,记性差,没事翻出来看一看
概述:
一、javascript的优缺点:
1、优势:弱类型、动态对象、富有表现力的对象字面量
2、缺点:基于全局变量的编程模型
3、具有争议的部分----原型继承
javascript有一个无类别的对象系统,这个系统中对象直接从其他对象继承属性。需要学习它的原型本质
二、定义
javascript是ECMAScript的一个适当的子集
函数
一、函数对象
javascript中 函数就是对象----对象拥有一个连接到原型对象的隐藏连接
-------对象字面量产生的对象连接到Object.prototype,函数对象连接到Function.prototype(该对象连接到Object.prototype)
二、函数字面量
函数对象可以通过函数字面量来创建
函数字面量包括4个部分:
function [函数名](参数){
一组语句
}
函数可以出现在任何允许表达式出现的地方, 也可以出现在函数中
三、调用函数
调用函数时将暂停当前函数,传递控制权和参数给新函数,除了声明时定义的参数外,每个函数接受2个附加参数:this和arguments。
this的值取决于调用模式,调用模式不同,this的初始化有差异。
调用模式共4种:
1、方法调用模式:
当函数被保存为对象的一个属性时,函数被称为方法, 当方法被调用时, this被绑定到该对象。
2、函数调用模式:
当一个函数不是对象的属性,被调用,称为函数调用,this被绑定到全局对象上。
这个设计错误的后果是,内部函数被调用时this应该绑定到外部函数的this上,但却绑定到了错误的全局对象上,不能访问外部对象的属性。
解决办法:
将外部对象赋给内部函数的一个属性,该属性即为外部对象
3、构造器调用模式:
如果在一个函数前面带上new来调用
四、参数
当函数被调用时 会同时传递一个arguments数组, arguments中包含所有传递过来的参数,包括函数参数中没有显示声明的参数。
通过arguments 可以编写一个无须指定参数个数的函数。
注: arguments不是一个真正的数组,拥有length属性,但没有数组的方法。
五、返回
return 执行时,函数立即返回不再执行下面的语句。
如果没有指定返回值,会返回一个undefined
javascript的简单类型包括:
数字、undefined、null、布尔型、字符串 其他所有值都是对象
数字、字符串、布尔型类似于对象-------他们拥有方法,但他们是不可变的
对象
一、对象字面量
属性名:包括空字符串在内的任何字符串, 若是合法的标识符且不是保留字,则不强制要求用引号括住 。
值:任意表达式、另一对象字面量,可嵌套。
二、查
检索对象中属性对应的值有2种方式:
1、对象名[属性名的字符串表达式] 如: stooge["first-name"]
2、前提:属性名是一个合法的javascript标识符而非保留字 则用: 对象名.属性名 如: stooge.firstname
尝试检索一个不存在的属性,则会返回一个undefined值
尝试检索一个undefined值,则会导致TypeError异常
||可以用来填充默认值
var sex = sex || 'man'
三、增、改
对象名[属性名的字符串表达式] /对象名.合法的属性名= 赋值语句
若对象中没有该属性 那么该属性会被扩充到该对象中
四、引用
对象通过引用来传递,不会进行拷贝
五、原型
每一个对象都连接到一个原型对象,可以从中继承属性。
所有通过“对象字面量”创建的对象都连接到Object.prototype这个javascript中的标准对象。
原型连接只有在检索的时候才会起作用,更新的时候是不起作用的
委托:尝试检索一个对象不存在的属性时,会去检索该对象的原型对象,没有的话继续检索原型的原型对象,直到检索到Object.prototype为止,如果依然没有 ,则返回undefined
六、反射
检查对象有什么属性有2种方法:
1、typeof flight.number //返回 'number'
typeof flight.sex //返回 undefined
这种方式需要注意原型, 若原型中存在该值 也会被返回,包括函数值
可以通过判断是否为函数来剔除:
typeof flight.run !== 'function'
因为反射的主要目标是得到数据建议用下面的方式
2、hasOwnProperty 可以判断对象是否拥有该独有的属性,不会去检查原型链
flight.hasOwnProperty('number') //返回true
flight.hasOwnProperty('sex') //返回false
七、枚举
for in语句可以遍历对象的所有属性名,包括函数和你不关心的属性名,可以通过hasOwnPropery来进行过滤
var name;
for(name in stooge){
if(stooge.hasOwnProperty(name)){
document.writeln(name+":"+stooge[name]);
}
}
注:该方式的属性名出现顺序不确定
如果要确保属性以特定的顺序出现,方法是不用for in语句 ,而是自己创建一个包含属性正确顺序的数组:
var i;
var properties=['name','sex','age'];
for(i=0;i<properties.length;i++){
document.writeln(properties[i]+":"+people[properties[i]]);
}
八、删除
delete 对象名[属性名的字符串表达式] /对象名.合法的属性名
删除对象中确定包含的属性,不会触及原型中的属性
全局变量
一、全局变量创建有三个方式:
第一种: 脱离函数安排一个var语句 如: var foo = value;
第二种: 直接添加一个属性到全局对象上 ,web浏览器里 全局对象是window: window.foo = value;
第三种: 直接使用未声明的变量 : foo=value;
二、减少全局变量污染:
javascript最糟糕之处在于对全局变量的依赖
原因:
全局变量可以被程序的任一部分在任意时间,使得程序的行为极大的复杂化,降低程序可靠性。
如果全局变量和子程序某个变量名称恰好相同,会引起冲突甚至导致程序无法运行,而且还很难调试。
解决方法:
1、创建唯一一个全局变量,让他变为你应用的容器,把多个容器整理在一个名称空间下,就能显著降低与其他应用程序、组件或类库之间产生相互影响的可能性
2、闭包方式:
语法
1、注释:
/*...*/ 块注释
//... 行注释
注:块注释可能出现在正则表达式中,可能会导致语法错误,尽量用//注释
2、标识符:
(字母/$/_)开头 + 字母/数字/下划线(0~n个)
3、数字:
只有一个单一的数字类型,内部表示为64位浮点数
指数:100 = 1e2 (e之前的部分乘以10的e之后的部分)
NaN:表示不能产生正常运算结果
Infinity:表示所有大于1.79769313486231570e+308的值
javascript有一个对象Math,包含一套作用于数字的方法。
4、字符串:
字符串字面量可以被包含在单引号或双引号中
\(反斜线)是转义字符
javascript没有字符类型,创建字符类型只需创建一个包含单一字符的字符串即可
有一个length属性
一旦字符串被创建就永远无法改变
可以通过+运算符连接其他字符串得到新的字符串
两个包含完全相同的字符且顺序一样的字符串被认为是相同的字符串 如:'c'+'a'+'t'=='cat' 为true
有自己的方法 如'cat'.toUpperCase()
5、语句:
1)web浏览器中,每个<script>标签都提供一个被编译且立即执行的编译单元,一个编译单元包含一组可执行的语句
switch while do for 语句允许有一个可选的前置标签,配合break使用
语句按从上到下顺序执行。可以通过条件语句(if switch),循环语句(for while dowhile),强制跳转语句(break return throw)以及函数调用来改变执行序列。
注:javascript中的代码块不会创建新的作用域,变量应该被定义在函数的顶端,而不是代码块中
2)boolean
false null undefined 空字符串('') 0 NaN 都返回false
其他所有值返回true 包括字符串'false',true,以及所有对象
6、特殊的值
当数值大于javascript所能表示的最大正值时,输出为Infinity,小于最小负值时,输出为-Infinity。
当产生未定义的结果时,返回一个特殊的javascript数值,NaN,但 这个数值和任何数都不等,包括自己,所以需要一个isNaN()来检测,isFinite()检测数字是否是NaN或正负无穷大