JavaScript

关于Error.captureStackTrace

在一些Node.js程序中,有时会看到Error.captureStackTrace()这一语句,用于处理堆栈信息。该语句的标准定义是什么?如何使用?本文将就这些问题做一些探讨。 标准定义 从字面上来看,captureStackTrace应该是Error构造函数自身的一个方法。因此,很自然的想到从ECMAScript标准文档中寻找答案。不幸的是,在标准文档的19.5 Error Objects章节中,并未提及任何有关captureStackTrace的内容。看来,这一语句和语言的运行环境有关,并非由JavaScript标准所定义。 既然JavaScript语言标准中没有定义captureStackTrace,那就只能从Node.js的文档中去寻找答案了。Node.js中,关于Error.captureStackTrace的描述是这样的: Error.captureStackTrace(targetObject[

  • Chuan Shao
    Chuan Shao
4 min read
JavaScript

JavaScript实验:类(Class)

在JavaScript中,可以使用类(Class)来实现面向对象编程(Object Oriented Programming)。不过,JavaScript中的类与Java中的有所不同,其相应的定义和使用也不一样。 JavaScript中类的定义 在JavaScript中,所有从同一个原型对象(prototype)处衍生出来的对象组成了一个类;也就是说,JavaScript中的类是一个对象集合的概念,如果两个对象它们的prototype相同,那么它们就属于同一个类;JavaScript中的类甚至都不需要类名。以下面的代码为例: var p = {x:42}; var a = Object.create(p); var b = Object.

  • Chuan Shao
    Chuan Shao
6 min read
JavaScript

JavaScript实验:方法调用

JavaScript中,如果function属于一个对象,那么通过对象来访问该function的行为称之为“方法调用”。与普通的函数调用不同的是,在进行方法调用时,function中的this指代将发生变化 -- this将指代用于调用该function的对象(该对象将成为方法调用的invocation context): var x = 99; var sample = { x:1, act:function(a){ this.x = a*a;//assign value to sample's x, not global object's

  • Chuan Shao
    Chuan Shao
2 min read
JavaScript

JavaScript实验:闭包(Closure)

闭包是JavaScript中一个重要的特性,其最大的作用在于保存函数运行过程中的信息。在JavaScript中,闭包的诸多特性源自函数调用过程中的作用域链上。 函数调用对象与变量的作用域链 对于JavaScript中的每一次函数调用,JavaScript都会创建一个局部对象,用来储存该函数中定义的局部变量;如果该函数内部还有一个嵌套定义的函数(nested function),那么JavaScript会在已经定义的局部对象之上再定义一个嵌套局部对象。对于一个函数,其内部有多少层的嵌套函数定义,也就有多少层的嵌套局部对象。该局部对象称为“函数调用对象”(ECMAScript 3中的"call object",ECMAScript 5中改名为"declarative environment record",但个人认为还是ECMAScript 3中的名称更容易理解一些)。以下面的函数调用为例:

  • Chuan Shao
    Chuan Shao
6 min read
JavaScript

JavaScript实验:数组

与Java语言不同,JavaScript中的数组拥有三个特性: 无类型。数组的成员可以是任何类型,同一个数组也可以由很多不同类型的成员所组成。 长度可变。数组的长度是可以动态变化的,因此在JavaScript中不存在数组访问的越界问题。 不连续性。数组中成员的位置可以是连续的(0, 1, 2, 3…),也可以是不连续的。任何数组都有一个名为length的属性,在数组成员连续的情况下,length值与数组成员数目一致;当数组成员不连续时,length值要大于数组成员的数目。与连续的数组相比,不连续数组的读写性能要差一些。 实验: var o = [42, "Sample Text", {x:88}];//JavaScript

  • Chuan Shao
    Chuan Shao
4 min read
JavaScript

JavaScript实验:类数组对象

JavaScript中,数组是一个特殊的对象,其property名为正整数,且其length属性会随着数组成员的增减而发生变化,同时又从Array构造函数中继承了一些用于进行数组操作的方法。而对于一个普通的对象来说,如果它的所有property名均为正整数,同时也有相应的length属性,那么虽然该对象并不是由Array构造函数所创建的,它依然呈现出数组的行为,在这种情况下,这些对象被称为“类数组对象”。以下是一个简单的类数组对象: var o = {0:42, 1:52, 2:63, length:3} console.log(o); 与普通对象不同的是,类数组对象拥有一个特性:可以在类数组对象上应用数组的操作方法。比如,在ECMAScript 5标准中,

  • Chuan Shao
    Chuan Shao
1 min read
JavaScript

JavaScript实验:对象property的属性

JavaScript中对象的property有三个属性: writable。该property是否可写。 enumerable。当使用for/in语句时,该property是否会被枚举。 configurable。该property的属性是否可以修改,property是否可以删除。 在ECMAScript 3标准中,上面三个属性的值均为true且不可改:新建对象的property是可写的、可被枚举的、可删除的;而在ECMAScript 5标准中,可通过property的描述对象(property descriptor)来对这些属性进行配置和修改。 如果将property的值信息也作为property的属性来看的话,对象中的property拥有四个属性:value、writable、enumerable和configurable。 对于用getter和setter方法来定义的property,由于其没有writable属性(property是否可写取决于setter方法是否存在),因此这种property也有四个属性:get、set、

  • Chuan Shao
    Chuan Shao
3 min read
JavaScript

JavaScript实验:对象的extensible属性

JavaScript中,对象的extensible属性用于表示是否允许在对象中动态添加新的property。ECMAScript 3标准中,所有的对象都是extensible的。ECMAScript 5标准中,所有的对象默认仍是extensible的,但可以通过设定来改变这一属性。 查询一个对象是否是extensible的,可以使用Object.isExtensible()语句: var o = {x:1}; console.log(Object.isExtensible(o));//true 使一个对象变成不是extensible的,可以使用Object.preventExtensions()语句: Object.preventExtensions(o) console.log(Object.

  • Chuan Shao
    Chuan Shao
2 min read
JavaScript

JavaScript实验:对象property的删除

JavaScript中,可以使用delete操作符来删除对象中的property: var t = {a:42, b:26}; console.log(t);//Object {a=42, b=26} delete t.a; console.log(t);//Object {b=26} 这种property删除操作的局限性在于:delete操作符只能删除对象自身所有的property,无法删除其从prototype对象处继承而来的property。也即:delete操作符无法触及原型链中的任何字段。如果想删除prototype对象中的property,必须显式获取prototype对象后,在prototype对象中进行操作:

  • Chuan Shao
    Chuan Shao
1 min read
JavaScript

JavaScript实验:检查对象property的存在性

在JavaScript中,可以用四种方法来检查某个对象o是否拥有property x: “x” in o。in操作符可用于检查对象o中是否有x这个property。x可以是对象自身的(Own Property),也可以是从原型对象中继承而来的;x可以是enumerable的property,也可以是非enumerable的property。 o.x。可以通过访问o.x语句,判断其结果是否为undefined来确认x是否存在,其作用范围与in操作符相同。与in操作符不同的是:如果在对象o中显式声明某个property x的值为undefined,那么”x” in o操作结果将为true,而o.x结果则为undefined。 hasOwnProperty()。o.hasOwnProperty(“x”)操作用于判断o对象自身是否拥有x

  • Chuan Shao
    Chuan Shao
1 min read
JavaScript

JavaScript实验:遍历对象的property

在JavaScript中,可以用三种方法来遍历对象的property: for/in。可以使用for/in语句遍历对象自身的property(Own Property)及其从原型对象处继承的property,只有enumerable的property才会被遍历到。 Object.keys()。可以将对象作为参数传入Object.keys(),Object.keys()语句将返回由所有property名称字符串所组成的数组。Object.keys()语句仅返回对象自身的(Own Property)且enumerable的property。该语句仅在ECMAScript 5标准中有效。 Object.getOwnPropertyNames()。可以将对象作为参数传入Object.getOwnPropertyNames(),与Object.keys()一样,该语句将返回由所有property名称字符串所组成的数组。

  • Chuan Shao
    Chuan Shao
1 min read
JavaScript

JavaScript实验:对象

JavaScript中,除了number、string、boolean、null和undefined,其它所有的值都是对象。对象可以通过字面量来直接声明,也可以通过new操作符来新建。与Java语言不同,JavaScript对象中的property是可以动态添加或者删除的;同时,对象中的property还可以是空字符串: //properties in object can be added/deleted dynamically var o = {x:1, y:2}; console.log(o);//Object {x=1, y=

  • Chuan Shao
    Chuan Shao
2 min read
JavaScript

JavaScript实验:用字面量创建对象

JavaScript中可以用字面量来直接创建一个新对象: var obj = {a:27, "b":99}; 如上所述,在用字面量来创建对象的时候,对象中的property定义可以用单引号或双引号来包括,也可以忽略引号。不过,当property中出现空格、斜杠等特殊字符,或者使用的property与JS关键词冲突时,则必须使用引号。 在用字面量来创建对象的时候,property可以是空字符串,property中也可以出现空格: //empty string is allowed as object property var o = {"":88,

  • Chuan Shao
    Chuan Shao
1 min read
JavaScript

JavaScript实验:prototype

JavaScript中的继承是通过原型链(prototype chain)来完成的:每个对象内部都有另外一个对象作为其prototype而存在,对象从这个prototype中继承属性(property)。对于每个对象来说,可以用以下三种方式来访问其原型对象: __proto__。可以通过对象的__proto__属性来访问其原型对象。该属性仅在Firefox、Safari和Chrome中得到支持,在IE和Opera中不支持。 Object.getPrototypeOf()。可以将对象作为参数传入Object.getPrototypeOf()方法,执行后即返回对象的原型对象。此方法仅在ECMAScript 5标准中得到支持。 o.constructor.prototype。通过先获取对象的constructor函数,然后再通过访问constructor函数的prototype属性来访问到原型对象。使用此方法的前提为:对象中存在指向构造函数的constructor属性。 判断两个对象间是否存在原型链关系可以使用isPrototype()方法:

  • Chuan Shao
    Chuan Shao
2 min read
JavaScript

JavaScript实验:==与===

JavaScript中,==与===操作符均可用于判断两个值是否相等;不同之处在于,如果进行判断的两个值类型不一致,===操作符会直接返回false,而==操作符则会在类型转换后再进行判断。详细的判断规则如下: ===操作符的判断规则 如果两个值的类型不一致,返回false。 如果两个值的类型一致,值一致,返回true。NaN是一个特例,NaN===NaN返回false。 如果两个值均为object类型,那么与Java一样,除非两者引用一致(reference指向同一个对象地址),不然即使object中的内容完全一样,也认为这两个值不一致,相应的操作将返回false。比如,新建两个内容完全一样的数组,对它们进行===操作后返回结果为false — 虽然它们的内容完全一样,但还是属于两个不同的对象。 0===-0返回true。

  • Chuan Shao
    Chuan Shao
2 min read
JavaScript

JavaScript实验:比较操作符>、<、>=、<=

与==操作符一样,比较操作符(>、<、>=、<=)可以将对象转换成string或者number后再进行比较 -- 对于number,比较值的大小;对于string,则比较字符在编码表中出现的次序。与==操作符不一样的是,==会将Date对象优先转换成string后再加以比较,而比较操作符则会对包括Date在内的所有对象优先转换成number后再加以比较。其比较判断的规则如下: 操作符两边如果有对象,将其转换成number;如果无法转换成number,则将其转换成string。 经过转换后,如果操作符两边均为string,则进行字符串比较;否则,只要有一边出现number,则进行数值比较。 如果操作符两边出现NaN,返回false。 0与-0相等。 实验 //In

  • Chuan Shao
    Chuan Shao
1 min read

Subscribe to Chuan's blog