Javascript学习日志 (二) 变量、作用、内存问题
2012-12-14 12:09
609 查看
1 历史
1995年2月, Netscape开发了一种名为Livescript的脚本语言,为了赶上Java的热潮被Netscape将其改名为Javascript。
1997年,完成了ECMAScript标准化脚本语言。
2 javascript实现
ECMAScript只是Javascript的一部分,之外Javascript还包括DOM和BOM。
ECMAScript重要版本更新说明:
ECMA-262 V3:此版本的发布标志着ECMAScript成为了一门真正的编程语言,其更新主要涉及了字符串处理、错误定义和数值输出,之外还新增了对正则表达式、新控制语句、try-catch异常处理的支持。
ECMA-262 V4:新增了强类型变量、新语句和数据结构、真正的类和经典继承,并且还定义了与数据交互的新方式
ECMA-262 V5:提供了属性存取、反射创建、对象检测、属性的程序控制、附加的数组处理函数、JSON对象的编码与解码和严格模式下提供的errors检查和程序安全。
3 DOM(文档对象模型)
DOM是针对XML但经过扩展用于HTML的应用程序编程接口。由W3C为了解决浏览器兼容性而规划。
3.1 DOM级别
DOM Level1 由以下两个模块组成:
DOM核心:规定了如何映射基于XML的文档结构,以便简化对文档中任意部分的访问与操作;
DOM HTML:在DOM核心的基础上,添加了针对HTML的对象与方法。
DOM Level2 添加了以下新模块:
DOM视图:定义了跟踪不同文档视图的接口;
DOM事件:定义了事件和事件处理接口;
DOM样式:定义了基于CSS为元素应用样式的接口;
DOM遍历和范围:定义了遍历和操作文档树的接口。
DOM Level3 基于Level2进行了以下扩展:
引入了统一方式加载和保存文档的方法(DOM加载和保存模块中定义);
新增了验证文档的方法(DOM验证模块中定义);
开始支持XML1.0规范,涉及内容有:XML Infoset、XPath和XML Base。
4 BOM(浏览器对象模型)
BOM提供与浏览器交互的方法和接口。以下是Javascript的扩展,被当做BOM的一部分:
弹出新浏览器窗口的功能;
移动、缩放和关闭浏览器窗口的功能;
提供浏览器详细信息的navigator对象;
提供浏览器所加载页面的详细信息的location对象;
提供用户显示器分辨率详细信息的screen对象;
对cookies的支持;
像XMLHttpRequest和IE的ActiveXObject这样的自定义对象。
5 HTML中使用javascript需要注意的地方
5.1 <script>标签中async和defer属性的使用
async:当此属性被使用时(async="async"),表示js脚本文件的下载和执行不会影响页面的加载与显示,在这种情况下执行的js脚本文件不要在加载期间修改DOM内容,如果有多个js被此属性标记,这些文件的不一定会按照既定的顺序执行。
defer:使用该属性(defer="defer"),表示js脚本文件只下载但不执行,直到页面执行完</html>之后再执行该脚本文件,如果有多个js文件被此属性标记,这些文件会按照既定的执行顺序执行。
5.2 js代码的嵌入和外部js文件的引用
推荐使用外部文件的引用,因为外部文件可以被缓存,可以加快页面加载速度,并且由于外部文件相对独立,其维护性较好,也适应未来的发展趋势。
5.3 文档模式
文档模式主要有:混杂模式(quirks mode)和标准模式(standards mode),后来IE也推出了什么准标准模式,和标准模式相差不多。文档在默认情况下为混杂模式,推荐手动指定文档模式为标准模式,其开启方式如下:
<!-- HTML 4.01 严格型 -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<!-- XHTML 1.0 严格型 -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- HTML 5 -->
<!DOCTYPE html>
5.4 <noscript>标签
<noscript>标签在浏览器不支持脚本或者脚本被禁用的情况下使用,在此两种情况下<noscript>中的内容会被显示出来,如果浏览器支持脚本,且脚本未被禁用时<noscript>中的内容会被忽略掉。
6 基本概念
6.1 语法
区分大小写;
标识符由字母、下划线(_)、美元符号($)或数字组成,并且第一个字符必须是字母、下划线或一个美元符号(PHP中变量$var);
推荐使用驼峰书写格式;
注释:// 或 /**/
启用严格模式:
6.2 变量
推荐先定义,且初始化再使用,尽量保持前后变量使用时类型统一。用var定义的为局部变量,在作用范围外使用无效,直接使用的变量会被定义为全局变量。
6.3 数据类型
6中数据类型分别为:Undefined、Null、Boolean、Number、String、Object(本质上由一组无序的名值对组成)。
typeof操作符:
typeof(Undefined):"undefined",变量未定义;
typeof(Boolean):"boolean";
typeof(Number):"number", 其他进制都会转换成十进制参与计算,八进制在严格模式下无效,数值范围 (Number.MAX_VALUE/MIN_VALUE,Infinity,-Infinity, Number.NEGATIVE_INFINITY,Number.POSITIVE_INFINITY);
typeof(String):"string";
typeof(Null/Object):"Object",如果值为函数则返回:"function";
6.4 与6中数据类型相关的常见接口
isNaN(obj),判断obj是否为非数字,isNaN执行过程中会通过valueOf()和toString()函数来进一步确认obj的内容;
Number(),boolean->0/1,null->0,undefined->NaN,string(空串->0,NaN,对象->valueOf->toString->number);
parseInt(obj[, n]),第一个非数字或'-' -> NaN,空串-> NaN,第一个为数字->转换直至遇到非数字结束,0xN->16进制,0N->八进制,如果指定n,表示要转换到n进制。
6.5 Object类型
创建新对象:
var obj = new Object();Object()构造函数,如果是没有参数的构造函数可以将"()"省略掉直接使用 var obj = new Object;创建新对象。
Object实例的属性和方法:
constructor:保存了用于创建当前对象的函数,如Object();
hasOwnProperty(propertyName):检查属性是否在对象中存在,propertyName必须以字符串形式存在;
isPrototyoeOf(object):检查传入的对象是否为传入对象的原型??(同一类??);
propertyIsEnumerable(propertyName):检查给定的属性是否能够使用for-in语句类枚举;
toLocalString():返回对象的字符串表示,结果与执行环境的地区对应;
toString():返回对象的字符串表示;
valueOf:返回对象的字符串、数值、布尔值表示,通常与toString()返回值相同。
6.6 操作符
乘法:
number * number = number/Infinity/-Infinity;
obj * NaN = NaN;
Infinity * 0 = NaN;
Infinity * ~0 = Infinity/-Infinity;
Infinity * Infinity = Infinity;
除法:
number / number = number/Infinity/-Infinity;
obj / NaN, NaN/obj = NaN;
Infinity / Infinity = NaN;
0/0 = NaN;
0/number = Infinity/-Infinity;
~0/Infinity = Infinity/-Infinity;
全等于不全等("==" 和 "==="):
"==" 在经过转换之后相等则相等;
"===" 在不经过转换相等则相等;
逗号操作符:
总是返回表达式中的最后一项;
for-in语句:迭代语句,用来枚举对象的属性:
for (property in expression) statement;
label语句:添加标签, 一般与for等其他的循环语句配合使用;
with语句:将代码的作用域设置到一个特定的对象中,严格模式下使用时会报错,因此不推荐使用。
6.7 函数
function f([var1, var2, ...]) {
// contents
}
对函数的一些限制:
函数名不能为:eval/arguments;
参数名不能为:eval/arguments;
参数名不可同名。
arguments对象用来访问参数数组,这个数组用来接收并保存传入的参数,可以通过使用下标来访问传入的参数:arguments[0] -> var1, arguments[1] -> var2, ...,不可赋值,可以通过arguments.length来获取参数个数,arguments中的值始终与对应的参数值保持一致!!!!!;
1995年2月, Netscape开发了一种名为Livescript的脚本语言,为了赶上Java的热潮被Netscape将其改名为Javascript。
1997年,完成了ECMAScript标准化脚本语言。
2 javascript实现
ECMAScript只是Javascript的一部分,之外Javascript还包括DOM和BOM。
ECMAScript重要版本更新说明:
ECMA-262 V3:此版本的发布标志着ECMAScript成为了一门真正的编程语言,其更新主要涉及了字符串处理、错误定义和数值输出,之外还新增了对正则表达式、新控制语句、try-catch异常处理的支持。
ECMA-262 V4:新增了强类型变量、新语句和数据结构、真正的类和经典继承,并且还定义了与数据交互的新方式
ECMA-262 V5:提供了属性存取、反射创建、对象检测、属性的程序控制、附加的数组处理函数、JSON对象的编码与解码和严格模式下提供的errors检查和程序安全。
3 DOM(文档对象模型)
DOM是针对XML但经过扩展用于HTML的应用程序编程接口。由W3C为了解决浏览器兼容性而规划。
3.1 DOM级别
DOM Level1 由以下两个模块组成:
DOM核心:规定了如何映射基于XML的文档结构,以便简化对文档中任意部分的访问与操作;
DOM HTML:在DOM核心的基础上,添加了针对HTML的对象与方法。
DOM Level2 添加了以下新模块:
DOM视图:定义了跟踪不同文档视图的接口;
DOM事件:定义了事件和事件处理接口;
DOM样式:定义了基于CSS为元素应用样式的接口;
DOM遍历和范围:定义了遍历和操作文档树的接口。
DOM Level3 基于Level2进行了以下扩展:
引入了统一方式加载和保存文档的方法(DOM加载和保存模块中定义);
新增了验证文档的方法(DOM验证模块中定义);
开始支持XML1.0规范,涉及内容有:XML Infoset、XPath和XML Base。
4 BOM(浏览器对象模型)
BOM提供与浏览器交互的方法和接口。以下是Javascript的扩展,被当做BOM的一部分:
弹出新浏览器窗口的功能;
移动、缩放和关闭浏览器窗口的功能;
提供浏览器详细信息的navigator对象;
提供浏览器所加载页面的详细信息的location对象;
提供用户显示器分辨率详细信息的screen对象;
对cookies的支持;
像XMLHttpRequest和IE的ActiveXObject这样的自定义对象。
5 HTML中使用javascript需要注意的地方
5.1 <script>标签中async和defer属性的使用
async:当此属性被使用时(async="async"),表示js脚本文件的下载和执行不会影响页面的加载与显示,在这种情况下执行的js脚本文件不要在加载期间修改DOM内容,如果有多个js被此属性标记,这些文件的不一定会按照既定的顺序执行。
defer:使用该属性(defer="defer"),表示js脚本文件只下载但不执行,直到页面执行完</html>之后再执行该脚本文件,如果有多个js文件被此属性标记,这些文件会按照既定的执行顺序执行。
5.2 js代码的嵌入和外部js文件的引用
推荐使用外部文件的引用,因为外部文件可以被缓存,可以加快页面加载速度,并且由于外部文件相对独立,其维护性较好,也适应未来的发展趋势。
5.3 文档模式
文档模式主要有:混杂模式(quirks mode)和标准模式(standards mode),后来IE也推出了什么准标准模式,和标准模式相差不多。文档在默认情况下为混杂模式,推荐手动指定文档模式为标准模式,其开启方式如下:
<!-- HTML 4.01 严格型 -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<!-- XHTML 1.0 严格型 -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- HTML 5 -->
<!DOCTYPE html>
5.4 <noscript>标签
<noscript>标签在浏览器不支持脚本或者脚本被禁用的情况下使用,在此两种情况下<noscript>中的内容会被显示出来,如果浏览器支持脚本,且脚本未被禁用时<noscript>中的内容会被忽略掉。
6 基本概念
6.1 语法
区分大小写;
标识符由字母、下划线(_)、美元符号($)或数字组成,并且第一个字符必须是字母、下划线或一个美元符号(PHP中变量$var);
推荐使用驼峰书写格式;
注释:// 或 /**/
启用严格模式:
function doSometing() { "use strict"; // 函数体 }
6.2 变量
推荐先定义,且初始化再使用,尽量保持前后变量使用时类型统一。用var定义的为局部变量,在作用范围外使用无效,直接使用的变量会被定义为全局变量。
6.3 数据类型
6中数据类型分别为:Undefined、Null、Boolean、Number、String、Object(本质上由一组无序的名值对组成)。
typeof操作符:
typeof(Undefined):"undefined",变量未定义;
typeof(Boolean):"boolean";
typeof(Number):"number", 其他进制都会转换成十进制参与计算,八进制在严格模式下无效,数值范围 (Number.MAX_VALUE/MIN_VALUE,Infinity,-Infinity, Number.NEGATIVE_INFINITY,Number.POSITIVE_INFINITY);
typeof(String):"string";
typeof(Null/Object):"Object",如果值为函数则返回:"function";
6.4 与6中数据类型相关的常见接口
isNaN(obj),判断obj是否为非数字,isNaN执行过程中会通过valueOf()和toString()函数来进一步确认obj的内容;
Number(),boolean->0/1,null->0,undefined->NaN,string(空串->0,NaN,对象->valueOf->toString->number);
parseInt(obj[, n]),第一个非数字或'-' -> NaN,空串-> NaN,第一个为数字->转换直至遇到非数字结束,0xN->16进制,0N->八进制,如果指定n,表示要转换到n进制。
6.5 Object类型
创建新对象:
var obj = new Object();Object()构造函数,如果是没有参数的构造函数可以将"()"省略掉直接使用 var obj = new Object;创建新对象。
Object实例的属性和方法:
constructor:保存了用于创建当前对象的函数,如Object();
hasOwnProperty(propertyName):检查属性是否在对象中存在,propertyName必须以字符串形式存在;
isPrototyoeOf(object):检查传入的对象是否为传入对象的原型??(同一类??);
propertyIsEnumerable(propertyName):检查给定的属性是否能够使用for-in语句类枚举;
toLocalString():返回对象的字符串表示,结果与执行环境的地区对应;
toString():返回对象的字符串表示;
valueOf:返回对象的字符串、数值、布尔值表示,通常与toString()返回值相同。
6.6 操作符
乘法:
number * number = number/Infinity/-Infinity;
obj * NaN = NaN;
Infinity * 0 = NaN;
Infinity * ~0 = Infinity/-Infinity;
Infinity * Infinity = Infinity;
除法:
number / number = number/Infinity/-Infinity;
obj / NaN, NaN/obj = NaN;
Infinity / Infinity = NaN;
0/0 = NaN;
0/number = Infinity/-Infinity;
~0/Infinity = Infinity/-Infinity;
全等于不全等("==" 和 "==="):
"==" 在经过转换之后相等则相等;
"===" 在不经过转换相等则相等;
逗号操作符:
总是返回表达式中的最后一项;
for-in语句:迭代语句,用来枚举对象的属性:
for (property in expression) statement;
label语句:添加标签, 一般与for等其他的循环语句配合使用;
with语句:将代码的作用域设置到一个特定的对象中,严格模式下使用时会报错,因此不推荐使用。
var a = location.s.substring(); var b = location.hostname; with(location) { var a = s.substring(); var b = hostname; }
6.7 函数
function f([var1, var2, ...]) {
// contents
}
对函数的一些限制:
函数名不能为:eval/arguments;
参数名不能为:eval/arguments;
参数名不可同名。
arguments对象用来访问参数数组,这个数组用来接收并保存传入的参数,可以通过使用下标来访问传入的参数:arguments[0] -> var1, arguments[1] -> var2, ...,不可赋值,可以通过arguments.length来获取参数个数,arguments中的值始终与对应的参数值保持一致!!!!!;
相关文章推荐
- JavaScript学习日志(一):变量,作用域和内存问题
- javascript学习笔记 - 变量、作用域和内存问题
- JavaScript基础学习笔记(二)--- 变量、作用域和内存问题
- JavaScript 中变量、作用域和内存问题的学习
- javascript学习之变量、作用域和内存问题
- Javascript学习笔记3——变量、作用域和内存问题
- JavaScript高级程序设计学习笔记--变量、作用域和内存问题
- JavaScript高级程序设计学习笔记--变量、作用域和内存问题(一) (变量、作用域)
- JavaScript 中变量、作用域和内存问题的学习
- JavaScript高级程序设计学习(三)之变量、作用域和内存问题
- 自我学习而已——javascript——变量,作用域和内存问题
- 栋栋晓11:Javascript学习总结:变量、作用域和内存问题
- Javascript高级程序设计第二版第四章--变量,作用域及内存问题--笔记
- JavaScript高级程序设计——第4章 变量、作用域和内存问题
- JavaScript学习(三) 变量 作用域和内存
- 《js高级程序设计》学习笔记--4.变量、作用域和内存问题
- javascript高级程序设计第四章 变量、作用域和内存问题
- JavaScript高级程序设计之变量、作用域和内存问题之执行环境及作用域第4.2讲敏敏笔记
- JavaScript基础——变量、作用域和内存问题
- javascript 变量、作用域和内存问题