高程(第五章) 援用范例

1 Object范例

建立对象实例:

  • new操纵符后跟Object组织函数

ver person = new Object();
person.name = "Nicolas";
person.age = 29;
  • 对象字面量示意法

var person = {
    name : "Nicholas",
    age : 29
}

经由过程对象字面量定义对象时,实际上不会挪用Object组织函数

2 Array范例

建立数组:

  • 运用Array组织函数

var colors = new Array(20);    //new可以省略,20示意数组长度
  • 数组字面量示意法

var colors = ["red", "blue", "green"];

2.1 检测数组

  • 运用instanceof操纵符

console.log(value instanceof Array);    //只要一个全局作用域时运用

假如网页中包括多个框架,那实际上就存在两个以上差别的全局实行环境,从而存在两个以上差别版本的Array组织函数

  • 运用Array.isArray()要领

console.log(Array.isArray(value));    //肯定value是不是数值,不论它是在哪一个全局实行环境中建立的

2.2 转换要领

  • toLocaleString()

  • toString()

  • valueOf()

  • join()

var colors = ["red", "green", "blue"];
console.log(colors.join("||"));        //red||green||blue

2.3 栈要领

  • push():在数组末端增加项,返回数组长度

  • pop():移除数组末了一项,返回移除的项

2.3 行列要领

  • shift():移除数组第一项,返回移除的项

  • unshift():在数组前端增加项,返回数组长度

2.5 重排序要领

  • reverse():反转数组的递次

  • sort():依据升序分列数组项

sort()要领会挪用每一个数组项的toString()转型要领,然后比较获得的字符串
可吸收一个比较函数作为参数,比较函数吸收两个参数,假如第一个参数应当位于第二个之前则返回一个负数,假如两个参数相称则返回0,假如第一个参数应当位于第二个以后则返回一个正数;以下:

function compare(value1, value2){
    return value2 - value1;    //降序排序
}

2.6 操纵要领

  • concat():用于拼接数组

  • slice():用于猎取数组中的某几个项

  • splice():主要用处是向数组的中部插进去项

2.7 位置要领

  • indexOf():从数组的开首查找某一项

  • lastIndexOf():从数组的末端查找某一项

两个要领都返回要查找的项在数组中的索引,没找到的情况下返回-1

2.8 迭代要领

  • every():对数组中的每一项运转给定函数,假如该函数对每一项都返回true,则返回true。

  • filter():对数组中的每一项运转给定函数,返回该函数会返回true的项构成的数组。

  • forEach():对数组中的每一项运转给定函数,这个要领没有返回值。

  • map():对数组中的每一项运转给定函数,返回每次函数条用的效果构成的数组

  • some():对数组中的每一项运转给定函数,假如该函数对任一项返回true,则返回true。

以上要领都不会修正数组中的包括的值

2.9 合并要领

以下两个要领都邑迭代数组的一切项,然后构建一个终究返回的值。这两个要领都吸收两个参数:一个在每一项上挪用的函数和(可选的)作为合并基础的初始值。传入的函数吸收4个参数:前一个值、当前值、项的索引和数组对象。这个函数的返回值会作为参数自动传给下一项。

  • reduce():从数组第一项最先,逐一遍历到末了

  • reduceRight():从数组的末了一项最先,向前遍历到第一项

var values = [1,2,3,4,5];
var sum = values.reduce(function(prev, cur, index, array){
    return prev + cur;
});
alert(sum);     //15

reduceRight()除了遍历方向的差别以外,与reduce()要领完全一致。

5 Function 范例

函数是对象,因而函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。

function sum(num1, num2){        //会先举行函数声明提拔
    return num1 + num2;
}

var sum = function(num1, num2){        //不会举行函数声明提拔
    return num1 + num2;
}

var sum = new Function("num1", "num2", "return num1 + num2");    //不引荐,会致使剖析两次代码

5.3 作为值的函数

由于ECMAScript中的函数名自身就是变量,所以函数也可以作为值来运用。也就是说,不仅可以像通报参数一样把一个函数通报给另一个函数,也可以将一个函数作为另一个函数的效果返回。

function createComparisonFunction(propertyName){
    return function(object1, object2){
        var value1 = object1[propertyName];
        var value2 = object2[propertyName];
    }
    if(value1 < value2){
        return -1;
    }else if(value1 > value2){
        return 1;
    }else{
        return 0;
    };
}

var data = [{name : "Zachary", age : 28}, {name : "Nicholas", age : 29}];

data.sort(createComparisonFunction("name"));
console.log(data[0].name);        //Nicholas

data.sort(createComparisonFunction("age"));
console.log(data[0].name);        //Zachary

5.4 函数内部属性

