javascript笔记(一)

Object的每个实例都具有以下属性和方法:
1.constructor
2.hasOwnProperty(propertyName)
3.isPrototypeOf(object)
4.propertyIsEnumerable(propertyName)
5.toLocaleString()
6.toString()
7.valueOf()

如果相等操作符的两个操作数都是对象,则比较他们是不是同一个对象,如果两个操作数都指向同一个对象,则相等操作符返回true,否则返回false.

如果相等操作符的一个操作数是NaN,则相等操作符返回false,即使两个操作数都是NaN,相等操作符也返回false,因为按照规则,NaN不等于NaN

null == undefined // true
null === undefined // false

在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数

函数没有重载,两个同名函数,后面的会覆盖前面的。因为函数是对象,函数名是指向函数的指针,定义两个同名函数时,后者会将指针指向另一个地址,因此将前者覆盖

引用类型的值是保存在内存中的对象

访问变量有按值和按引用两种方式,而参数只能按值传递,把函数外部的值复制给函数内部的参数,在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数外部。

执行环境定义了变量或函数有权访问的其他数据,每个执行环境都有一个与之关联的变量对象。环境中定义的所有变量和函数都会保存在这个对象中。

每个函数都有自己的执行环境。当执行流进入一个函数时,函数的环境就会被推入一个环境栈中。而在函数执行之后,栈将其环境弹出,把控制权返回给之前的执行环境。

当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端,始终都是当前执行的代码所在环境的变量对象。如果这个环境是函数,则将其活动对象作为变量对象。活动对象在最开始时只包含一个变量,即arguments对象,作用域链中的下一个变量对象来自包含(外部)环境,而载下一个变量对象则来自于下一个包含环境,这样,一直延续到全局执行环境。全局执行环境的变量始终都是作用域链中的最后一个对象。

使用var声明的变量会自动被添加到最接近的环境中。

检测数组 Array.isArray(value)

join()方法 —— 数组转化为字符串
split()方法 —— 字符串分割为数组
push()方法 —— 接收任意数量的参数,将他们逐个添加到数组末尾
pop()方法 —— 从数组末尾移除
unshift()方法 —— 在数组前端添加任意个项
shift()方法 —— 移除数组第一项
重排序方法(改变原数组)
1.reverse()方法
2.sort()方法

concat()方法 —— 基于当前数组的所有项,或多个数组,创建一个新数组,最后返回新构建的数组
slice()方法 ——基于当前数组的一个或多各项创建一个新数组,
splice()方法 —— 向数组中删除
indexOf()方法 —— 返回要查找的项在数组中的位置
lastIndexOf()方法 —— 从数组的末尾开始查找,返回要查找的项在数组中的位置
every()方法 —— 对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true
filter()方法 —— 对数组中的每一项运行给定函数。返回该函数会返回true的项组成的数组
forEach()方法 —— 对数组中的每一项运行给定函数。无返回值
map()方法 —— 对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组
some()方法 —— 对数组中的每一项运行给定函数,如果该函数对任一项返回true,则返回true
reduce()方法 —— 迭代所有项,构建一个最终的返回值
reduceRight()方法 —— 从数组的最后一项开始,迭代所有项,构建一个最终的返回值

函数声明&函数表达式
在代码开始执行之前,解析器就已经通过一个名为函数声明提升的过程,读取并将函数声明添加到执行环境中。
函数表达式,则必须等到解析器执行到他所在的的代码行时,才会真正被解释执行.

在函数内部有两个特殊的对象:argumentsthis,两个属性 lengthprototype,两个方法applycall
arguments:保存函数参数
arguments的callee属性:指向拥有这个arguments对象的函数
apply和call:在特定的作用域中调用函数,它的强大之处在于能够扩充函数赖以运行的作用域,使对象不需要与方法有任何耦合关系
每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象。
prototype属性是一个指针,指向一个对象,这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法
prototype实际上就是实例原型对象
原型对象可以让所有对象实例共享它所包含的属性和方法
在默认情况下,所有原型对象都会自动获得一个constructor属性,这个属性是一个指向 prototype 属性所在函数的指针

Number类型
toFixed() —— 按照指定的小数位返回数组的字符串表示字符方法

charAt() —— 访问字符串中特定字符(返回当前位置的字符表示)
charCodeAt() —— 访问字符串中特定字符(返回当前位置的字符编码表示)
concat() —— 将一或多个字符串拼接起来,返回拼接得到的新字符串
indexOf() —— 从字符串中查找字符串的方法
trim() —— 删除字符串前后的所有空格,返回新字符串
toLowerCase() —— 将字符串全部转换为小写
toUpperCase() —— 将字符串全部转换为大写

