且听本人不断道来,引用类型不简单

一、介绍

  • 毋庸置疑,那是第4篇,到了引用类型,此次要分成三回博文了,太多内容了,那是前篇,篇幅非常长也多数代码,首要讲引用类型和常用的引用类型,代码试验过的,老铁没毛病。
  • 咬牙看持之以恒写,不易于不易于,希望大家能在那博客中学到东西。能和我们分享,不错不错。而且啊,作者想透过协调的认知,思虑来收获部分个人见解,以便能我们能便于精晓,书中那枯燥的文字。如若大家在看后有种认为说这厮写得没有错,那作者就满足了。嘿嘿嘿

不赘述了,进入正题…

一、介绍

  • 没有错,那是第4篇,到了引用类型,本次要分成两遍博文了,太多内容了,这是前篇,篇幅相当短也不在少数代码,首要讲引用类型和常用的引用类型,代码试验过的,老铁没毛病。
  • 坚定不移看坚韧不拔写,不便于不便于,希望大家能在这博客中学到东西。能和豪门享用,不错不错。而且啊,笔者想经过投机的认知,思虑来获得一些个人见解,以便能大家能便于驾驭,书中那枯燥的文字。如果大家在看后有种认为说这厮写得科学,那作者就满意了。嘿嘿嘿

不赘述了,进入正题…

严格情势


曾益

  • 排除js语法的片段不客观、不审慎、不安全难题,减弱离奇行为并保管代码运行安全
  • 增加编写翻译器功效,扩大运营速度

使用

  • 且听本人不断道来,引用类型不简单。大局使用严谨方式

      <script>
      "use strict";
      (function(){
          console.log("hello world!");
      })()
      </script>
    
  • 函数Nelly用严峻格局

      <script>
      (function(){
          "use strict";
          console.log("hello world!");
      })()
      </script>
    
  • 行业内部与严俊格局的区分

    • 隐式注脚或概念变量
    • 对象重名的质量
    • arguments.callee
    • with 语句
    • 其他。。。。

1、对象的概念及分类

2、引用类型

引用类型?假设有学过java一类的言语的,能够把它看成类,书中又说那种描述不纯粹。。。什么也别说了,我们把引用类型精通为对象定义

神蹟发掘语言这种事物,真的不可思议,说引用类型你也许不知底,小编说对象定义,就或者通晓了。

引用类型(对象定义):描述了一类对象所负有的质量和方法。
听作者促膝谈心:

澳门葡京 1

壹.引用类型(对象定义):
人类正是援引类型,它讲述了人类对象所共有的特性和办法。人的脾气比如,有眼睛,有头,手等;人的主意(能够说是行为):走路,吃饭等等。每一个引用类型唯有壹种概念,即它是集体性的指向。

二.引用类型的值:就是每多个new出来的对象(引用类型的实例),对象有那二个,就如大家亿万人民同样。同三个引用类型的对象们有协同的性质和办法,但大家得以动态添改属性,就好像各样人都有例外的地方。

三.js中放置的引用类型:object类型,Array类型,Function类型,Date类型,RegExp类型等等,当然大家也得以自定义引用类型。

看了图的成立对象,大家看看代码中创设对象:

//这里创建了一个对象叫obj,它是object类型的,那么它就有object类型共有的属性和方法
var obj = new Object();
//这里创建了一个对象叫arr,它是Array类型的,那么它就有Array类型共有的属性和方法
var arr = new Array();
//我们可以创建很多对象
var arr1 = new Array();
var arr2 = new Array();

深入浅出的讲:假若笔者说人类,在您的大脑中就有个概略的人的模型,对,笔者说数组,你大脑就有个数组的大概样子,可是你不知道它有血有肉的标准。具体的东西是目的本事展现出来的,比方本人说小明(假设您认知小明),那您就驾驭小明是个怎么着的人了。

到此处应该把引用类型通晓得差不离了,下边就说js中的内置的引用类型吧。

二、引用类型

引用类型?假使有学过java一类的言语的,能够把它看成类,书中又说那种描述不确切。。。什么也别说了,大家把引用类型精晓为对象定义

偶然发掘语言那种东西,真的出乎意料,说引用类型你恐怕不精通,作者说对象定义,就大概明白了。

引用类型(对象定义):描述了1类对象所兼有的品质和章程。
听自身谈心:

澳门葡京 2

一.引用类型(对象定义):
人类正是援引类型,它描述了人类对象所共有的性质和方法。人的习性比方,有眼睛,有头,手等;人的方法(能够说是表现):走路,吃饭等等。种种引用类型唯有1种概念,即它是集体性的指向。

二.引用类型的值:就是每叁个new出来的靶子(引用类型的实例),对象有多数,仿佛大家亿万人民一样。同二个引用类型的靶子们有联合的性质和方法,但大家得以动态添改属性,就如每种人都有差别的地方。

3.js中放到的引用类型:object类型,Array类型,Function类型,Date类型,RegExp类型等等,当然大家也能够自定义引用类型。

看了图的创立对象,大家看看代码中成立对象:

//这里创建了一个对象叫obj,它是object类型的,那么它就有object类型共有的属性和方法
var obj = new Object();
//这里创建了一个对象叫arr,它是Array类型的,那么它就有Array类型共有的属性和方法
var arr = new Array();
//我们可以创建很多对象
var arr1 = new Array();
var arr2 = new Array();

开首的讲:如若小编说人类,在你的大脑中就有个大概的人的模子,对,笔者说数组,你大脑就有个数组的光景样子,然而你不精通它现实的表率。具体的东西是目的才干显示出来的,比方本人说小明(假诺您认知小明),那你就精晓小明是个什么样的人了。

到此处应该把引用类型理解得大致了,上边就说js中的内置的引用类型吧。

类型系统


标准项目

前七种为原始类型, object为引用类型

  • undefined
  • null
  • boolean
  • string
  • number
  • object

品类系统

保存分裂

品种保存不一样

复制差距

品类复制分歧

类型表明
undefined 出现场景

  • 已扬言未赋值的变量
  • 获得对象不存在的品质
  • 无重临值的函数的施行结果
  • 函数的参数未有传到
  • void(express)

undefined类型转换
Boolean: Boolean(undefined) === false

Boolean Number String
undefined false NaN "undefined"

null出现的场景

  • null表示对象不存在

     document.getElementById('notExistElement')
    

null类型转换

Boolean Number String
null false 0 "null"

Number类型转换

Boolean String
0 false "0"
1 true "1"
Infinity true "Infinity"
NaN false "NaN"

类型识别

  • typeof
    识别标准项目(null除却),无法辨别具体的靶子类型(Function除此之外 )
  • Object.prototype.toString
    能够识别标准项目以及内置(build-in)对象类型,无法辨识自定义类型
  • constructor
    能够识别规范项目(undefined/null除却-未有构造器);识别内置对象;识别自定义类型
  • instanceof
    决断内置对象类型;不能够识别原始对象类型;推断自定义对象类型

Object.prototype.toString:能够辨认标准项目以及内置(build-in)对象类型,不能识别自定义类型

function type(obj){
    return Object.prototype.toString.call(obj).slice(8,-1).toLowerCase();
}

 type(1)  //number
 type('abc') //string
 type(true)  //boolean
 type(undefined) //undefined
 type(null)  // null
 type({})  //object
 type([])  // array
 type(new Date) //date
 type(/\d/) //regexp
 type(function(){})  //function

 function Point(x,y){
      this.x  = x;
      this.y = y;
 }
 type(new Point(1,2));  //object

constructor例子.能够辨别标准项目(undefined/null除却-未有构造器);识别内置对象;识别自定义类型

//判断原始类型
"jerry".constructor === String  // true
(1).constructor === Number //true
true.constructor === Boolean //true
({}).constructor === Object //true

//判断内置对象
[].constructor === Array //true

//判断自定义对象
function Person(name){
      this.name  = name;
 }
 new Person('jerry').constructor === Person //true

1.一 ECMAScript中一直不类,但定义了“对象”,逻辑上等价于其余程序设计语言中的类。

  var o = new Object();

三、Js内置的引用类型

怎么需求介绍js的放置引用类型,重倘诺大家用得多。大家就如从小去认知壹种东西同样,例如鱼类,一发轫我们不通晓那东西,后来阿娘老是跟我们说那是鱼啊珍宝,告诉您鱼是何等怎么样的,然后对这种类型有了基本认知。

在js的社会风气里大家没世上那么多的事物,内置的引用类型大家就先明白Object,Array,Date,RegExp,Function这多少个常用的。

叁、Js内置的引用类型

干什么须要介绍js的停放引用类型,首即使我们用得多。大家就如从小去认知1种东西同样,举例鱼类,一开头大家不了然那东西,后来老妈老是跟咱们说那是鱼啊宝贝,告诉您鱼是哪些怎样的,然后对那连串型有了焦点认知。

在js的社会风气里大家没世上那么多的事物,内置的引用类型大家就先明白Object,Array,Date,RegExp,Function这多少个常用的。

放手对象


布局对象

  • Object
  • Boolean
  • String
  • Number
  • Function
  • Array
  • RegExp
  • Date
  • Error

别的对象

  • Math
  • JSON
  • 全局对象

对象Object

构造器表明

  • object 是壹组属性和艺术的联谊
  • String/Number/Boolean/Array/Date/Error构造器都以Object子类对象,继承Object原型对象属性和方法。

实例化对象方法

  var obj = new Object({age:12,name:'lili'})
  var obj = {age:12,name:'lili'};

性情方法

  • prototype <u>create,keys….</u>

原型对象属性、方法

  • <u>coustructor, toString,valueOf,hasOwnProperty….</u>

原型对象

Object.create
听大人说原型对象创造新对象

语法
Object.create(proto[,propertisObject])

 var proto = {a:1,b:2};
 var obj = Object.create(proto);

__proto__

__proto__ 称之为原型链,有如下特征:

  • __proto__ 为对象内部的隐藏属性
  • __proto__为实例化该对象的构造器的 prototype
    对象的引用,因而得以平素格局 prototype 的有所属性和章程
  • 除开 Object 各个对象都有一个 __proto__
    属性且逐级升高产生二个链,原型链顶端是2个 Object 对象。
  • 在调用属性或措施时,引擎会查找自个儿的性质假使没有则会接二连三本着原型链逐级向上查找,直到找到该情势并调用。
  • __proto__
    跟浏览器引擎落成相关,不相同的引擎中名字和兑现不尽同样(chrome、firefox中名称是__proto__
    ,并且可以被访问到,IE中不大概访问)。基于代码包容性、可读性等地点的想念,不建议开垦者显式访问
    __proto__ 属性或通过
    __proto__更改原型链上的性质和章程,能够由此改动构造器prototype
    对象来改换对象的 __proto__ 属性。

