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

西班牙语命令式的用法

西班牙语的命令式用法,基本可以分成两大块:一般命令式和礼貌命令式。 一般命令式。用于对话一方向另一方发出请求或者命令时,对象多为你,你们,我们。 礼貌命令式。一般用于请求居多,和中文的敬语比较相近,对象多为您,您们,我们。 以下具体介绍两种命令式的用法。 一般命令式的动词变位 原则 :动词各自去掉原形动词词尾-ar, -er, -ir, 在动词词干上加相应的命令式词尾。 (-a/-ad, – e/-ed, -e/-id)。比如: trabajar trabaja (你) trabajad(你们)

  • Chuan Shao
    Chuan Shao
2 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
JavaScript

JavaScript实验:逻辑判断符&&、||与!

与C、Java等语言一样,JavaScript中可以用&&、||、!三个逻辑判断符来对boolean值进行逻辑判断。与C、Java不同的是,JavaScript中逻辑与(&&)和逻辑或(||)操作符可以应用在任何值上,而操作结束后返回的也不一定是boolean值。 逻辑与&&的处理规则 JavaScript中&&的处理规则是这样的: 判断第一个值是否为Falsy。如果为Falsy,则直接返回第一个值(不一定为boolean类型)。 如果第一个值为Truthy,则直接返回第二个值(不一定为boolean类型)。 var o = {x:1,

  • Chuan Shao
    Chuan Shao
1 min read
JavaScript

JavaScript实验:eval()

在JavaScript中,可以使用eval()函数来解析字符串中的JavaScript代码,并返回相应的代码执行结果: console.log(eval("42 * 2"));//84 就本质而言,eval()是JavaScript全局对象的一个函数。比如,上述代码等价于: console.log(this.eval("42 * 2"));//84 不过在使用eval()语句时,一般都采用上述第一种做法,也即忽略全局对象直接使用eval()。 eval()的使用 基于以下两个原因,

  • Chuan Shao
    Chuan Shao
3 min read
JavaScript

JavaScript实验:object转换成number或string

在JavaScript程序编写过程中,根据不同的上下文,JS会自动将object转换成number或者string后再处理。这种自动转换的规则如下: object自动转换成string的规则: 如果object所属类覆写了toString()方法,则调用该方法。如果toString()调用的返回结果为Primitive(string、number、boolean、undefined、null),则将该Primitive值转换成string后返回。 如果object所属类没有覆写toString()方法 – toString()调用的返回结果为”[object Object]“;或者覆写了toString()方法但该方法返回结果为对象。那么JS将调用object的valueOf()方法,如果valueOf()调用的返回结果为Primitive(string、number、boolean、undefined、null)

  • Chuan Shao
    Chuan Shao
3 min read
JavaScript

JavaScript实验:变量定义与储存

与C、Java等编程语言不同,JavaScript中的变量是无类型的,所有的变量定义使用的关键词均为var: var a; var m, n; var x=42, y="test"; 如果定义变量后未对该变量进行赋值,那么该变量的值为undefined。如上面代码中的a、m、n三个变量的值均为undefined。 由于JS中变量是无类型的,因此完全可以对同一个变量进行不同类型的赋值,如: var b = "temp"; console.log(typeof b)

  • Chuan Shao
    Chuan Shao
3 min read

Subscribe to Chuan's blog