(第一天)包装对象、作用域、创建对象

基本概念以及注意

 直接量 :程序中直接使用的数据值。下面列出的都是直接量:

1                       12    //数字
2                       1.2  //小数
3                       "hello world"       //字符串文本
4                        true              //布尔值
5                       /javascript/gi    //正则表达式直接量

 标识符 :必须以字母、下划线(_)或美元符($)开始

  可选的分号 :如下代码

(1)

1 a = 3;                   /*两条语句分两行写,第一个分号可以省略*/
2 b = 4;

 a = 3; b = 4; 第一个分号则不能省略掉

(2)

1 return 2 true;     /*javascript解析成:return;true;*/              

javascript的数据类型分为两类: 原始类型 和 对象类型 

原始类型包括: 数字、字符串、布尔值、null、undefined 其余为对象类型

【注】null是javascript语言的关键字,它表示一个特殊值,常用来描述"空值"。对null执行typeof预算,结果返回字符串“object”,也就是说,可以将null认为是一个特殊的对象值,含义是“非对象”。undefined为未定义,可以用来表示更深层次的“空值”,如果查询对象属性或者数组元素的值时返回undifined则说明这个属性或元素不存在。undifined是预定义的全局变量(它和null不一样,它不是关键字)。尽管两者不同,但它们都表示“值的空缺”,两者往往可以互换。判断相等运算符“==”认为两者相等(要使用严格相等运算符“===”来区分它们)

布尔值转换

1                       function init(param) {
2                          if (param != undefined && param != null) {
3                           }
4                       }

参数param可能为null或者undifined还得判断,但无需这样做。 在javascript中,任意javascript的值都可以转换为布尔值。下列这些值会被转换为false: 

1 undifined
2 null
3 0
4 -0
5 NaN
6 "" //空字符串

因此上述只需简单一步即可 if(param){} 

包装对象

我们经常这样做

1 var s = "hello world";
2 var word = s.substring(s.indexof(" ") +1 ,s.length);

上述我们定义一个字符串s,因为字符串不是对象,为什么它会有属性呢?因为只要引用了字符串s的属性,JavaScript就会将字符串通过new String(s)的方式转换成对象,这个对象继承了字符串的方法,并被用来处理属性的引用。一旦引用结束,这个新创建的对象就会被销毁(其实在实现上并不一定创建或销毁这个临时对象,然而整个过程看起来是这样)。同字符串一样,数字和布尔值也都有各自的方法:通过Number()和Boolean()构造函数来创建一个临时对象,这些方法的调用都是来自这个临时对象。【注】null和undefined没有包装对象:访问它们的属性会造成一个类型错误。

现在通过上述论断,我们看下面代码,思考它们的执行结果:

1 var s = "test";
2 s.len = 4;
3 var t = s.len;

我们创建字符串给其设置一个属性,并想获得这个属性,结果却是 undefined 。解释:第二行代码创建了一个临时字符串对象,并给其len属性值为4,随即销毁这个对象。第三行通过原始的(没有被修改过)字符串创建一个新字符串对象,尝试读取去len属性,这个属性自然不存在,所以运行结果为undifined。这段代码说明在读取字符串、数字、布尔值的属性值或者方法的时候,表现的对象一样。但如果试图给其属性赋值,则会忽略这个操作:修改只是发生在临时对象身上,而这个临时对象并未继续保留下来。

存取字符串、数字、布尔值的属性时创建的临时对象称作为包装对象

作用域

变量作用域

 一个变量的作用域(scope)是程序源代码中定义这个变量的区域。全局变量拥有全局作用域,在JavaScript代码中的任何地方都是有定义的。然而在函数内声明的变量只在函数体内有定义。它们是局部变量,作用域是局部性的。函数参数也是局部变量,它们只在函数体内有定义。

 在函数体内,局部变量的优先级高于同名的全局变量。如果在函数内声明的一个局部变量或者函数参数中带有的变量和全局变量重名,那么全局变量就被局部变量所覆盖 