Object.prototype.toString
得到方式调用者标准项目

obj.tostring()

Object.prototype.hasOwnproperty
认清3个属性是还是不是是对象自己性质

obj.hasOwnProperty(prop)

   var proto = {a:1,b:2};
   var obj = Object.create(proto);
   obj.c = 1
   obj.hasOwnProperty('c');  // true
   obj.hasOwnProperty('a');  // false - a是对象原型连上的属性

其他类别像布尔类型调换

  • 数字 0,NaN -> false
  • 字符串 “” -> false
  • undefined -> false
  • null -> false
  • <b>对象 -> true <b>

String.prototype.replace 查找字符串替换到目的字符
stringObj.replace(regexp/substr,replacement)

var str =  "1 plus 1 equal 3"
str = str.replace("1","2")  //str = "2 plus 1 equal 3"

str2.replace(/\d+/g, '$ & dollor')
//"2 dollor plus 1 dollor equal 3 dollor"

注:以上$ & 之间没有空格

**String.prototype.split **
stringObj.split(separator,howmany)

 var str = "1 plus 2 equal 3"
 str.split(" ") //["1","pluls","2","equal","3"]
 str.split(" ",3) //["1","pluls","2"]
 str.split(/\d+/);  //[""," plus "," equal ",""]

**Number.prototype.toFixed **
把Number4舍伍入为制定小数位数的数字

numberObj.toFixed(num)

Array

  • 构造器对象属性、方法 – prototype,isArray
    [用法:Array.isArray(obj)]
  • 原型对象属性、方法
    -constructor,<u>splice,forEach,find,concat,pop,push,reverse,shift,slice….</u>

Array.prototype.splice
从数组中删去或添比索素,重临被去除的因素列表(会改变原有的数组)

arrayObj.splice(start,deleteCount[,item1[,items….]])

Array.prototype.forEach
遍历数组成分并调用回调函数

arrayObj.forEach(callback[,thisArg])
function callback(value,index,arrayObj){…..}

function logArray(value,index,array){
    console.log(value)
    console.log(value === array[index])
}
//Note ellision,there is no member at 2, so it isn't visited
[2,5, ,9].forEach(logArray)
结果:2 true    5 true   9 true

Function
用以定义函数也许新对象构造器

实例化函数方法

  • 澳门葡京,对象实例化

  • 函数关键字语句
  • 函数表明式

原型对象属性、方法 – constructor,apply,call,bind
实例对象属性、方法 – length,prototype,arguments,caller

自定义对象构造器

//自定义构造器
function Point(x,y){
   this.x = x
   this.y = y
}
//自定义属性
Point.prototype.move = function(x,y){
    this.x += x
    this.y += y
 }
 //实例化
 var p = new Point(0,1)

Point自定义对象

Function.prototype.apply
由此参数内定函数调用者和函数参数并试行该函数

functionObj.apply(thisArg,[argsArray])

例1

Object.prototype.toString.apply("123") //[object String]

例2

//自定义构造器
 function Point(x,y){
   this.x = x
   this.y = y
}
//自定义属性
Point.prototype.move = function(x,y){
    this.x += x
    this.y += y
 }
 //实例化(原点)
 var p = new Point(0,0)  
 p.move(2,2) //移动到2,2点
 var circle = {x:1,y:1,r:1} //以原点为x=1,y=1,半径为1的圆
 //移动圆到3,2
 p.move.apply(circle,[2,1]);  //后面的参数为move所需参数.[x:3,y:2,r:1]

圆移动后

Function.prototype.bind
通过参数钦命函数调用者和函数参数并重回该函数引用

functionObj.bind(thisArg[,arg1[,arg2[,….]]])

 function Point(x,y){
   this.x = x
   this.y = y
}
Point.prototype.move = function(x,y){
    this.x += x
    this.y += y
 }
 var p = new Point(0,0)  
 p.move(2,2) 
 var circle = {x:1,y:1,r:1} 
 //实现过一段时间再移动圆,bind
 var circleMove = p.move.bind(circle,2,1) // 返回函数引用
 setTimeout(circleMove,1000)

子类构造器

 function Circle(x,y,r){
   Point.apply(this,[x,y])
   this.radius = r
 }
 /**
 Circle.prototype = new Point()
 delete Circle.prototype.x
 delete Circle.prototype.y
 **/
 简化如下:
 Circle.prototype = Object.create(Point.prototype)

 Circle.prototype.constructor = Circle
 Circle.prototype.area = function(){
    return Math.PI*this.radius*this*radius
 }
 var c = new Circle(1,2,3)
 c.move(2,2)
 c.area()

原型方法

代码实行完事后

函数调用

  • ()
  • apply, call

函数参数

  • 形参个数不必然等于实参个数
  • 值传递
  • 经过参数类型检查得以落成函数重载

函数重载

 define(function(){
 var add = function(x, y) {
   return x + y;
 };
 return {
     add: add
 };
})

define(['lib'], function(){
 var add = function(x, y) {
  return x + y;
 };
 return {
    add: add
 };
})

define('math', ['lib'], function(){
  var add = function(x, y) {
  return x + y;
 };
 return {
    add: add
 };
})

// define 的实现代码
 /**
 * The function that handles definitions of modules. Differs from
 * require() in that a string for the module should be the first argument,
 * and the function to execute after dependencies are loaded should
 * return a value to define the module corresponding to the first argument's
 * name.
*/
 define = function (name, deps, callback) {
   var node, context;

//Allow for anonymous modules
if (typeof name !== 'string') {
    //Adjust args appropriately
    callback = deps;
    deps = name;
    name = null;
}

//This module may not have dependencies
if (!isArray(deps)) {
    callback = deps;
    deps = null;
}

// 省略以下代码
// ...
};

正则表明式

  • 构造器表达:用于定义正则表明式,一个 RegExp
    对象涵盖八个正则表明式和涉及的声明

  • 定义方法

    • /pattern/flags
    • new RegExp(pattern[, flags]);
  • 品质及方式
    prototype

  • 原型对象属性及其方法

    • constructor
    • test
    • exec

** RegExp.prototype.test **
职能:使用正则表明式对字符串实行测试,并回到测试结果
regexObj.text(str)

    var reg = /^abc/i;reg.test('Abc123'); 
    truereg.test('1Abc1234'); // false

Date
构造器表达:用于定义日期对象

  • 定义方法

    var date0 = new Date();
    var date1 = new Date(2014, 3, 1, 7, 1, 1, 100);
    
  • 天性及措施

    • prototype
    • parse
    • now
  • 原型对象属性及其方法

    • constructor
    • Date
    • getDate
    • getHours
    • setDate
    • setHours

别的内置对象,Math,JSON,全局对象

Math rondom, floor,ceil,round,abs,max,cos
Json parse,stringify

全局对象
属性: NaN, Infinity, undefined
方法:parseInt, parseFloat, isNaN,isFinite, eval …
处理URL方法: encodeURIComponent, decodeURIComponent, encodeURI,
decodeURI
协会器属性:Boolean,String,Number,Object,Function,Array,Date,Error…..
对象属性:
Math,JSON

var url = "http://www.baidu.com/reg.html?name="+ encodeURIComponent(name)

NaN

  • 代表错误或无意义的运算结果
  • NaN参加运算再次来到如故是NaN
  • NaN不等以其余值,包蕴NaN本人
  • 能够用isNaN()判定运算结果是不是为NaN

eval 能够估测计算有些字符串,并施行在这之中的javascript代码。eval(string)

parseInt 将字符串转化为数字

Paste_Image.png

encodeU奇骏IComponent 将UENCOREI参数中的汉语、特殊字符等作为U凯雷德I1部分举办编码

行使比方:URAV四L中参数编码

encodedURIComponent举例

一.2 本地对象(native object)和宿主对象(host object)

  • 由ECMAScript定义的地面对象.独立于宿主境况的
    ECMAScript 落成提供的对象.(native object)
  • ECMAScript
    完成提供的、独立于宿主意况的具有目的,在 ECMAScript
    程序开端实行时出现.那意味着开荒者不必明显实例化内置对象,它已被实例化了。ECMA-二陆十一头定义了多个放置对象,即 Global 和 Math
    (它们也是本地对象,根据定义,每一个内置对象都以地方对象)。(built-in
    object)
  • 具有非当地对象都以宿主对象(host
    object),即由 ECMAScript 落成的宿主情况提供的对象。全数 BOM 和 DOM
    对象都以宿主对象。

1.Object类型

Object
类型是选用得最多得类型,虽然Object得实例不具有多少效率,但对于应用程序存款和储蓄和传输数据来说,是好的精选。

1.Object类型

Object
类型是行使得最多得类型,就算Object得实例不有所多少功用,但对此应用程序存款和储蓄和传输数据来讲,是好的选项。

表达式


概念: js短语,解释器能够实践它并生成一个值

提到运算符

=== 类型与值都等于

==判别两边对象或值是或不是等于

以下都为true

  • “99” == 99
  • new String(“99”) == 99
  • true == 1
  • false == “0”
  • ‘\n\n\n’ == false

非数值类型做==相比时,先转移为数值类型

==例外规则

  • null == undefined //true
  • null或undefined参加举办==运算时不开始展览隐式类型转变
    • 0 == null //false
    • null == false //false
    • “undefined” == undefined //false

逻辑运算 !

  • !表示 运营结果调换为boolean值后取反
  • !!表示去表达式的周转结果的boolean值

逻辑运算 &&

  • X && Y 并且。借使X
    假如为false,怎终止Y的演算,重返false。如果X为true,则一连运维Y,重返Y的boolean值。

逻辑运算 ||

var a = 0
var b = 0 || ++a
结果:a,b 为1,1

运算符优先级

Paste_Image.png

1.3 object 对象

ECMAScript
中的全数目的都由这几个目的承继而来;Object
对象中的全体属性和措施都会产出在别的对象中

1 ToString() :  返回对象的原始字符串表示。
2 ValueOf()  : 返回最适合该对象的原始值。对于许多对象,该方法返回的值都与 ToString() 的返回值相同。

1.1创建Object对象:

先落地了再说,创造Obeject的靶子的2种艺术:
1.直接new。
语法:new操作符跟Obeject构造函数

//new操作符后面加Obejct的构造函数
var o = new Obeject();
//添加属性
o.name = "yuan";

