1.js基本概念以及注意

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

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不一样,它不是关键字)。尽管两者不同,但它们都表示“值的空缺”,两者往往可以互换。判断相等运算符“==”认为两者相等(要使用严格相等运算符“===”来区分它们)

2.布尔值转换

                      function init(param) {
if (param != undefined && param != null) {
}
}

参数param可能为null或者undifined还得判断,但无需这样做。

在javascript中,任意javascript的值都可以转换为布尔值。下列这些值会被转换为false:

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

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

牛逼吧。呵呵,这就是高手和新手的区别,你知道了,理解了,解决问题能力也就起来了。

3.包装对象

我们经常这样做

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。这段代码说明在读取字符串、数字、布尔值的属性值或者方法的时候,表现的对象一样。但如果试图给其属性赋值,则会忽略这个操作:修改只是发生在临时对象身上,而这个临时对象并未继续保留下来。

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

4.作用域

变量作用域

一个变量的作用域(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。

5.创建对象

(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 */

前端 JS 修炼(第一天)包装对象、作用域、创建对象的更多相关文章

  1. JS面向对象组件(一) ---包装对象与原型链

    首先我们可以看看平时我们常用的 var str = 'hello'; alert(typeof str); //string var str = new String("hello" ...

  2. js学习笔记之包装对象

    JavaScript包装对象 近日有时间,闲下来好好学习原生js JavaScript是一门面向对象语言,使用"."就可以访问对象的属性和方法,而基本类型(null, undefi ...

  3. js基本类型的包装对象

    var test = "test"; test.a = "hello"; console.log(test.a); 在JavaScript中,“一切皆对象”,数 ...

  4. JS 基本类型的包装对象

    笔记整理自:廖雪峰老师的JS教程 目录 包装对象 不写new的作用 总结 注意 包装对象 JavaScript还提供了包装对象,熟悉Java的小伙伴肯定很清楚int和Integer这种暧昧关系. nu ...

  5. 重学前端--js是面向对象还是基于对象?

    重学前端-面向对象 跟着winter老师一起,重新认识前端的知识框架 js面向对象或基于对象编程 以前感觉这两个在本质上没有什么区别,面向对象和基于对象都是对一个抽象的对象拥有一系列的行为和状态,本质 ...

  6. [前端JS学习笔记]JavaScript prototype 对象

    一.概念介绍 prototype 对象 : 原型对象.在JavaScript中, 每一个对象都继承了另一个对象,后者称为"原型对象". 只有 null 除外,它没有自己的原型对象. ...

  7. 轻松理解JS基本包装对象

    今天来讨论一下JS中的基本包装对象(也叫基本包装类型),之前刚学到这里的时候,自己也是一头雾水,不明白这个基本包装对象到底是个什么鬼,后来找了很多资料,终于看清了它的真面目.首先呢,我们现在复习一下J ...

  8. js中的包装对象。

    我们都知道在js中普通类型的变量是没有属性和方法的,然后有时却并不是这样. var str = "努力,奋斗"; console.log(str.length); var num ...

  9. JS学习笔记 等于和包装对象

    严格等于 a===b 首先判断两边数据的类型,若类型不同,返回false. 若类型相同(1.2和1.2,字符串相等指内容和长度都是一样的),返回true null===null undefined== ...

随机推荐

  1. 关于MOVE 和 CopyMemory 的用法区别

    最近做了一个数据采集服务器, 根据程序的框架,使用了大量的指针结构体(内存块) 操作. 例子: PArrayByte = ^TArrayByte;  TArrayByte = packed recor ...

  2. 一个2013届毕业生(踏上IT行业)的迷茫(1)

    从毕业到现在已经快半年了,已经想写这篇文字很久了,但是一次又一次的被没有时间给搁置了,今天突然好想写一篇自己这么多年的总结,算是一种反思,也可以看作为未来的人生指路吧. 我和很多搞IT的同行们一样,不 ...

  3. octopress第三方插件:博文同步工具syncPost

    为了增加外链等考虑,独立博客往往有将博文同步到其他博客社区的需求.自己人肉黏贴的方式笨拙.重复,对于程序猿而言,着实不可取. 我在 github 上找到了 syncPost 这个针对 octopres ...

  4. PCI GXL学习之二次开发篇

    作者:朱金灿 来源:http://blog.csdn.net/clever101 gxl的二次开发分初级和高级之分.初级是gxl提供了几百个模块供你编排成不同的作业.高级就是你可以编写你的算法模块,然 ...

  5. MFC和Qt优缺点 (MFC几乎没有优点、全面下风)

    在网上看到的,拿来和大家一起讨论下. 我曾经使用过来开发过软件,我想和大家分享我使用他们时所体会的不同之处. 我并非一个职业作家,这篇文章可能看起来不如专业的杂志和网站上的那么条理清晰.但是,我在这里 ...

  6. C#或者WPF中让某个窗体置顶

    原文:C#或者WPF中让某个窗体置顶 前记:在工作中有个需求,要求不管到那个界面,我必须让一个浮动条(其实是个窗体)置顶. 我用wpf,因为有之前有好几个界面已经设置成topmost了,所以在这几个界 ...

  7. 《Planet Earth II》观看笔记

    carrion:n. 腐肉:臭尸:不洁之物 cub:n. 幼兽:不懂规矩的年轻人:chick; n. 小鸡:小鸟:少妇 herd:兽群: 1. 高频单词 terrain:n. [地理] 地形,地势:领 ...

  8. Robot Framework安装指南

    安装软件下载列表: 2012年5月15日更新 1.python 2.7http://www.python.org/download/http://www.python.org/ftp/python/2 ...

  9. Kitto2 now with free opensource Kide2 since September 2017(提供Web解决方案,大概是觉得Mobile开发快差不多了)

    Kitto2 is a tool for data-driven web application Development. It allows to create Rich Internet Appl ...

  10. 使用 install.packages() 安装所需的包

    1. 从 CRAN 上安装 install.packages("tm", dependencies = TRUE) tm 程序包用于文本挖掘(text mining) 2. 本地安 ...