下面我们用代码来解释

 1 var scope = "global";
 2 function checkscope(){
 3     var scope = "local";
 4     return scope;
 5 }
 6 checkscope()
 7
 8 /*
 9 声明一个全局变量scope,同时声明一个同名的局部变量scope,此时返回local即返回局部变量的值,而非全局变量的值
10 */

 函数作用域

我们知道在c#中花括号的每一段都有各自的作用域,而且变量在声明它们的代码段之外是不可见的,我们称之为块级作用域,但是在JavaScript中没有块级作用域。JavaScript取而代之的是函数作用域:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的。

下面我们用代码演示

 1 function scope() {
 2     for (var i = 0; i < 10; i++) {
 3         var block = "local";
 4     }
 5     console.log(block);
 6 }
 7
 8 /*
 9 代码运行正确,未出现错误,只是未打印出block,说明此时block已经定义了,但可能还没有初始化
10 */

JavaScript的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的。这意味着变量在声明之前甚至已经可用。JavaScript的这个特性被非正式地称为声明提前。

 下面我们继续就论断思考一下下面所给代码运行结果

 1 var scope = "global";
 2 function f(){
 3     console.log(scope);
 4     var scope = "local";
 5     console.log(scope);
 6 }
 7
 8 /*
 9 第一个输出为undifined,而非“global”,第二个输出为“local”;
10 解释:在函数体内的变量在函数中始终是可见的,意思就是变量本身在函数体内任何地方都是有定义的,再加上之前讲过同名的变量,局部变量的优先级高于全局变量,此时会将全局变量进行覆盖,刚才有讲过,声明提前即变量在声明之前已经可用,所以此时scope并未初始化!然而此时当代码执行到var时,局部变量才会真正被赋值,所以上述代码等价于下面代码
11 */
12 function f(){
13     var scope;
14     console.log(scope);
15     scope = "local";
16     console.log(scope);
17 }

如果var语句中的变量没有指定初始化表达式,那么这个变量的值初始化为undifined。上述也已经提到变量在声明它们的脚本或函数中都是有定义的,变量声明语句 会被“提前”至脚本或函数的顶部。但是初始化的操作则还在原来var语句的位置执行,在声明语句之前变量的值是undifined。

创建对象

(1)对象直接量

 1 var empty = {};
 2 var point = {x:0,y:0};
 3 var book = {
 4       "main:"JavaScript",
 5       "sub-title":"The Guide",
 6       author:{
 7              name:"javascript",
 8       }
 9
10 }

对象直接量是一个表达式,这个表达式的每次运算都创建并初始化一个新的对象。每次计算对象直接量的时候,都会计算她的每个属性的值。也就是说,如果在一个重复调用的函数中的循环体内使用了对象直接量,它将创建很多新对象,并且每次创建的对象的属性值也有可能不同。

(2)关键字new

1 var a = new Array();
2 var d = new Date();
3 var r = new RegExp("js");

(3)Object.create()函数

ECMAScript5定义一个名为Object.create()的方法,它创建一个新对象,其中第一个参数为对象的原型。Object.create()提供第二个可选参数,用以对对象的属性进行进一步描述。Object.create()是一个静态函数,而不是提供给某个对象调用的方法,使用很简单,只需传入所需的原型对象即可:

 var o1 = Object.create({x:1,y:2}); /* o1继承了属性x和y(有关原型和继承)下节讲 */ 

同样我们也可以通过传入参数null来创建一个没有原型的新对象,但通过这种方式创建的对象不会继承任何东西,甚至不包括基础方法,比如toString()方法,也就是说它将不能和"+"运算符一起正常工作。

 var o1 = Object.create(null); 

如果想创建一个空的普通对象,需要传入Object.prototype:

1 var o3 = Object.create(Object.prototype);
2 /*
3 o3和{}和new Obejct()一样
4 */
时间: 2024-09-20 04:11:49

(第一天)包装对象、作用域、创建对象的相关文章

JavaScript包装对象介绍及基本包装类型

JavaScript中的对象是由属性和方法两个基本的元素的构成的.前者是对象在实施其所需要行为的过程中,实现信息的装载单位,从而与变量相关联:后者是指对象能够按照设计者的意图而被执行,从而与特定的函数相联. JavaScript对象是一种复合值:它是属性和已命名值的集合.通过"."符号来引用属性值.当属性值是一个函数时,称为方法. ①一段你常用但却未必明白其真正底层原理的代码: var s = "hello world!";var word = s.substrin