二.对象字面量
语法:花括号,里面包车型客车属性用键值对格局,每种属性用逗号隔绝,最终七个属性不用逗号。

//对象字面量(有种封装数据的感觉)
var p = {
    data:13,
    name:'yuan',
    age:11
}
//两者对比
var x = {};  //创建一个空对象和new Object() 相同

1.1创建Object对象:

先落地了再说,创制Obeject的靶子的二种艺术:
1.直接new。
语法:new操作符跟Obeject构造函数

//new操作符后面加Obejct的构造函数
var o = new Obeject();
//添加属性
o.name = "yuan";

贰.对象字面量
语法:花括号,里面包车型大巴性质用键值对形式,各个属性用逗号隔离,最后一个属性不用逗号。

//对象字面量(有种封装数据的感觉)
var p = {
    data:13,
    name:'yuan',
    age:11
}
//两者对比
var x = {};  //创建一个空对象和new Object() 相同

语句


  • 基准决定语句 if else; swith case ( case中的判定是=== )
  • 循环调控语句 for/in; for; while … do while…
  • 丰裕管理语句 try/catch/finally throw
  • with语句 with(){….}

for/in

遍历对象的特性

for(key in objS ){…}

with

  • 用以收缩钦命情状下必须写的代码量
  • 权且改换变了的机能域链,将with语句中的对象增多到功效域链的头顶
  • 缺点: with语句恐怕引致实施质量下降,应该尽可能的避免使用

with

一.四 内置对象(1一种)

  Array
,String , Date, Math, Boolean, Number  **
Function, Global, Error, RegExp ,
Object**

  在JavaScript中除去null和undefined以外其余的数据类型都被定义成了对象,也能够用创造对象的办法定义变量,String、Math、Array、Date、RegExp都以JavaScript中首要的松手对象,在JavaScript程序大许多作用都是经过对象落成的

 1 <script language="javascript">
 2 var aa=Number.MAX_VALUE; 
 3 //利用数字对象获取可表示最大数
 4 var bb=new String("hello JavaScript"); 
 5 //创建字符串对象
 6 var cc=new Date();
 7 //创建日期对象
 8 var dd=new Array("星期一","星期二","星期三","星期四"); 
 9 //数组对象
10 </script>

澳门葡京 3

壹.二拜访属性

一.因此点表示法

var p = new Object();
p.name = '渊源远愿';
console.log(p.name);  //渊源远愿

二.经过方括号法

var o = new Object();
o.age = 22;
console.log(o["age"]);  //22
//方括号可以用变量来访问属性
var otherAge = "age";
console.log(o[otherAge]);  //22

一般来说来说都是用点主意比较多的。

一.2访问属性

一.因而点表示法

var p = new Object();
p.name = '渊源远愿';
console.log(p.name);  //渊源远愿

二.经过方括号法

var o = new Object();
o.age = 22;
console.log(o["age"]);  //22
//方括号可以用变量来访问属性
var otherAge = "age";
console.log(o[otherAge]);  //22

平时来讲都以用点措施相比多的。

变量作用域


  • 生命周期
  • 成效范围

静态功用域 在编写翻译阶段就精晓变量的引用

  • 又叫做 词法效率域
  • 有程序定义的岗位决定

Paste_Image.png

传闻foo函数找到全局的X

动态功用域 由动态栈来决定

  • 程序运营时刻决定

x为20

JS变量功用域


  • js 使用静态成效域
  • js 未有块级作用域
  • ES5中运用词法蒙受管理静态功效域

词法蒙受

组成

  • 条件记录(形参,变量,函数等)
  • 对表面词法境况的引用(outer),最外层的词法情状是none

什么样时候创立词法景况?

  • 壹段代码起首实施前,先初阶化词法境遇。
    • 形参
    • 函数定义
    • 变量定义

词法情况-难题

  • 形参、函数定义、变量定义名称争辩
  • arguments
  • 函数表明式

JS 成效域-带名称的函数表明式

   (function A() {
         A = 1;
         alert(A);
    })();

率先看,那段代码,在大局的词法意况中,未有函数定义,没有变量定义,也并未形参。A是三个函数表明式,不是3个函数定义。所以不会被定义到全局的词法情况中。

那儿,会把A单独定义3个词法情形。
里面包车型客车record是A函数,A函数内部是无法被修改的。所以,A=一是没用的。此时alert(A)
弹出的要么A函数。

Paste_Image.png

二、 内置对象介绍

一.3 Object的质量和办法:

不赘述了:看看同系列的第二篇吧

壹.3 Object的习性和章程:

不赘述了:看望同种类的第一篇吧

闭包

  • 闭包有函数和与其有关的引用情况的组合而成
  • 闭包允许函数访问其引用境况中的变量(又称自由变量)
  • 广义上来说,全体JS的函数都得以叫做闭包,因为JS函数在开创事保存了现阶段的词法蒙受。

闭包的施用

  • 保存变量现场
  • 封装

保留变量现场 示例:

封存变量

包裹示例:

封装

2.1 String对象

2.Array类型

2.Array类型

程序设计艺术


  • 面向进度

    • 以进程为核心
    • 自顶向下——稳步细化
  • 面向对象

    • 对象作为程序的主导单元
    • 先后分解为数量和血脉相通操作

二.壹.壹 创设情势(二种)

机动创造字符串对象:

1 var str1="hello world";
2 alert(str1.length);
3 alert(str1.substr(1,5));

调用字符串的目标属性或艺术时自动创立对象,用完就撇下

手工业创制字符串对象

1 var str1= new String("hello word");
2 alert(str1.length);
3 alert(str1.substr(1,3));

选择new创造字符串对象str一,全局有效

二.一 创制数组

二种方法:
1.new Array();

//创建一个空数组
var arr1 = new Array();
//创建一个长度为10的空数组,
var arr2 = new Array(10);
//创建一个包含一个字符串good的数组
var arr3 = new Array("good");

专程表明:当传进去括号中的只有贰个值,这么些值是数值的话,就会创建长度为那些数值的数组;假设是其它值,那正是含有二个以此值的数组。

二.数组字面量,使用方括号:

// 创建空的
 var fish = [];
 //创建有值的,在括号里添加
 var cars = ["BMW","BenZ","Ferrari"];
 //注意,创建数组不要留空项。浏览器兼容性问题,IE8或以前版本会认为这是有3项,下面这种不建议。
 var nums = [1,2,];

2.一 创立数组

二种方法:
1.new Array();

//创建一个空数组
var arr1 = new Array();
//创建一个长度为10的空数组,
var arr2 = new Array(10);
//创建一个包含一个字符串good的数组
var arr3 = new Array("good");

特意表明:当传进去括号中的只有2个值,这几个值是数值的话,就会成立长度为那个数值的数组;假使是别的值,那就是含有3个这么些值的数组。

二.数组字面量,使用方括号:

// 创建空的
 var fish = [];
 //创建有值的,在括号里添加
 var cars = ["BMW","BenZ","Ferrari"];
 //注意,创建数组不要留空项。浏览器兼容性问题,IE8或以前版本会认为这是有3项,下面这种不建议。
 var nums = [1,2,];

JS面向对象

  • construtor
  • this
  • 原型承袭
  • 原型链
  • 应用

Constructor 成立构造器的二种方式

  • function Employee(){…} //函数定义
  • var Emloayee = function(){…} //函数表明式
  • var Emloayee = new Function(); //new Function

this

Paste_Image.png

构造器中的this 表示 将在创制的新目的。
JS 中,函数的this指向函数的调用者。在该例子中,构造器中的函数里面包车型的士
this意味着的是p一,函数的调用者

New Function中的this,指的是,全局对象(window)

new Function

eval中的this,指调用上下文中的this

eval中的this

首先个闭包中的 eval上下文是全局,所以,this指向全局对象global ,window

第三个eval中的this调用上下文是在bar函数中的,所以 eval 中的this 与
bar函数中的this同样,bar函数的this指的是其调用者也正是Foo对象。

总节

this.png

2.一.2 String对象的属性

1 获取字符串长度
2 length

var str1=”String对象”;

var str2=””;

alert(“str1长度 “+str1.length);

alert(“str2长度 “+str2.length);

二.贰 访问数组中的值

和任何语言同样下标访问(下标从0伊始):

//创建数组
var cars = ["BMW","BenZ","Ferrari"];
console.log(cars[0]);  //BMW
console.log(cars[2]);  //Ferrari

//修改数组某个值,对其重新赋值就像
cars[0]  = "lala";

二.2 访问数组中的值

和此外语言一样下标访问(下标从0初步):

//创建数组
var cars = ["BMW","BenZ","Ferrari"];
console.log(cars[0]);  //BMW
console.log(cars[2]);  //Ferrari

//修改数组某个值,对其重新赋值就像
cars[0]  = "lala";

原型

原型链

  • 品质查找
  • 属性修改
  • 品质删除

原型链-属性查找

属性查找&修改

 tom.name = 'Tom Green' ; //首先查找自身属性,找到name 然后修改
 tom.job = 'assistant'; //自身找不到job属性,然后找原型链有job属性,然后给自身添加job属性,属性值为assistant,并不修改原型的job属性。
 teacher.prototype.job = 'assistant' //修改原型的job属性。那么访问:bill.job 得到的是 assistant.

原型链-属性删除

delete tom.job //只是删除tom上的job属性,如果在访问,则去原型上找job属性,并不会删除原型上的属性。

沉凝:借使剖断一个属性来自于对象自己?

  //hasOwnProperty 判断是否来自对象本身。
  tom.hasOwnProperty('job')

ES5中的原型承继

Object.create(proto[,propertiesObject])

create

心想:怎么样在低版本浏览器达成Object.create效率?

URL

二.1.三 String对象的法子

澳门葡京 4

澳门葡京 5

澳门葡京 6

澳门葡京 7

String对象的法门(壹) ——
格式编排方式

格式编排形式重返值列表

澳门葡京 8澳门葡京 9

1 书写格式:
2 
3 String对象提供了一组针对HTML格式的方法,如x.anchor()返回锚定义字符串<a>x</a>,
4 x.bold()返回粗体表示字符串<b>x</b>,x.sup()返回上标格式字符串<sup>x</sup>。
5 -----------------------------------------
6 
7 var x="hello";
8 var y="x.italics():"+x.italics();
9 document.write(y.fontsize(10));//<font size="10">x.italics():<i>hello</i></font>

View
Code

String对象的点子(贰)——
 大小写转换

澳门葡京 10澳门葡京 11

