Nodejs笔记(1)——ECMAScript
来源:互联网 发布:家具有味怎么办知乎 编辑:程序博客网 时间:2024/06/08 04:54
变量是弱类型的
变量声明
本教程采用了这些前缀,以使示例代码更易阅读:
原始值和引用值
在 ECMAScript 中,变量可以存在两种类型的值,即原始值和引用值。
- 原始值
- 存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。
- 引用值
- 存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处。
- ECMAScript 有 5 种原始类型(primitive type),即 Undefined、Null、Boolean、Number 和 String。
原始值和引用值
在 ECMAScript 中,变量可以存在两种类型的值,即原始值和引用值。
- 原始值
- 存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。
- 引用值
- 存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处。
- ECMAScript 有 5 种原始类型(primitive type),即 Undefined、Null、Boolean、Number 和 String。
typeof 运算符
typeof 运算符有一个参数,即要检查的变量或值。例如:
var sTemp = "test string";alert (typeof sTemp); //输出 "string"alert (typeof 86); //输出 "number"
对变量或值调用 typeof 运算符将返回下列值之一:
- undefined - 变量是 Undefined 类型的
- boolean - 变量是 Boolean 类型的
- number - 变量是 Number 类型的
- string - 变量是 String 类型的
- object - 变量是一种引用类型或 Null 类型的
arguments 对象
在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们。
例如,在函数 sayHi() 中,第一个参数是 message。用 arguments[0] 也可以访问这个值,即第一个参数的值(第一个参数位于位置 0,第二个参数位于位置 1,依此类推)。
因此,无需明确命名参数,就可以重写函数:
function sayHi() { if (arguments[0]
== "bye") { return; } alert(arguments[0]);}
typeof 运算符
typeof 运算符有一个参数,即要检查的变量或值。例如:
var sTemp = "test string";alert (typeof sTemp); //输出 "string"alert (typeof 86); //输出 "number"
对变量或值调用 typeof 运算符将返回下列值之一:
- undefined - 变量是 Undefined 类型的
- boolean - 变量是 Boolean 类型的
- number - 变量是 Number 类型的
- string - 变量是 String 类型的
- object - 变量是一种引用类型或 Null 类型的
arguments 对象
在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们。
例如,在函数 sayHi() 中,第一个参数是 message。用 arguments[0] 也可以访问这个值,即第一个参数的值(第一个参数位于位置 0,第二个参数位于位置 1,依此类推)。
因此,无需明确命名参数,就可以重写函数:
function sayHi() { if (arguments[0]
== "bye") { return; } alert(arguments[0]);}
Function 对象(类)
ECMAScript 最令人感兴趣的可能莫过于函数实际上是功能完整的对象。
Function 类可以表示开发者定义的任何函数。
用 Function 类直接创建函数的语法如下:
var function_name = new function(arg1, arg2, ..., argN, function_body)
在上面的形式中,每个 arg 都是一个参数,最后一个参数是函数主体(要执行的代码)。这些参数必须是字符串。
记得下面这个函数吗?
function sayHi(sName, sMessage) { alert("Hello " + sName + sMessage);}
还可以这样定义它:
var sayHi = new Function("sName", "sMessage", "alert(\"Hello \" + sName + sMessage);");
虽然由于字符串的关系,这种形式写起来有些困难,但有助于理解函数只不过是一种引用类型,它们的行为与用 Function 类明确创建的函数行为是相同的。
如果函数名只是指向函数的变量,那么可以把函数作为参数传递给另一个函数吗?回答是肯定的!
function callAnotherFunc(fnFunction, vArgument) { fnFunction(vArgument);}var doAdd = new Function("iNum", "alert(iNum + 10)");callAnotherFunc(doAdd, 10);//输出 "20"
在上面的例子中,callAnotherFunc() 有两个参数 - 要调用的函数和传递给该函数的参数。这段代码把 doAdd() 传递给 callAnotherFunc() 函数,参数是 10,输出 "20"。
如前所述,函数属于引用类型,所以它们也有属性和方法。
ECMAScript 定义的属性 length 声明了函数期望的参数个数。例如:
function doAdd(iNum) { alert(iNum + 10);}function sayHi() { alert("Hi");}alert(doAdd.length);//输出 "1"alert(sayHi.length);//输出 "0"
混合的构造函数/原型方式
联合使用构造函数和原型方式,就可像用其他程序设计语言一样创建对象。这种概念非常简单,即用构造函数定义对象的所有非函数属性,用原型方式定义对象的函数属性(方法)。结果是,所有函数都只创建一次,而每个对象都具有自己的对象属性实例。
我们重写了前面的例子,代码如下:
function Car(sColor,iDoors,iMpg) { this.color = sColor; this.doors = iDoors; this.mpg = iMpg; this.drivers = new Array("Mike","John");}Car.prototype.showColor = function() { alert(this.color);};var oCar1 = new Car("red",4,23);var oCar2 = new Car("blue",3,25);oCar1.drivers.push("Bill");alert(oCar1.drivers);//输出 "Mike,John,Bill"alert(oCar2.drivers);//输出 "Mike,John"
现在就更像创建一般对象了。所有的非函数属性都在构造函数中创建,意味着又能够用构造函数的参数赋予属性默认值了。因为只创建 showColor() 函数的一个实例,所以没有内存浪费。此外,给 oCar1 的 drivers 数组添加 "Bill" 值,不会影响到 oCar2 的数组,所以输出这些数组的值时,oCar1.drivers 显示的是 "Mike,John,Bill",而 oCar2.drivers 显示的是 "Mike,John"。因为使用了原型方式,所以仍然能利用 instanceof 运算符来判断对象的类型。
这种方式是 ECMAScript 采用的主要方式,它具有其他方式的特性,却没有他们的副作用。
prototype 属性不仅可以定义构造函数的属性和方法,还可以为本地对象添加属性和方法。
- Nodejs笔记(1)——ECMAScript
- JS 基础 —— ECMAScript 对象 笔记
- ECMAScript 6学习总结(1)——ECMAScript 6入门简介
- 深入浅出JavaScript(1)—ECMAScript
- 深入浅出JavaScript(1)—ECMAScript .
- 深入浅出JavaScript(1)—ECMAScript
- 《ECMAScript 6入门》笔记1
- ECMAScript学习笔记(一)
- ECMAScript 6 笔记(三)
- ECMAScript 6 笔记(三)
- ECMAScript 6 笔记(五)
- ECMAScript 6 笔记(五)
- ECMAScript 6 笔记(五)
- ECMAScript 6 笔记(五)
- ECMAScript 6 笔记(五)
- Nodejs笔记(2)——模块
- Nodejs笔记(3)——事件
- 笔记——JavaScript 高级程序设计(1)——ECMAScript基础
- KM匹配 hdu2853(模版
- 算法编程题1-二叉树的按层遍历(含换行)
- 优秀程序员眼中的整洁代码
- 正则表达式的基本用法
- 8.3 E
- Nodejs笔记(1)——ECMAScript
- jdk获取属性名称注意事项
- WebRTC系列(3):PeerConnection通信建立流程
- mybatis 抛出 Mapped Statements collection does not contain value for 异常
- 第三方App接入微信登录 解读
- C++ bitset类的使用与简介
- 经典测试实践分享——以太网交换机性能测试需要关注的细节
- UML时序图
- 内存调试工具electric-fence 使用(各种架构方法类似)