JavaScript包装对象使用介绍_javascript技巧

JavaScript是面向对象的语言,使用"."操作符可以访问对象的属性和方法,而对于基本类型(null, undefined, bool, number, string)应该是值类型,没有属性和方法,然而 复制代码 代码如下: var s='this is a string';alert(s.length);alert(s.indexOf('is')); 结果很简单,但是仔细想想还真奇怪,string不是值类型吗!怎么又有属性又有方法的! 内置对象 JavaScript有一系列内置对

JavaScript包装对象使用详解_javascript技巧

JavaScript对象是一种复合值:它是属性和已命名值的集合.通过"."符号来引用属性值.当属性值是一个函数时,称为方法. ①一段你常用但却未必明白其真正底层原理的代码: var s = "hello world!"; var word = s.substring(s.indexOf(" ")+1,s.length); 如前面所说,这里变量s只是一个字符串原始类型,它怎么会有属性(s.length)和方法(s.indexOf().s.subst

javascript包装对象实例分析_javascript技巧

本文实例讲述了javascript包装对象用法.分享给大家供大家参考.具体分析如下: js对象是一种复合值:它是属性或已命名值得集合. 参考以下代码: var s = "hello world"; var len = s.length; 在该例子中,s是字符串,而字符串不是对象,但为何会有属性呢?其实只要引用了字符串s的属性,js就会将字符串通过调用new String(s)的方式转换为对象,该对象继承了字符串的方法,并被用来处理属性的引用:一旦属性引用结束,这个新创建的对象就会被销毁

javascript包装对象

原文:javascript包装对象            javascript对象是一种复合值,它是属性或已命名的值的集合,通过符号"."来引用属性值,当属性值是一个函数的时候,我们称之为方法.  我们看到字符串也具有属性和方法:           var s="hello,world!";           var word=s.substring(s.indexof("")+1,s.length);   字符串既然不是对象,为什么它又有属

JavaScript中的包装对象介绍_javascript技巧

javascript对象是一种复合值,它是属性或已命名的值的集合,通过符号"."来引用属性值,当属性值是一个函数的时候,我们称之为方法.我们看到字符串也具有属性和方法: 复制代码 代码如下: var s="hello,world!"; var word=s.substring(s.indexof("")+1,s.length); 字符串既然不是对象,为什么它又有属性呢,只要引用了字符串s的属性,javascript就会将字符串值通过调用new S

第六章 对象作用域与servlet事件监听器

      作用域对象 Servlet上下文监听器 Servlet会话监听器 Servlet请求监听器     一:对象作用域   作用域对象 属性操作方法 作用域范围说明 ServletContext(上下文) void setAttribute(String, Object) Object getAttribute(Sting) void removeAttribute(String) Enumeration getAttributeNames() 整个Web应用程序 HttpSession

Silverlight MMORPG网页游戏开发课程[一期] 第一课:控制对象移动

引言 游戏中的主角是精灵,我们可以把游戏中的一切对象均视作精灵:玩家大部分时间都在操控着游戏中对象进行移动.因而本节我们要实现的功能只有一个:通过鼠标控制对象移动. 1.1通过Storyboard创建对象移动动画(交叉参考: 让物体动起来①) 在序言中我们讲解了如何通过VisualStudio2010创建一个Silverlight4项目,那么我们首先打开这个项目,并将MainPage.xaml中名为LayoutRoot的Grid换成Canvas. Canvas顾名思义是画布的意思,它是游戏开发中

JavaScript 类型的包装对象(Typed Wrappers)_js面向对象

例如: new Boolean(false) 会返回一个对象,该对象有一个 valueOf 方法会返回被包装的值.这其实完全没有必要,并且有时还令人困惑.不要使用 new Boolean. new Number 或 new String. 此外也请避免使用 new Object 和 new Array.可使用 {} 和 [] 来代替. --------------------------------------------------------------------------------