在函数内部,有两个迥殊的对象:arguments和this

  • arguments有一个名叫callee的属性,该属性是一个指针,指向具有这个arguments对象的函数

function factorial(num){
    if(num <= 1){
        return 1;
    }else{
        return num * arguments.callee(num - 1);    //消除耦合
    }
}
  • 函数内部的另一个迥殊对象是this,this援用的是函数实行的环境对象——或许也可以说是this值(当在网页全局作用域中挪用函数时,this对象援用的就是window)

ECMAScript5也范例化了另一个函数对象的属性:caller。这个属性中保留着挪用当前函数的函数的援用,假如是在全局作用域中挪用当前函数,它的值为null。

function outer(){
    inner();
}

function inner(){
    console.log(arguments.callee.caller);    //为了完成更松懈的耦合
}

outer();

当函数在严厉情势下运转是,接见arguments.callee会致使毛病。ECMAScript 5 还定义了arguments.caller属性,但在严厉情势下接见它也会致使毛病,而在非严厉情势下这个属性一直是undefined。定义arguments.callee属性是为了分清arguments.caller和函数的caller属性。以上变化都是为了增强这门言语的安全性,如许第三方代码就不能在雷同的环境里窥视其他代码了。
严厉情势另有一个限定:不能为函数的caller属性赋值,否则会致使毛病。

5.5 函数属性和要领

每一个函数都包括两个属性:lengthprototype

  • length:示意函数愿望接收的定名参数的个数

  • prototype:关于ECMAScript中的援用范例而言,prototype是保留它们一切实例要领的真正地点

诸如toStr()和valueOf()等要领实际上都保留在prototype名下,只不过是经由过程各自对象的实例接见罢了。在ECMAScript 5 中,prototype属性是不可枚举的,因而运用for-in没法发明

每一个函数都包括两个非继续而来的要领:apply()call()。这两个要领的用处都是在特定的作用域中挪用函数,实际上即是设置函数体内this对象的值

  • apply():吸收两个参数,第一个是在个中运转函数的作用域,第二个是参数数组

  • call():与apply()作用雷同,变化在于通报给函数的参数必需逐一枚举出来

在不给函数通报参数的情况下,运用哪一个要领都无所谓

window.color = "red";
var o = {color : "blue"};

function sayColor(){
    console.log(this.color);
}

sayColor();                //red

sayColor.call(this);    //red
sayColor.call(window);    //red
sayColor.call(o);        //blue

运用call()(或apply())来扩大作用域的最大优点,就是对象不需要与要领有任何耦合关联

ECMAScript还定义了一个要领:bind()。这个要领会建立一个函数的实例,其this值会被绑定到传给bind()函数的值

window.color = "red";
var o = {color : "blue"};

