改善Java Script程序的建议(二)

1、数组长度的有限性和无限性

var myArray = [];

myArray.lenght; // 0

myArray[10000] = true;

myArray.length // 10001

根据 ECMAScript 标准,数组的下标必须是大于或等于0且小于2^32 -1 的证书。

我们可以指定数组的长度,这将导致所有下标大于或等于新 length 的元素被删除。

var numbers = ["hello","are","you","ok","hahaha"];

numbers.length = 4;

console.log(numbers)

["hello","are","you","ok"]

2、建议使用 splice 删除数组

由于数组其实就是对象,因此使用 delete 运算符可以从数组中移除元素。但是移除下标位置元素后,会在数组中遗留一个空洞。

例如:

var strArr = ["1", "2", "3"];

delete strArr[1]

console.log(strArr[1])

undefined

splice 删除元素,如下

var strArr = ["1", "2", "3"];

strArr.splice(1,1);

console.log(strArr[1]);

3

console.log(strArr);

["1", "3"]

3、使用 arguments 模拟重载

function sayHello() {

switch(arguments.length){

case 0:

return"Hello";

case 1:

return"Hello,"+arguments[0];

case 2:

return (arguments[1]=="cn" ? "你好,":"Hello,")+arguments[0];

};

}

sayHello(); //"Hello"

sayHello("Alex"); //"Hello,Alex"

sayHello("Alex","cn"); //"你好,Alex"

4、建议使用闭包跨域开发

function f(x){ // 外部函数

var a=x; // 外部函数的局部变量,并把参数数值传递给它

var b =function(){ //内部函数

return a; // 访问外部函数中的局部变量

};

a++; // 访问后,动态更新外部函数的变量

return b; // 内部函数

}

var c =f(5); // 调用外部函数,并赋值

alert(c()); // 调用内部函数,返回外部承数更新后的值6


演示步骤说明:

第一步,程序预编译之后,从第9行开始解析执行,创建上下文环境,创建调用对象,把参数、局部变量、内部的函数转换为对象的属性。

第二步,执行函数体内代码。在第6行执行局部变量 a 的递加运算,并把这个值传递给对象属性a, 内部函数动态保持与局部变量 a 的联系,同时更新自己内部调用变量的值

第3步,外部函数把内部函数返回给全局变量c,实现内部函数的定义,此时 c 完全继承了内部函数的所有结构和数据。

第4步,外部函数返回后(即返回之后调用完毕)会自动销毁,内部的结构、标识符和数据也随之丢失。

第5步,执行第10行代码命令,调用内部函数,此时返回的是外部函数返回时(销毁之前)保存的变量a 所存储的最新数据值,即返回6。

function f(){

var a = 1;

b = function(){

alert(a);

}

c = function(){

a++;

}

d = function( x ){

a = x;

}

}

f();

b(); // alert(1);

c();b(); // alert(2);

d(100);b(); // alert(100);

5、在循环体和异步回调中慎重使用闭包

6、通过 Function 扩展类型

JavaScript允许为语言的基本数据类型定义方法。通过为Objectprototype添加原型方法,该方法可被所有的对象使用。这样的方式对函数、数组、字符串、数字、正则表达式和布尔值都适用。例如,通过给Function.prototype增加方法,使该方法对所有函数可用。

Function.prototype.method=function(name, func){

this.prototype[name]=func;

return this;

};

为Functionprototype增加一个method方法后,就不必使用prototype这个属性了,然后调用method方法直接为各种基本类型添加方法。

JavaScript并没有单独的整数类型,因此有时候只提取数字中的整数部分是必要的。 JavaScript本身提供的取整方法有些不太好,下面通过为Number.prototype添加一个integer方法来改善它。

Number.method('integer',function() {

return Math[this < 0 ? 'ceil ’: 'floor'](this);

});

document.writeln((-10/3).integer()); //-3

7、原型属性和本地特性之间的关系

Objectprototype.a = 1; //声明Object的原型属性a的值为1

Function.prototype.a = 2; //声明Function的原型属性a的值为2

alert(Object.a); //2.说明属性a指向Function构造函数的原型

alert(Function.a); //2,说明属性a指向Function构造函数的原型

var o = {} //空的对象直接量

alert(o.a); //1,说明属性a指向Object构造函数的原型

var f = Object; //引用Object构造函数

alert(f.a); //2,说明属性a指向Function构造函数的原型

var f1 = new Function(); //实例化Function对象

alert(f1.a); //2,说明属性a指向Function构造函数的原型

var o1 = new object(); //实例化Object对象

alert(o1.a); //1,说明属性a指向Object构造函数的原型

8、合理使用原型

本地属性覆盖原型属性

function p(x){

this.x = x;

}

p.prototype.x = 1;

var p1 = new p(10);

alert(p1.x); // 本地属性覆盖原型属性

但是原型属性并没有被删除,它依然存在,仅是被覆盖

展开阅读全文

页面更新:2024-04-25

标签:下标   数组   原型   变量   局部   函数   属性   元素   对象   建议   程序   方法

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top