1 var str1="AbcdEfgh"; 
2 
3 var str2=str1.toLowerCase();
4 var str3=str1.toUpperCase();
5 alert(str2);
6 //结果为"abcdefgh"
7 alert(str3);
8 //结果为"ABCDEFGH"

View
Code

String对象的不二等秘书籍(3) ——
获取钦命字符

澳门葡京 12澳门葡京 13

 1 书写格式
 2 
 3 x.charAt(index)
 4 
 5 x.charCodeAt(index)
 6 
 7 使用注解
 8 
 9 x代表字符串对象
10 index代表字符位置
11 index从0开始编号
12 charAt返回index位置的字符
13 charCodeAt返回index位置的Unicode编码
14 ----------------------
15 var str1="welcome to the world of JS! 苑昊";
16 
17 var str2=str1.charAt(28);
18 var str3=str1.charCodeAt(28);
19 alert(str2);
20 //结果为"苑"
21 alert(str3);
22 //结果为33489

View
Code

String对象的点子(四)——  查询字符串

澳门葡京 14澳门葡京 15

 1 //书写格式
 2 //
 3 //x.indexOf(findstr,index)
 4 //x.lastIndexOf(findstr)
 5 //-------------------------------------
 6 var str1="welcome to the world of JS!";
 7 
 8 var str2=str1.indexOf("l");
 9 var str3=str1.lastIndexOf("l");
10 alert(str2);
11 //结果为2
12 alert(str3);
13 //结果为18
14 
15 //-------*********************************************************-------
16 
17 //书写格式
18 //
19 //x.match(regexp)
20 //
21 //x.search(regexp)
22 //
23 //使用注解
24 //
25 //x代表字符串对象
26 //
27 //regexp代表正则表达式或字符串
28 //
29 //match返回匹配字符串的数组,如果没有匹配则返回null
30 //
31 //search返回匹配字符串的首字符位置索引
32 //-------------------------------------
33 var str1="welcome to the world of JS!";
34 
35 var str2=str1.match("world");
36 var str3=str1.search("world");
37 alert(str2[0]);
38 //结果为"world"
39 alert(str3);
40 //结果为15

View
Code

String对象的艺术(伍)
——子字符串管理

截取子字符串

澳门葡京 16澳门葡京 17

 1 //截取子字符串
 2 //
 3 //书写格式
 4 //
 5 //x.substr(start, length)
 6 //
 7 //x.substring(start, end)
 8 //
 9 //使用注解
10 //
11 //x代表字符串对象
12 //
13 //start表示开始位置
14 //
15 //length表示截取长度
16 //
17 //end是结束位置加1
18 //
19 //第一个字符位置为0
20 
21 
22 var str1="abcdefgh";
23 var str2=str1.substr(2,4);
24 var str3=str1.substring(2,4);
25 alert(str2);
26 //结果为"cdef"
27 alert(str3);
28 //结果为"cd"
29 
30 //-------*********************************************************-------
31 //x.slice(start, end)
32 
33 
34 var str1="abcdefgh";
35 var str2=str1.slice(2,4);
36 var str3=str1.slice(4);
37 var str4=str1.slice(2,-1);
38 var str5=str1.slice(-3,-1);
39 alert(str2);
40 //结果为"cd"
41 alert(str3);
42 //结果为"efgh"
43 alert(str4);
44 //结果为"cdefg"
45 alert(str5);
46 //结果为"fg"

View
Code

轮换子字符串

澳门葡京 18澳门葡京 19

1 //x.replace(findstr,tostr)
2 
3 var str1="abcdefgh";
4 var str2=str1.replace("cd","aaa");
5 alert(str2);
6 //结果为"abaaaefgh"

View
Code

分割字符串

澳门葡京 20澳门葡京 21

1 var str1="一,二,三,四,五,六,日"; 
2 
3 var strArray=str1.split(",");
4 
5 alert(strArray[1]);
6 //结果为"二"

View
Code

接二连3字符串

澳门葡京 22澳门葡京 23

 1 //y=x.concat(addstr)
 2 //
 3 //使用注解
 4 //
 5 //x代表字符串对象
 6 //addstr为添加字符串
 7 //返回x+addstr字符串
 8     
 9 var str1="abcd"; 
10 var str2=str1.concat("efgh");
11 
12 alert(str2);
13 //结果为"abcdefgh"

View
Code

二.叁 常用属性和措施

那边给出常用的习性和办法,更详尽的在js的文书档案里面有。

一.length属性:重回数组的长度。

var num = [1,2,3,4,5]
console.log(num.length);  //5
//妙用:通过改变数组的length可以改变数组长度
num.length = 10;  //现在num 数组长度为10了
console.log(num); //[1,2,3,4,5,,,,,]  后面5个值是空的

2.Array.isArray()方法:推断目的是否数组