function sayColor(){
    console.log(this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor();        //blue

每一个函数继续的toLocaleString()toString()valueOf()要领一直都返回函数的代码

6 基础包装范例

为了便于操纵基础范例值,ECMAScript还供应了3个迥殊的援用范例:Boolean、Number和String。这些范例与其他援用范例类似,但同时也具有与各自的基础范例响应的迥殊行动。实际上,每当读取一个基础范例值得时刻,背景就会建立一个对应的基础包装范例的对象,从而让我们可以挪用一些要领来操纵这些数据

var s1 = "some text";
var s2 = s1.substring(2);

举行以上操纵,背景会自动完成以下一系列处置惩罚:

  1. 建立String范例的一个实例;

  2. 在实例上挪用指定的要领;

  3. 烧毁这个实例。

可以将以上三个步骤设想成是实行了以下ECMAScript代码:

var s1 = new String("some text");
var s2 = s1.substring(2);
s1 = null;

除非必要时,否则不引荐显式地挪用Boolean、Number和String来建立基础包装范例的对象,由于这类做法很轻易让人分不清本身是在处置惩罚基础范例照样援用范例的值。对基础包装范例的实例挪用typeof会返回”object”,而且一切基础包装范例的对象在转换为布尔范例时价都是true

Object组织函数也会像工场要领一样,依据传入值的范例返回响应基础包装范例的实例:

var obj = new Object("some text");
console.log(obj instanceof String);        //true

运用new挪用基础包装范例的组织函数,与直接挪用同名的转型函数时不一样的:

var value = "25";
var number = Number(value);        //转型函数
console.log(typeof number);        //"number"

var obj = new Number(value);    //组织函数
console.log(typeof obj);        //"object"

6.1 Boolean范例

Boolean范例是与布尔值对应的援用范例

var booleanObject = new Boolean(true);

boolean范例的常见问题:

var falseObject = new Boolean(false);
var result = falseObject && true;
console.log(result);    //true

var falseValue = false;
result = falseValue && true;
console.log(result);    //false

console.log(typeof falseObject);        //object
console.log(typeof falseValue);            //boolean
console.log(falseObject instanceof Boolean);        //true
console.log(falseValue instanceof Boolean);        //false

6.2 Number 范例

Number范例是与数字值对应的援用范例

var numberobject = new Number(10);

可用toString()要领通报一个示意基数的参数,通知它返回几进制数值的字符串情势

除了继续的要领(valueOf()、toLocaleString()、toString())外,Number范例还供应了一些用于将数值花样化为字符串的要领:

  • toFixed():依据指定的小数位返回数值的字符串示意

  • toExponential():该要领返回以指数示意法(e示意法)示意的数值的字符串情势。toExponential()也吸收一个参数,指定输出效果中的小数位数

  • toPrecision():该要领能够会返回固顶大小(fixed)花样,也能够返回指数(exponential)花样;详细规则是看哪一种花样最合适。这个要领吸收一个参数,即示意数值的一切数字的位数(不包括指数部份)

6.3 String 范例

String范例是字符串的对象包装范例

var stringObject = new String("hello world");

String范例的每一个实例都有一个length属性,示意字符串中包括多个字符

var stringValue = "杰神 ,shuai /' ";
console.log(stringValue.length);    //12

纵然字符串中包括双字节字符(不是占一个字节的ASCII字符),每一个字符也依然算一个字符

7 单体内置对象

ECMA-262对内置对象的定义是:“由ECMAScript完成供应的、不依赖于宿主环境的对象,这些对象在ECMAScript顺序实行之前就已存在。”意义就是说,开发人员没必要显式地实例化内置对象,由于它们已实例化了。除了Object、Array和String等内置对象,ECMA-262还定义了两个单体内置对象:Global和Math

JavaScript原生对象及扩大

7.1 Global对象

Global(全局)对象可以说是ECMAScript中最迥殊的一个对象了,由于不论从什么角度上看,这个对象都是不存在的。不属于任何其他对象的属性和要领,终究都是它的属性和要领。诸如isNaN()isFinite()parseInt()以及parseFloat(),实际上都是Global对象的要领

Global对象还包括其他一些要领:

  • Global对象的encodeURI()encodeURIComponent()要领可以对URI(Uniform Resource Identifiers,通用资本标识符)举行编码,以便发送给浏览器

  • eval():该要领就像是一个完全的ECMAScript剖析器,它只接收一个参数,即要实行的ECMAScript(或JavaScript)字符串

eval("alert('hi')");
//上行代码的作用等价于下面这行代码
alert("hi");

迥殊的值undefined、NaN、以及Infinity都是Global对象的属性。另外,一切原生援用范例的组织函数,像Object和Function,也都是Global对象的属性。

ECMAScript 5 明白制止给undefined、NaN和Infinity赋值,如许做纵然在非严厉情势下也会致使毛病

7.1.4 window对象

ECMAScript虽然没有指出怎样接见Global对象,但Web浏览器都是将这个全局对象作为window对象的一部份加以完成的。因而,在全局作用域中声明的一切变量和函数,都成为了window对象的属性

JavaScript中的window对象除了饰演ECMAScript划定的Global对象的角色外,还负担了许多别的使命

另一种获得Global对象的要领是运用以下代码:

var global = function(){
    return this;
}();

7.2 Math对象

ECMAScript还为保留数学公式和信息供应了一个大众位置,即Math对象。与我们在JavaScript直接编写的盘算功用比拟,Math对象供应的盘算功用实行起来要快很多。Math对象中还供应了辅佐完成这些盘算的属性和要领

7.2.1 Math对象的属性

  • Math.PI:π的值

  • ……

7.2.2 min()和max()要领

min()和Max()要领用于肯定一组数值中的最小值和最大值。这两个要领都可以吸收恣意多个数值参数

7.2.3 舍入要领

  • Math.ceil()

  • Math.floor()

  • Math.round()

7.2.4 random()要领

random()要领返回大于即是0小于1的一个随机数。
套用下面的公式,就可以应用Math.random()从某个整数范围内随机挑选一个值

值 = Math.floor(Math.random()) * 能够值的总数 + 第一个能够的值

var num = Math.floor(Math.random() * 9 + 2);    //介于2到10之间的值
function selectFrom(lowerValue, upperValue){
    var choices = upperValue - lowerValue + 1;
    return Math.floor(Math.random() * choices + lowerValue);

    var num = selectFrom(2, 10);
    console.log(num);    //介于2到10之间的值
}


var colors = ["red", "green", "blue"];
var color = colors[selectFrom(0, colors.lenght-1)];
console.log(color);        //多是数组中包括的任何一个字符串
    原文作者:Cor
    原文地址: https://segmentfault.com/a/1190000009032804
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