replace() —— 替换子字符串的方法. 这个方法接受两个参数,第一个参数可以是一个RegExp对象或者一个字符串,第二个参数可以是一个字符串或者一个函数。如果第一个参数是字符串,那么只会替换第一个子字符串,要想替换所有子字符串,唯一的办法就是提供一个正则表达式,而且要指定全局(g)标志.

Math对象拥有的方法:
min() //一组数中的最大值
max() //一组数中的最小值
ceil() //向上舍入
floor() //向下舍入
round() //四舍五入
random() //返回 [0,1) 的一个随机数
abs() //返回绝对值

ECMAScript中有两种属性:数据属性、访问器属性.
访问器属性不包含数据值;他们包含一对getter和setter函数. 在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值;在写入访问器属性时,会调用setter函数并传入新值,这个函数负责决定如何处理数据。

访问器属性不能直接定义,必须使用Object.defineProperty()来定义.

工厂模式:用函数来封装以特定接口创建对象的细节:

function createPerson(name, age, job) {
    var o = new Object();  //显式创建对象
    o.name = name;   //将属性赋给对象
    o.age = age;
    o.job = job;
    o.sayName = function() {  //将方法赋给对象
        alert(this.name);
    }
    return o; //返回对象
}
var person1 = createPerson('aha'5,children);
var person2 = createPerson('jasper', 5, children);

ECMAScript中的构造函数可用来创建特定类型的对象。
构造函数模式:

function Person(name, age, job) {
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function() {
        alert(this.name);
    }
};
var person1 = new Person('aha', 5, children);
var person2 = new Person('jasper', 5, children);

使用new操作符调用构造函数实际上会经历以下4个步骤:
1. 创建一个对象
2. 将构造函数的作用域赋给新对象(因此this就指向了这个新对象)
3. 执行构造函数中的代码(为这个对象添加属性)
4. 返回新对象

任何函数,只要通过New操作符调用,就可以作为构造函数.

每个函数都有一个prototype属性,这个属性指向函数的原型对象。
构造函数的实例都包含一个内部属性[[prototype]],该属性指向构造函数的原型对象,可以通过Object.getPrototypeOf()方法返回[[prototype]]的值。
原型对象最初只包含constructor属性。

hasOwnProperty()方法可以检测一个属性是存在于实例中,还是存在于原型中。这个方法(是从Object继承来的)只在给定属性存在于对象实例中时,才会返回true.

Object.keys()方法接收一个对象作为参数,返回一个包含所有可枚举属性的字符串数组

调用构造函数时,会为实例添加一个指向最初原型的[[prototype]]指针,当把原型修改为另一个对象就等于切断了构造函数与最初原型之间的联系

原型链作为继承的主要方法,基本思想:利用原型让一个引用类型继承另一个引用类型的属性和方法。

实现原型链有一种基本模式,其代码如下:

function SuperType() {
    this.property =  true;
}

SuperType.prototype.getSuperValue = function() {
    return this.property;
}

function SubType() {
    this.subproperty = false;
}
// 继承了SuperType
SubType.property = new SuperType();

SubType.prototype.getSubValue = function() {
    return this.subprototype;
}

var instance = new SubType();
alert(instance.getSuperValue);  // true

Object.create() 接收两个参数,一个用作新对象原型的对象,另一个为新对象定义额外属性的对象。

arguments.callee是一个指向正在执行的函数的指针
在严格模式下,不能通过脚本访问arguments.callee,访问这个属性会导致错误.

可以使用命名函数表达式实现递归函数,如下:

var factorial = (function f(num) {
    if (num <= 1) {
        return 1;
    } else {
        return num * f(num-1);
    }
});

闭包是有权访问另一个函数作用域中的变量的函数

全局对象的变量对象始终存在,局部环境的变量对象则只在函数执行的过程中存在。

创建函数时,会创建一个预先包含全局变量的作用域链,这个作用域链被保存在内部的[[Scope]]属性中,当调用函数时,会为函数创建一个执行环境,然后通过复制函数的[[Scope]]属性中的对象构建起执行环境的作用域链。作用域链本质上是一个指向变量对象的指针列表,它只引用但不实际包含变量对象

由于闭包会携带包含它的函数的作用域,因此会比其他函数占用更多的内存,过度使用闭包可能会导致内存占用过多

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值