//用了判断改对象是不是数组
var arr = [];
console.log(Array.isArray(arr));   //true
console.log(Array.isArray("s");    //false

叁.join()方法:改动数组分隔格局,重返新的相间符字符串

//原来是使用逗号连接的
var arr = [1,2,3,4,5];
//用|连接,注意只是返回字符串,不会改变数组里面的连接方式
console.log((arr.join("|"));  //'1|2|3|4|5'
console.log(arr);  //[1,2,3,4,5]  还是一样用逗号的

四.栈措施:pop()和push()组合使用达成栈的先进后出

//引入这两方法是为了用数组实现栈的功能
//push() :从数组最后添加数据
var stack = new Array();
//添加一个10
stack.push(10);
//添加一个5
stack.push(5);
//添加一个100
stack.push(100);
//现在stack中有3个数值
console.log(stack);   //[10,5,100]

//pop() :从数组最后删除并返回该数据
stack.pop();  //100  100被删除
console.log(stack);   //[10,5]  剩下两数

5.队列方法:shift()和push()组合使用达成先进先出

那里就不再比方了,类似与栈的操作,只是操作的函数不相同,栈的pop是在此之前边删除,而队列的shift是在此以前边删除,那样就先进先出了。

陆.重排序方法:sort()和reverse()

//sort()默认是按照ascii码表排序的,所以会出现下面这种情况
var arr = [5,12,18,1];
console.log(arr.sort());  //[1,12,18,5]
//为了可以对数字正常排序,为sort传入一个比较函数
function comp(a,b){
    return a-b;
}
//再来排序
arr.sort(comp);
console.log(arr);  //[1,5,12,18]  这次正确了

//reverse()是将数组完全颠倒
arr.reverse();
console.log(arr);  //[18,12,5,1]

七.合并和撤销合并:concat() , slice()

//1.concat() 在该数组的基础上添加元素,返回一个新数组(不会改变原数组)
var arr1 = [1,2,3];
//在arr1基础添加4,5,6,并返回给arr2,不会改变arr
var arr2 = arr1.concat(4,5,6);
console.log(arr2);  //[1,2,3,4,5,6]

//2.slice() 通过传入开始和终点值来剪切数组,并返回新数组
var  arr3  = arr2.slice(1,5);
console.log(arr3);  //[2,3,4,5]

八.最强劲的数组方法:splice()
删除:接受四个参数,第二个是始于删除地方,第二个是删除的个数,重返三个刨除项的数组

//用来删除
var arr = [1,2,3,4,5,6,7];
var del_arr = arr.splice(0,4);  //从0位开始删除4项,即前4项
console.log(del_arr);  //[1,2,3,4]
console.log(arr);  //[5,6,7]  arr数组剩下后面3项了

插入:输入三个参数,开首地点,0(删除项数设为0),要插入的值

//用来插入
var arr1 = [1,2,3,4,5,6];
arr1.splice(3,0,100);//从位置3插入一个100值
console.log(arr1);  //[1,2,3,100,4,5,6];

替换:钦点一个参数,起头位置,要去除的项,插入的值

//替换
var arr2 = [1,2,3,4,5];
//我要替换3,替换成100
arr2.splice(2,1,100);  //起始位是2,删除1项(就是3了),载插入100,ok
console.log(arr2); //[1,2,100,4,5]

九.职位函数:indexOf()和lastIndexOf():那三个点子用来找数值下标地点。都领受七个参数,第三个是要找的值,第一个是从头地方

//indexOf() 只传一个参数时默认从0开始找数值,找到返回这个数的数组位置,没有返回-1
var arr = [100,12,123,1234];
console.log(arr.indexOf(123));  //2  数组的位置2

//lastIndexOf()  和indexOf查找顺序正好相反,它从数组末尾开始找起
console.log(arr.lastIndexOf(100));  //0

拾.forEach()方法,对每1项举办拍卖

//接受一个函数,函数传入2个参数表示当前数值和其下标位置
var arr = [1,2,3,4,5];
arr.forEach(function(item, index){
    console.log(item + 1);
}

//输出 2,3,4,5,6  每一项都加1了

贰.三 常用属性和措施

此处给出常用的质量和办法,更详尽的在js的文书档案里面有。

一.length属性:再次回到数组的长短。

var num = [1,2,3,4,5]
console.log(num.length);  //5
//妙用:通过改变数组的length可以改变数组长度
num.length = 10;  //现在num 数组长度为10了
console.log(num); //[1,2,3,4,5,,,,,]  后面5个值是空的

2.Array.isArray()方法:判别目的是否数组

//用了判断改对象是不是数组
var arr = [];
console.log(Array.isArray(arr));   //true
console.log(Array.isArray("s");    //false

3.join()方法:改换数组分隔格局,重临新的相间符字符串

//原来是使用逗号连接的
var arr = [1,2,3,4,5];
//用|连接,注意只是返回字符串,不会改变数组里面的连接方式
console.log((arr.join("|"));  //'1|2|3|4|5'
console.log(arr);  //[1,2,3,4,5]  还是一样用逗号的

肆.栈措施:pop()和push()组合使用达成栈的先进后出

//引入这两方法是为了用数组实现栈的功能
//push() :从数组最后添加数据
var stack = new Array();
//添加一个10
stack.push(10);
//添加一个5
stack.push(5);
//添加一个100
stack.push(100);
//现在stack中有3个数值
console.log(stack);   //[10,5,100]

//pop() :从数组最后删除并返回该数据
stack.pop();  //100  100被删除
console.log(stack);   //[10,5]  剩下两数

伍.队列方法:shift()和push()组合使用落成先进先出

此处就不再举个例子了,类似与栈的操作,只是操作的函数差异,栈的pop是在此之前面删除,而队列的shift是从后边删除,这样就先进先出了。

6.重排序方法:sort()和reverse()

//sort()默认是按照ascii码表排序的,所以会出现下面这种情况
var arr = [5,12,18,1];
console.log(arr.sort());  //[1,12,18,5]
//为了可以对数字正常排序,为sort传入一个比较函数
function comp(a,b){
    return a-b;
}
//再来排序
arr.sort(comp);
console.log(arr);  //[1,5,12,18]  这次正确了

//reverse()是将数组完全颠倒
arr.reverse();
console.log(arr);  //[18,12,5,1]

柒.联结和细分:concat() , slice()

//1.concat() 在该数组的基础上添加元素,返回一个新数组(不会改变原数组)
var arr1 = [1,2,3];
//在arr1基础添加4,5,6,并返回给arr2,不会改变arr
var arr2 = arr1.concat(4,5,6);
console.log(arr2);  //[1,2,3,4,5,6]

//2.slice() 通过传入开始和终点值来剪切数组,并返回新数组
var  arr3  = arr2.slice(1,5);
console.log(arr3);  //[2,3,4,5]

八.最强劲的数组方法:splice()
删除:接受三个参数,第三个是开首删除地方,第3个是去除的个数,重临一个刨除项的数组

//用来删除
var arr = [1,2,3,4,5,6,7];
var del_arr = arr.splice(0,4);  //从0位开始删除4项,即前4项
console.log(del_arr);  //[1,2,3,4]
console.log(arr);  //[5,6,7]  arr数组剩下后面3项了

插入:输入三个参数,初阶地方,0(删除项数设为0),要插入的值

//用来插入
var arr1 = [1,2,3,4,5,6];
arr1.splice(3,0,100);//从位置3插入一个100值
console.log(arr1);  //[1,2,3,100,4,5,6];

替换:钦赐三个参数,先河地点,要删减的项,插入的值

//替换
var arr2 = [1,2,3,4,5];
//我要替换3,替换成100
arr2.splice(2,1,100);  //起始位是2,删除1项(就是3了),载插入100,ok
console.log(arr2); //[1,2,100,4,5]

玖.职责函数:indexOf()和lastIndexOf():那四个法子用来找数值下标地点。都承受多个参数,第贰个是要找的值,第贰个是早先地点

//indexOf() 只传一个参数时默认从0开始找数值,找到返回这个数的数组位置,没有返回-1
var arr = [100,12,123,1234];
console.log(arr.indexOf(123));  //2  数组的位置2

//lastIndexOf()  和indexOf查找顺序正好相反,它从数组末尾开始找起
console.log(arr.lastIndexOf(100));  //0

10.forEach()方法,对每1项进行拍卖

//接受一个函数,函数传入2个参数表示当前数值和其下标位置
var arr = [1,2,3,4,5];
arr.forEach(function(item, index){
    console.log(item + 1);
}

//输出 2,3,4,5,6  每一项都加1了

JS面向对象编制程序


全局变量

  • var test = ‘some’
  • window.test = ‘some’
  • (function(){ var a;
    test = ‘some’ // 后面没写var 被定义到全局
    } )()

卷入难题——音信隐藏

function A(){
  this.a = null;
  this.b = null;

this.step1 = function(){
    //TODO
}
this.step2 = function(){
    //TODO
}
this.api = function(){
    //TODO
}
}

走访都以国有的

打包模式

封装

类继承

类继承

ClassA是父类,ClassB是子类

原型链

原型承袭

继承

左边的clone 是合作低版本浏览器不扶助ES伍的create


未完待续


2.2 Array 对象

3.Date类型

3.Date类型

始建数组对象

澳门葡京 24澳门葡京 25

 1 Array 对象用于在单个的变量中存储多个值。
 2 语法:
 3 
 4 创建方式1:
 5 var a=[1,2,3];
 6 
 7 创建方式2:
 8 new Array();     //  创建数组时允许指定元素个数也可以不指定元素个数。
 9 new Array(size);//if 1个参数且为数字,即代表size,not content
10     初始化数组对象:
11     var cnweek=new Array(7);
12         cnweek[0]="星期日";
13         cnweek[1]="星期一";
14         ...
15         cnweek[6]="星期六";
16 
17 new Array(element0, element1, ..., elementn)//也可以直接在建立对象时初始化数组元素,元素类型允许不同
18 
19 var test=new Array(100,"a",true);

View
Code

三.一 创设对象

//创建一个时间对象,保存着当前时间
var n = new Date();   

三.一 创造对象

//创建一个时间对象,保存着当前时间
var n = new Date();   

创立二维数组

澳门葡京 26澳门葡京 27

 1 var cnweek=new Array(7);
 2 for (var i=0;i<=6;i++){
 3     cnweek[i]=new Array(2);
 4 }
 5 cnweek[0][0]="星期日";
 6 cnweek[0][1]="Sunday";
 7 cnweek[1][0]="星期一";
 8 cnweek[1][1]="Monday";
 9 ...
10 cnweek[6][0]="星期六";
11 cnweek[6][1]="Saturday";

View
Code

三.二 常用艺术

var now = new Date();
//getDate() 返回当前天数,一个月的某天(0-31)
console.log(now.getDate());  //20
//getMonth()  //返回月份
console.log(now.getMonth());  //9,这里的9表示10月 (0-11)
//getFullYear(),返回当前年份
console.log(now.getFullYear());  //2017

越来越多措施在js文书档案中。

3.2 常用艺术

var now = new Date();
//getDate() 返回当前天数,一个月的某天(0-31)
console.log(now.getDate());  //20
//getMonth()  //返回月份
console.log(now.getMonth());  //9,这里的9表示10月 (0-11)
//getFullYear(),返回当前年份
console.log(now.getFullYear());  //2017

越多措施在js文书档案中。

Array对象的品质

获得数组成分的个数:length

澳门葡京 28澳门葡京 29

 1 var cnweek=new Array(7);
 2 cnweek[0]="星期日";
 3 cnweek[1]="星期一";
 4 cnweek[2]="星期二";
 5 cnweek[3]="星期三";
 6 cnweek[4]="星期四";
 7 cnweek[5]="星期五";
 8 cnweek[6]="星期六";
 9 for (var i=0;i<cnweek.length;i++){
10   document.write(cnweek[i]+" | ");
11 }

View
Code

4.RegExg类型

ES通过RegExg类型来帮衬正则表达式,语法:var e = /pattern/flag
个中pattern表示正则表明式,flag表示标志,标记能够二个或四个。

flags有二个,这么些flags能够结合使用

flags 说明
g 全局模式,该模式应用于所有的字符串
i 不区分大小写模式,确定匹配项时忽略模式与字符串的大小写
m 多行模式,一行文本到尾后还会查下一行的字符串,如果有的话

4.RegExg类型

ES通过RegExg类型来支撑正则表明式,语法:var e = /pattern/flag
里头pattern表示正则说明式,flag表示标记,标记能够3个或八个。

flags有3个,这个flags能够组合使用

flags 说明
g 全局模式,该模式应用于所有的字符串
i 不区分大小写模式,确定匹配项时忽略模式与字符串的大小写
m 多行模式,一行文本到尾后还会查下一行的字符串,如果有的话

Array对象的主意

澳门葡京 30澳门葡京 31

两次三番数组-join方法

澳门葡京 32澳门葡京 33

 1 //书写格式
 2 //x.join(bystr)
 3 //使用注解
 4 //
 5 //x代表数组对象
 6 //bystr作为连接数组中元素的字符串
 7 //返回连接后的字符串
 8 //与字符串的split功能刚好相反
 9     
10 var arr1=[1, 2, 3, 4, 5, 6, 7];
11 
12 var str1=arr1.join("-");
13 
14 alert(str1);
15 //结果为"1-2-3-4-5-6-7"

View
Code

连接数组-concat方法

澳门葡京 34澳门葡京 35

 1 //连接数组-concat方法
 2 //
 3 //x.concat(value,...)
 4 
 5 
 6 var a = [1,2,3];
 7 var a = new Array(1,2,3);
 8 var b=a.concat(4,5) ;
 9 
10 
11 alert(a.toString());
12 //返回结果为1,2,3
13 alert(b.toString());
14 //返回结果为1,2,3,4,5

View
Code

数组排序-reverse
sort

澳门葡京 36澳门葡京 37

 1 //x.reverse()
 2 //x.sort()
 3 
 4 var arr1=[32, 12, 111, 444];
 5 //var arr1=["a","d","f","c"];
 6 
 7 arr1.reverse(); //颠倒数组元素
 8 alert(arr1.toString());
 9 //结果为444,111,12,32
10 
11 arr1.sort();    //排序数组元素
12 alert(arr1.toString());
13 //结果为111,12,32,444
14 
15 //------------------------------
16 arr=[1,5,2,100];
17 
18 //arr.sort();
19 //alert(arr);
20 //如果就想按着数字比较呢?
21 
22 function intSort(a,b){
23     if (a>b){
24         return 1;//-1
25     }
26     else if(a<b){
27         return -1;//1
28     }
29     else {
30         return 0
31     }
32 }
33 
34 arr.sort(intSort);
35 
36 alert(arr);
37 
38 function IntSort(a,b){
39     return a-b;
40 }

View
Code

数组切块-slice

澳门葡京 38澳门葡京 39

 1 //x.slice(start, end)
 2 //
 3 //使用注解
 4 //
 5 //x代表数组对象
 6 //start表示开始位置索引
 7 //end是结束位置下一数组元素索引编号
 8 //第一个数组元素索引为0
 9 //start、end可为负数,-1代表最后一个数组元素
10 //end省略则相当于从start位置截取以后所有数组元素
11 
12 var arr1=['a','b','c','d','e','f','g','h'];
13 var arr2=arr1.slice(2,4);
14 var arr3=arr1.slice(4);
15 var arr4=arr1.slice(2,-1);
16 
17 alert(arr2.toString());
18 //结果为"c,d" 
19 alert(arr3.toString());
20 //结果为"e,f,g,h"
21 alert(arr4.toString());
22 //结果为"c,d,e,f,g"

View
Code

去除子数组

澳门葡京 40澳门葡京 41

 1 //x. splice(start, deleteCount, value, ...)
 2 //
 3 //使用注解
 4 //
 5 //x代表数组对象
 6 //splice的主要用途是对数组指定位置进行删除和插入
 7 //start表示开始位置索引
 8 //deleteCount删除数组元素的个数
 9 //value表示在删除位置插入的数组元素
10 //value参数可以省略
11 
12 
13 var a = [1,2,3,4,5,6,7,8];
14 a.splice(1,2);
15 //a变为 [1,4,5,6,7,8]
16 alert(a.toString());
17 a.splice(1,1);
18  //a变为[1,5,6,7,8]
19 alert(a.toString());
20 a.splice(1,0,2,3);
21  //a变为[1,2,3,5,6,7,8]
22 alert(a.toString());

View
Code

数组的进出栈操作(壹)

澳门葡京 42澳门葡京 43

 1 //push pop这两个方法模拟的是一个栈操作
 2 
 3 //x.push(value, ...)  压栈
 4 //x.pop()             弹栈      
 5 //使用注解
 6 //
 7 //x代表数组对象
 8 //value可以为字符串、数字、数组等任何值
 9 //push是将value值添加到数组x的结尾
10 //pop是将数组x的最后一个元素删除
11 
12 
13 var arr1=[1,2,3];
14 arr1.push(4,5);
15 alert(arr1);
16 //结果为"1,2,3,4,5"
17 arr1.push([6,7]);
18 alert(arr1)
19 //结果为"1,2,3,4,5,6,7"
20 arr1.pop();
21 alert(arr1);
22 //结果为"1,2,3,4,5"

View
Code

数组的进出栈操作(2)

澳门葡京 44澳门葡京 45

 1 // unshift shift 
 2 //x.unshift(value,...)
 3 //x.shift()
 4 //使用注解
 5 //
 6 //x代表数组对象
 7 //value可以为字符串、数字、数组等任何值
 8 //unshift是将value值插入到数组x的开始
 9 //shift是将数组x的第一个元素删除
10 
11 var arr1=[1,2,3];
12 arr1.unshift(4,5);
13 alert(arr1);
14 //结果为"4,5,1,2,3"
15 arr1. unshift([6,7]);
16 alert(arr1);
17 //结果为"6,7,4,5,1,2,3"
18 arr1.shift();
19 alert(arr1);
20 //结果为"4,5,1,2,3"

View
Code

小结js的数组特性:

澳门葡京 46澳门葡京 47

1 //  js中数组的特性
2          //java中数组的特性,  规定是什么类型的数组,就只能装什么类型.只有一种类型.
3          //js中的数组特性1: js中的数组可以装任意类型,没有任何限制.
4          //js中的数组特性2: js中的数组,长度是随着下标变化的.用到多长就有多长.
5          var arr5 = ['abc',123,1.14,true,null,undefined,new String('1213'),new Function('a','b','alert(a+b)')];
6         /*  alert(arr5.length);//8
7          arr5[10] = "hahaha";
8          alert(arr5.length); //11
9          alert(arr5[9]);// undefined */

View
Code

4.1 创建RegExg对象

壹.字面量方式

//懒啊,直接书上的例子
var p1 = /at/g;  //匹配所有"at" 的实例
var p2 = /[bc]at/i  //匹配第一个bat或cat,不区分大小写
var p3 = /.at/gi  //匹配所有at结尾的组合,不区分大小写

//正则中如果想在字符中包含元字符需要对其进行转义
//这里和p3不同的是对.这个元字符进行转义,用\符号转义
var p4 = /\.at/gi;  //这里的意思是匹配所有的".at",不区分大小写。

贰.施用new RegExg构造函数

//RegExg() 接受两个参数,一个是正则表达式,一个是标志
var pattern1 = new RegExg("at","gi");
//pattern1和pattern2完全等价
var pattern2 = /at/gi;

4.1 创建RegExg对象

一.字面量情势

//懒啊,直接书上的例子
var p1 = /at/g;  //匹配所有"at" 的实例
var p2 = /[bc]at/i  //匹配第一个bat或cat,不区分大小写
var p3 = /.at/gi  //匹配所有at结尾的组合,不区分大小写

//正则中如果想在字符中包含元字符需要对其进行转义
//这里和p3不同的是对.这个元字符进行转义,用\符号转义
var p4 = /\.at/gi;  //这里的意思是匹配所有的".at",不区分大小写。

二.用到new RegExg构造函数

//RegExg() 接受两个参数,一个是正则表达式,一个是标志
var pattern1 = new RegExg("at","gi");
//pattern1和pattern2完全等价
var pattern2 = /at/gi;

2.3 Date 对象

四.二 RegExp的实例属性

有伍个实例属性:global,ignoreCase,multiline,lastIndex,source

//直接上例子,了解作用是什么就好了
//有一个正则对象
var p = /hello/i;
//global属性,返回布尔值,表示是否设置了g标志
console.log(p.global);  //false
//ignoreCase属性,返回布尔值,表示是否设置了i标志
console.log(p.ignoreCase);  //true
//multiline属性,返回布尔值,表示是否设置了m标志
console.log(p.multiline);  //false
//lastIndex属性,返回整数,表示开始搜索下一个匹配字符的位置,从0开始
console.log(p.lastIndex);  //0
//source属性,返回正则表达式的字符串形式
console.log(p.source); //"hello"

四.2 RegExp的实例属性

有三个实例属性:global,ignoreCase,multiline,lastIndex,source

//直接上例子,了解作用是什么就好了
//有一个正则对象
var p = /hello/i;
//global属性,返回布尔值,表示是否设置了g标志
console.log(p.global);  //false
//ignoreCase属性,返回布尔值,表示是否设置了i标志
console.log(p.ignoreCase);  //true
//multiline属性,返回布尔值,表示是否设置了m标志
console.log(p.multiline);  //false
//lastIndex属性,返回整数,表示开始搜索下一个匹配字符的位置,从0开始
console.log(p.lastIndex);  //0
//source属性,返回正则表达式的字符串形式
console.log(p.source); //"hello"

创建Date对象

澳门葡京 48澳门葡京 49

 1 //方法1:不指定参数
 2 var nowd1=new Date();
 3 alert(nowd1.toLocaleString( ));
 4 //方法2:参数为日期字符串
 5 var nowd2=new Date("2004/3/20 11:12");
 6 alert(nowd2.toLocaleString( ));
 7 var nowd3=new Date("04/03/20 11:12");
 8 alert(nowd3.toLocaleString( ));
 9 //方法3:参数为毫秒数
10 var nowd3=new Date(5000);
11 alert(nowd3.toLocaleString( ));
12 alert(nowd3.toUTCString());
13 
14 //方法4:参数为年月日小时分钟秒毫秒
15 var nowd4=new Date(2004,2,20,11,12,0,300);
16 alert(nowd4.toLocaleString( ));
17 //毫秒并不直接显示

View
Code

4.3 RegExp常用艺术

1.exec()方法:接受八个参数,那参数是选择形式的字符串,然后回到包罗第1三个相称项的数组

var p = /p/;
var str = "happy";
var arr = p.exec(str);
console.log(arr); // ["p",index:2,input:"happy"]  返回这个数组,第一个值表示匹配到的字符,index表示字符所在的位置,input表示应用的字符串

2. test()
方法
:用于知道那一个字符串与格局是或不是合作,接受二个字符串参数,再次回到布尔值

var p1 = /ry/g;
console.log(p1.test("ryuan")); //true,字符串中有ry这字符串,所以返回true

四.3 RegExp常用艺术

1.exec()方法:接受七个参数,那参数是应用方式的字符串,然后再次来到包含第三个相称项的数组

var p = /p/;
var str = "happy";
var arr = p.exec(str);
console.log(arr); // ["p",index:2,input:"happy"]  返回这个数组,第一个值表示匹配到的字符,index表示字符所在的位置,input表示应用的字符串

2. test()
方法
:用于知道那些字符串与形式是还是不是同盟,接受三个字符串参数,再次回到布尔值

var p1 = /ry/g;
console.log(p1.test("ryuan")); //true,字符串中有ry这字符串,所以返回true

Date对象的艺术—获取日期和时间

澳门葡京 50澳门葡京 51

 1 获取日期和时间
 2 getDate()                 获取日
 3 getDay ()                 获取星期
 4 getMonth ()               获取月(0-11)
 5 getFullYear ()            获取完整年份
 6 getYear ()                获取年
 7 getHours ()               获取小时
 8 getMinutes ()             获取分钟
 9 getSeconds ()             获取秒
10 getMilliseconds ()        获取毫秒
11 getTime ()                返回累计毫秒数(从1970/1/1午夜)

View
Code

实例:

澳门葡京 52澳门葡京 53

 1 function getCurrentDate(){
 2         //1. 创建Date对象
 3         var date = new Date(); //没有填入任何参数那么就是当前时间
 4         //2. 获得当前年份
 5         var year = date.getFullYear();
 6         //3. 获得当前月份 js中月份是从0到11.
 7         var month = date.getMonth()+1;
 8         //4. 获得当前日
 9         var day = date.getDate();
10         //5. 获得当前小时
11         var hour = date.getHours();
12         //6. 获得当前分钟
13         var min = date.getMinutes();
14         //7. 获得当前秒
15         var sec = date.getSeconds();
16         //8. 获得当前星期
17         var week = date.getDay(); //没有getWeek
18         // 2014年06月18日 15:40:30 星期三
19         return year+"年"+changeNum(month)+"月"+day+"日 "+hour+":"+min+":"+sec+" "+parseWeek(week);
20     }
21 
22 alert(getCurrentDate());
23 
24 //解决 自动补齐成两位数字的方法
25     function changeNum(num){
26     if(num < 10){
27         return "0"+num;
28     }else{
29         return num;
30     }
31 
32 }
33 //将数字 0~6 转换成 星期日到星期六
34     function parseWeek(week){
35     var arr = ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"];
36     //             0      1      2      3 .............
37     return arr[week];
38 }

View
Code

5.Function类型

宗旨:函数即对象

5.Function类型

主干:函数即对象

Date对象的主意—设置日期和岁月

澳门葡京 54澳门葡京 55

 1 //设置日期和时间
 2 //setDate(day_of_month)       设置日
 3 //setMonth (month)                 设置月
 4 //setFullYear (year)               设置年
 5 //setHours (hour)         设置小时
 6 //setMinutes (minute)     设置分钟
 7 //setSeconds (second)     设置秒
 8 //setMillliseconds (ms)       设置毫秒(0-999)
 9 //setTime (allms)     设置累计毫秒(从1970/1/1午夜)
10     
11 var x=new Date();
12 x.setFullYear (1997);    //设置年1997
13 x.setMonth(7);        //设置月7
14 x.setDate(1);        //设置日1
15 x.setHours(5);        //设置小时5
16 x.setMinutes(12);    //设置分钟12
17 x.setSeconds(54);    //设置秒54
18 x.setMilliseconds(230);        //设置毫秒230
19 document.write(x.toLocaleString( )+"<br>");
20 //返回1997年8月1日5点12分54秒
21 
22 x.setTime(870409430000); //设置累计毫秒数
23 document.write(x.toLocaleString( )+"<br>");
24 //返回1997年8月1日12点23分50秒

View
Code

5.一 定义函数

概念函数有上边三种艺术,常用的是壹,贰种

//1.函数声明
function getName(){
    var name = 'ry-yuan';
    return name;
}
//2.函数表达式
var getAge = function(){
    var age = 100;
    return age;
}
//3.使用Function构造函数,前面1-n个是参数,最后一个参数的是函数体,这种不推荐使用。
var sum = new Function("num","return num");

五.一 定义函数

概念函数有上边3种形式,常用的是1,2种

//1.函数声明
function getName(){
    var name = 'ry-yuan';
    return name;
}
//2.函数表达式
var getAge = function(){
    var age = 100;
    return age;
}
//3.使用Function构造函数,前面1-n个是参数,最后一个参数的是函数体,这种不推荐使用。
var sum = new Function("num","return num");

Date对象的措施—日期和岁月的转移

澳门葡京 56澳门葡京 57

 1 日期和时间的转换:
 2 
 3 getTimezoneOffset():8个时区×15度×4分/度=480;
 4 返回本地时间与GMT的时间差,以分钟为单位
 5 toUTCString()
 6 返回国际标准时间字符串
 7 toLocalString()
 8 返回本地格式时间字符串
 9 Date.parse(x)
10 返回累计毫秒数(从1970/1/1午夜到本地时间)
11 Date.UTC(x)
12 返回累计毫秒数(从1970/1/1午夜到国际时间)

View
Code

5.二 函数宣称和函数表达式的分别

上边的定义函数常用一,第22中学,分别是函数申明和函数表明式,那他们有啥样分裂?
只要听过表明进步的话就很轻易精晓下边包车型大巴内容,js解析器施行时会先找到全数的扬言,将其升级到顶部。有何用?看例子:

//函数声明,我们先运行sayHello,但是不会报错,因为函数声明已经在解析时被提到顶部
sayHello();  //hello everyone
function sayHello(){
    console.log("hello everyone");
}


//函数表达式,用var定义函数名.用函数表达式,不会提升,所以先运行sayBye就会找不到函数体
sayBey();  //报错 TypeError: sayBye is not a function
var sayBye = function(){
    console.log("bye bye");
}

伍.2 函数扬言和函数表明式的分别

上边包车型客车定义函数常用一,第22中学,分别是函数注解和函数表达式,那她们有如何分别?
假定听过申明提高的话就很轻松通晓下边包车型客车剧情,js解析器实施时会先找到全数的扬言,将其晋级到顶部。有哪些用?看例子:

//函数声明,我们先运行sayHello,但是不会报错,因为函数声明已经在解析时被提到顶部
sayHello();  //hello everyone
function sayHello(){
    console.log("hello everyone");
}


//函数表达式,用var定义函数名.用函数表达式,不会提升,所以先运行sayBye就会找不到函数体
sayBey();  //报错 TypeError: sayBye is not a function
var sayBye = function(){
    console.log("bye bye");
}

2.4 RegExp 对象

澳门葡京 58澳门葡京 59

 1 //RegExp对象
 2     // 在表单验证时使用该对象验证用户填入的字符串是否符合规则.
 3     //创建正则对象方式1  参数1 正则表达式  参数2 验证模式  g global / i 忽略大小写. //参数2一般填写g就可以,也有“gi”.
 4     // 用户名 首字母必须是英文, 除了第一位其他只能是英文数字和_ . 长度最短不能少于6位 最长不能超过12位
 5     //----------------------------创建方式1
 6     /* var reg1 = new RegExp("^[a-zA-Z][a-zA-Z0-9_]{5,11}$","g");
 7     //
 8     //验证字符串
 9     var str = "bc123";
10     alert(reg1.test(str));// true
11     
12     //----------------------------创建方式2  /填写正则表达式/匹配模式;
13     var reg2 = /^[a-zA-Z][a-zA-Z0-9_]{5,11}$/g;
14     
15     alert(reg2.test(str));// true
16      */
17     //-------------------------------正则对象的方法-------------------
18         //test方法  ==>  测试一个字符串是否复合 正则规则. 返回值是true 和false.
19     
20     //-------------------------String 中与正则结合的4个方法------------------.
21     // macth search split replace
22     var str = "hello world";
23     
24     //alert(str.match(/o/g)); //查找字符串中 复合正则的 内容.
25     //alert(str.search(/h/g));// 0  查找字符串中符合正则表达式的内容位置
26     //alert(str.split(/o/g)); // 按照正则表达式对字符串进行切割. 返回数组;
27     alert(str.replace(/o/g, "s")); // hells wsrld  对字符串按照正则进行替换.

View
Code

5.三 函数名是指向函数的指针

多少个函数在js种正是3个Function的实例,函数名正是对实例的引用,多少个指针,后边的靶子中也有说过。那么一个函数就能够有多少个函数名了。

//定义一个函数,函数名是sum
var sum = funtion(num1,num2){
    return num1+num2;
}

//讲sum复制给otherSum,那么otherSum和sum都指向同一个function对象
otherSum = sum;

otherSum(100,420);  //520
sum(1300+14); //1314

//对sum设置为null,sum变量就不在指向function对象
sum  = null;

//otherSum依然能够使用
otherSum(1,9); //10

伍.三 函数名是指向函数的指针

1个函数在js种正是1个Function的实例,函数名就是对实例的引用,二个指针,前面包车型地铁目的中也有说过。那么3个函数就足以有八个函数名了。

//定义一个函数,函数名是sum
var sum = funtion(num1,num2){
    return num1+num2;
}

//讲sum复制给otherSum,那么otherSum和sum都指向同一个function对象
otherSum = sum;

otherSum(100,420);  //520
sum(1300+14); //1314

//对sum设置为null,sum变量就不在指向function对象
sum  = null;

//otherSum依然能够使用
otherSum(1,9); //10

2.5 Math 对象

澳门葡京 60澳门葡京 61

 1 //Math对象
 2     //该对象中的属性方法 和数学有关.
 3     //Math是内置对象 , 与Global的不同之处是, 在调用时 需要打出 "Math."前缀.
 4     //属性学习:
 5     //alert(Math.PI);
 6     //方法学习:
 7         //alert(Math.random()); // 获得随机数 0~1 不包括1.
 8         //alert(Math.round(1.5)); // 四舍五入
 9         //练习:获取1-100的随机整数,包括1和100
10              //var num=Math.random();
11             //num=num*10;
12             //num=Math.round(num);
13             // alert(num)
14         //============max  min=========================
15         /* alert(Math.max(1,2));// 2
16         alert(Math.min(1,2));// 1 */
17         //-------------pow--------------------------------
18         alert(Math.pow(2,4));// pow 计算参数1 的参数2 次方.
19         
20 
21 
22 
23 abs(x)    返回数的绝对值。
24 exp(x)    返回 e 的指数。
25 floor(x)对数进行下舍入。
26 log(x)    返回数的自然对数(底为e)。
27 max(x,y)    返回 x 和 y 中的最高值。
28 min(x,y)    返回 x 和 y 中的最低值。
29 pow(x,y)    返回 x 的 y 次幂。
30 random()    返回 0 ~ 1 之间的随机数。
31 round(x)    把数四舍五入为最接近的整数。
32 sin(x)    返回数的正弦。
33 sqrt(x)    返回数的平方根。
34 tan(x)    返回角的正切。

View
Code

伍.四 函数未有重载

地点说了,函数名只是函数的指针,函数名是变量同样,重复复制就会覆盖原来的。
在java语言来讲,有两样的参数数量也称之为重载,可是js中没那种操作

//函数声明,fn为函数名
function fn(num1, num2){
    return num1+ num2;
}
//再来函数声明,fn为函数名
function fn(num){
    return num;
}

//fn只会指向最后一次声明的函数
fn(1,43);  //1

伍.四 函数未有重载

上边说了,函数名只是函数的指针,函数名是变量一样,重复复制就会覆盖原来的。
在java语言来讲,有两样的参数数量也称之为重载,不过js中没那种操作

//函数声明,fn为函数名
function fn(num1, num2){
    return num1+ num2;
}
//再来函数声明,fn为函数名
function fn(num){
    return num;
}

//fn只会指向最后一次声明的函数
fn(1,43);  //1

2.6 Function 对象

五.伍 函数像值同样传递

因为函数名本来便是三个变量,所以函数也得以像值一样被传送。说实话,函数能被当做值来传递确实是1件遗闻,大家风乐趣能够去探听回调函数,那里先不介绍了。

//声明一个函数fn1,它可以接受两个参数,一个是函数,一个是值
function fn1(fn,value){
    return (fn(value));
}
//声明一个fn2,接受一个参数
function fn2(val){
    console.log(val+1000);
}
//fn2当成参数传递给fn1
fn1(fn2,24);  //1024

伍.伍 函数像值同样传递

因为函数名本来正是2个变量,所以函数也得以像值同样被传送。说实话,函数能被看作值来传递确实是壹件有趣的事,大家有趣味能够去询问回调函数,那里先不介绍了。

//声明一个函数fn1,它可以接受两个参数,一个是函数,一个是值
function fn1(fn,value){
    return (fn(value));
}
//声明一个fn2,接受一个参数
function fn2(val){
    console.log(val+1000);
}
//fn2当成参数传递给fn1
fn1(fn2,24);  //1024

函数的定义:

1 function 函数名 (参数){
函数体;
2     return 返回值;
3 }

作用表明:

  • 可以采用变量、常量或表达式作为函数调用的参数
  • 函数由器重字function定义
  • 函数名的定义规则与标志符壹致,大小写是乖巧的
  • 再次来到值必须选用return

Function 类能够代表开垦者定义的别的函数。

用 Function 类直接开立函数的语法如下:

1 function 函数名 (参数){
2     
函数体;
3    return 返回值;
4 }
5 //another way:
6 var 函数名 = new Function("参数1","参数n","function_body");

就算如此由于字符串的涉及,第三种样式写起来有些劳顿,但推进了然函数只不过是一种引用类型,它们的作为与用 Function 类明显创制的函数行为是1模一样的。

瞩目:js的函数加载实践与python不一致,它是壹体化加载完才会实行,所以进行函数放在函数注解上面或上面都得以。

Function 对象的 length
属性

如前所述,函数属于引用类型,所以它们也有总体性和措施。

举个例子,ECMAScript 定义的品质 length 注脚了函数期望的参数个数。

1 alert(func1.length)

运算符void()功效:拦截方法的重回值

5.陆 函数内部对象

函数内部有五个例外的靶子arguments和this

1.arguments:包罗传入函数的具备参数,首要用来保存函数参数,它能够当作是一个数组

function fn(num1,num2){
    console.log(arguments);
}
fn(100,200);  //{'0':100,'1':200}

//arguments有一个callee的属性,它是一个指针,用来指向当前这个函数
//例如一个递归调用,阶乘函数,里面的arguments.callee就是等价于这个函数
function factorial(num){
    if(num<=1){
        return 1;
    }
    else{
        return num*arguments.callee(num-1);
    }
}

2.this:指向调用这么些函数的目的

//全局作用域下
var hi = 'hi';
//一个普通object对象
var obj = { hi = "obj hi"};
function say(){
    console.log(this.hi)
}

//say函数在全局作用域下定义,直接执行,this将指向window对象,所以hi是windows对象的。
say();  //hi  

//将say赋予obj对象,并且obj来调用say,这次this将指向obj对象
obj.say = say;
obj.say();  //obj hi

5.6 函数内部对象

函数内部有七个自我作古的靶子arguments和this

一.arguments:包蕴传入函数的有着参数,首要用来保存函数参数,它能够作为是几个数组

function fn(num1,num2){
    console.log(arguments);
}
fn(100,200);  //{'0':100,'1':200}

//arguments有一个callee的属性,它是一个指针,用来指向当前这个函数
//例如一个递归调用,阶乘函数,里面的arguments.callee就是等价于这个函数
function factorial(num){
    if(num<=1){
        return 1;
    }
    else{
        return num*arguments.callee(num-1);
    }
}

2.this:指向调用那么些函数的靶子

//全局作用域下
var hi = 'hi';
//一个普通object对象
var obj = { hi = "obj hi"};
function say(){
    console.log(this.hi)
}

//say函数在全局作用域下定义,直接执行,this将指向window对象,所以hi是windows对象的。
say();  //hi  

//将say赋予obj对象,并且obj来调用say,这次this将指向obj对象
obj.say = say;
obj.say();  //obj hi

函数的调用

澳门葡京 62澳门葡京 63

 1 function func1(a,b){
 2 
 3     alert(a+b);
 4 }
 5 
 6     func1(1,2);  //3
 7     func1(1,2,3);//3
 8     func1(1);    //NaN
 9     func1();     //NaN
10 
11     //只要函数名写对即可,参数怎么填都不报错.
12 
13 -------------------面试题-----------
14  function a(a,b){
15     alert(a+b);
16 }
17 
18    var a=1;
19    var b=2;
20    a(a,b)

View
Code

5.七函数属性和方式

1.length属性:函数接受参数的个数

function fn(n,m){};
alert(fn.length); //2

2.prototype属性:背后博客再说,厉害嘞

3.apply()和call()方法:扩大函数重视的运行蒙受。就好像把三个函数给2个个的靶子使用。

var color = "red";
var obj = {color: "green"};
//先声明一个函数
function fn(){
    console.log(this.color);
}
//给window对象用
fn.call(window);  //red
//给obj对象用
fn.call(obj);   //green

apply和call功效是均等的:分裂正是经受参数不相同,大家先是个参数都以作用域对象,前边的apply接收3个参数数组,call则是接到1个个参数。

//声明一个函数add
function add(num1,num2){
    return num1+num2;
}
//在另一个函数调用,第一个是this,后面参数一个个输入
//这里用call
function otherAdd(n1,n2){
    return add.call(this,n1,n2);
}
//这里用apply,第一都是this,后面接受参数变成数组形式
function otherAdd(n1,n2){
    return add.apply(this,[n1,n2]);
}

5.7函数属性和艺术

1.length属性:函数接受参数的个数

function fn(n,m){};
alert(fn.length); //2

2.prototype属性:背后博客再说,厉害嘞

3.apply()和call()方法:扩展函数信赖的运作蒙受。就像把1个函数给3个个的目的使用。

var color = "red";
var obj = {color: "green"};
//先声明一个函数
function fn(){
    console.log(this.color);
}
//给window对象用
fn.call(window);  //red
//给obj对象用
fn.call(obj);   //green

apply和call功用是如出1辙的:分歧就是承受参数差异,我们先是个参数都以功能域对象,后边的apply接收四个参数数组,call则是吸收七个个参数。

//声明一个函数add
function add(num1,num2){
    return num1+num2;
}
//在另一个函数调用,第一个是this,后面参数一个个输入
//这里用call
function otherAdd(n1,n2){
    return add.call(this,n1,n2);
}
//这里用apply,第一都是this,后面接受参数变成数组形式
function otherAdd(n1,n2){
    return add.apply(this,[n1,n2]);
}

函数的放权对象arguments

澳门葡京 64澳门葡京 65

 1 function add(a,b){
 2 
 3         console.log(a+b);//3
 4         console.log(arguments.length);//2
 5         console.log(arguments);//[1,2]
 6 
 7     }
 8     add(1,2)
 9 
10     ------------------arguments的用处1 ------------------
11     function nxAdd(){
12         var result=0;
13         for (var num in arguments){
14             result+=arguments[num]
15         }
16         alert(result)
17 
18     }
19 
20     nxAdd(1,2,3,4,5)
21 
22 //     ------------------arguments的用处2 ------------------
23 
24     function f(a,b,c){
25         if (arguments.length!=3){
26             throw new Error("function f called with "+arguments.length+" arguments,but it just need 3 arguments")
27         }
28         else {
29             alert("success!")
30         }
31     }
32 
33     f(1,2,3,4,5)

View
Code

四、说说

那篇东西挺长篇幅,适合稳步看,也契合营为温故js的引用类型的学识,多看两次。能够能够,要是感觉写得好,就点赞啊,还会继续革新哦。

同类别前几篇:
第1篇:JavaScript–笔者发觉,原来你是那般的JS(壹)(初识)
第一篇:JavaScript–作者意识,原来你是那般的JS(贰)(基础概念–躯壳篇)
其3篇:JavaScript–笔者开采,原来你是那样的JS(三)(基础概念–灵魂篇)
第肆篇:JavaScript–小编发觉,原来你是这么的JS(肆)(看看变量,成效域,垃圾回收是甚)

正文来源天涯论坛:
小编:Ry(渊源远愿)
招待访问笔者的私人住房首页:本身的首页
招待访问作者的github:
接待转发,转发请标明出处,保留该字段。

四、说说

那篇东西挺长篇幅,适合渐渐看,也顺应作为温故js的引用类型的学识,多看四遍。能够可以,假使感觉写得好,就点赞啊,还会继续立异哦。

同类别前几篇:
率先篇:JavaScript–作者意识,原来你是那般的JS(壹)(初识)
第壹篇:JavaScript–笔者开采,原来你是那样的JS(2)(基础概念–躯壳篇)
其三篇:JavaScript–笔者发掘,原来你是这么的JS(3)(基础概念–灵魂篇)
第6篇:JavaScript–小编发现,原来你是那般的JS(肆)(看看变量,成效域,垃圾回收是什么)

正文来源今日头条:
小编:Ry(渊源远愿)
接待访问作者的私人住房首页:自己的首页
应接访问小编的github:
应接转发,转发请标明出处,保留该字段。

无名函数

澳门葡京 66澳门葡京 67

 1 // 匿名函数
 2     var func = function(arg){
 3         return "tony";
 4     }
 5 
 6 // 匿名函数的应用
 7     (function(){
 8         alert("tony");
 9     } )()
10 
11     (function(arg){
12         console.log(arg);
13     })('123')

View
Code

补充:函数的功效域、成效域链和闭包

作用域:

  JavaScript 中以函数作为成效域。

  JavaScript
函数在被调用以前,功能域链已经存在。

  JavaScript 中声称提前。

澳门葡京 68澳门葡京 69

1 function fun(){
2     // var s;    (暗含)
3     
4     console.log(s);
5     var s = "Hme";
6 }
7 fun()

宣称提前

闭包:

 1 var city = 'beijing';
 2 
 3 function func(){
 4     var city = "shanghai";
 5     function inner(){
 6         // var city = "langfang";
 7         console.log(city);
 8     }
 9     return inner;
10 }
11 var ret = func();
12 ret();

职能域链(Scope Chain):

  在JavaScript中,函数也是目的,实际上,JavaScript里壹切都是对象。函数对象和此外对象同样,具备足以由此代码访问的质量和1密密麻麻仅供JavaScript引擎访问的个中属性。当中一个里头属性是[[Scope]],由ECMA-262正规第二版定义,该内部属性包罗了函数被创造的成效域中目标的集结,那一个会集被喻为函数的功效域链,它调控了什么数据能被函数访问。

 1 var x=1;
 2 function foo() {
 3     var y = 2;
 4     
 5     function bar() {
 6         var z = 3;
 7     }
 8 }
 9 
10 #bar的作用域链: barScopeChain=[bar.AO, foo.AO, global.VO];
11 
12 #foo的作用域链: fooScopeChain=[foo.Ao, global.VO];

AO 、VO

澳门葡京 70澳门葡京 71

 1 什么是AO,VO?
 2        在函数创建时,每个函数都会创建一个活动对象Active Object(AO),全局对象为Global Object(VO),创建函数的过程也就是为这个对象添加属性的过程,作用域链就是由这些绑定了属性的活动对象构成的。
 3         例如:找x变量;bar函数在搜寻变量x的过程中,先从自身AO对象上找,如果bar.AO存在这个属性,那么会直接使用这个属性的值,如果不存在,则会转到父级函数的AO对象,也就是foo.AO
 4         如果找到x属性则使用,找不到继续 在global.VO对象查找,找到x的属性,返回属性值。如果在global.VO中没有找到,则会抛出异常ReferenceError
 5 
 6 执行上下文。
 7        函数在执行时会创建一个称为“执行上下文(execution context)”的内部对象,执行上下文定义了函数
 8        执行时的环境。每个执行上下文都有自己的作用域链,用于标识符解析,当执行上下文被创建时,而它的作用
 9        域链初始化为当前运行函数的[[Scope]]所包含的对象。
10 函数执行
11        在函数执行过程中,每遇到一个变量,都会检索从哪里获取和存储数据,该过程从作用域链头部,也就是从活
12        动对象开始搜索,查找同名的标识符,如果找到了就使用这个标识符对应的变量,如果没有则继续搜索作用域
13        链中的下一个对象,如果搜索完所有对象都未找到,则认为该标识符未定义,函数执行过程中,每个标识符都
14        要经历这样的搜索过程。

View
Code

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website