跳到主要内容

引用类型

new

使用 new 操作符来明确其后面跟着一个构造函数,而非普通的函数:

// 返回一个对象
var person = new Object();
// 返回 Object 函数的返回值
var person = Object();

对象字面量

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

与以下等价:

var person = {}
person.name = "Nicholas"
person.age = 29

下标方式访问属性

除了点语法,还可以以下标方式访问属性。同时,下标访问意味着属性可以拥有空格:

// 点语法不支持空格:person.first name = "Nicholas"
person["first name"] = "Nicholas"

当然,更建议使用点语法访问属性。

Array

// 创建 length 为 20 的 数组,每一项都是 undefined
var colors = new Array(20)
// 明确元素
var colors = new Array("red", "blue", "green")
// Array 允许省略 new 操作符
var colors = Array("red", "blue", "green")
// 可以用 [] 直接创建数组
var colors = ["red", "blue", "green"]
// 长度
alert(colors.length)

访问下标范围外的数会返回 undefined,且不会影响到其数组内部,但是赋值是有效的:

var colors = ["red", "blue", "green"]
alert(colors[99])
alert(colors.length) // 3

colors[99] = "black"
alert(colors.length) // 100

数组的个数上限:4294967295

因为一个网页可能有多个框架的 Array 实现,所以用 instanceof 来判断是否为数组是不可靠的。

但可以用 Array.isArray() 来判断是否为数组。

join 方法来拼接元素。

支持栈操作,可以用 pushpop 方法。

支持队列操作,可以用 pushshift 方法,或者用 unshiftpop

数组自带 reversesort 方法。

sort 方法默认对每个元素的 toString() 值进行字典排序,所以不适合 Number 类型的排序。不过可以传入一个自定义的比较函数,比如:

function compare(val1, val2) {
if (val1 < val2) {
// 只要返回负数即可,下面 1 同样
return -1
} else if (val1 > val2) {
return 1
} else {
return 0
}
}

var values = [0, 1, 5, 10, 15]
values.sort(compare)

concat(...) 方法可以在原有基础上创建新数组对象:

var colors = ["red", "blue", "green"]
var colors2 = colors.concat("yellow", ["black", "brown"])

slice(startIndex, endIndex) 方法可以根据区间创建新数组对象,第二个参数默认为数组结尾。slice 允许负数下标,会在负数的基础上自动加上数组长度。

splice(startIndex, length, element1, element2, ...) 方法会从 startIndex 开始删除 length 个元素,然后在 startIndex 开始添加 element1、element2、... 。

支持 indexOflastIndexOf 方法,且运用到的是全等运算符。

Array 对象的迭代方法有:

  • every 可以对每个元素进行检查,均满足则返回 true

  • some 有一个元素满足,则返回 true

  • filter

  • forEach

  • map

迭代方法的函数参数可以接受三个参数:

  • value 当前值

  • index 当前值所对应的下标

  • array 数组本身

归并可以用 reducereduceRight 方法,他的函数参数可以接受四个参数:

  • preValue 前一个值

  • curValue 当前值

  • index 当前值所对应的下标

  • array 数组本身

Date

获取当前日期:

var date = new Date()

Date 的默认时间为 UTC Mon 1 1970 00:00:00

Date.parse() 支持以下格式:

  • "月/日/年"

  • "月名 日,年"

  • "星期 月名 日 年 时:分:秒 时区"

名称需为英文,第三种格式中一些参数为可选

Date.UTC() 的参数:

  • year

  • month 从 0 开始,比如三月是 2

  • day

  • hour

  • minute

  • second

  • millsecond

Date.UTC() 的参数和 Date 构造函数一样,但是构造函数会用本地时区。

Date.now() 获取时间戳。

Date 的 valueOf 方法会返回日期的毫秒数。

toDateStringtoTimeString 分别返回日期和时间的字符形式。

可以用 setter/getter 方法获取某一时间信息,比如 getYear() ,见书上 P102 。

RegExp

正则构造:

var expression = /pattren/flags
// 字符串需要注意转义
var expression = new RegExp("pattern", "flags")

可以用 test() 来检查是否匹配,或者 exec() 获得匹配信息。

具体用法请见书上 P103 。

Function

函数声明是全局有效的,可以在调用之后进行声明。

函数有两个属性:

  • arguments 参数数组

  • this 函数所在的环境对象

可以用 arguments.callee 方法来调用原函数,实现函数名解耦。

可以用函数的 caller 属性来获得调用者的引用,或者用 arguments.callee.caller 。不能给 caller 属性赋值。

length 属性获得函数希望接收的参数个数。

prototype 包含了所有的实例方法。

apply(obj, args) 来在 obj 下调用函数,或者 call(obj, arg1, arg2, ...)

bind(obj) 将函数和 obj 绑定。

基本包装类型

基本类型无法保存属性,但可以访问其对应的包装类型的属性及方法。

非必要的时候尽量不要用包装类型。

Object 构造函数会根据参数的类型返回对应的包装类型实例:

var obj = new Object("some text")
alert(obj instanceof String) // true

转型函数返回的是基本类型,不是对象。

Boolean

Boolean 对象返回 true ,而非其值。

Number

可以用 toFixed(length) 设置保留小数位数,但要注意不一定是四舍五入。

toExponential(length) 用科学计数表示。

toPrecision(length) 可设置精度。

String

可以用 charAt(index) 根据索引获得字符,或者 charCodeAt(index) 获得字符对应的编码。

可以用 concat(str1, str2, ...) 连接字符串。

可以用这些方法获得子串:

  • slice(startIndex, endIndex)

  • substring(startIndex, endIndex)

  • substr(startIndex, length)

支持 indexOflastIndexOf 方法。

支持 trim 方法。

支持 toLowerCasetoUpperCase 方法。

支持 match(pattern) 匹配方法,与 RegExp 的 exec 方法一致。

支持 search(pattern) 查找字符所在的第一个位置,没找到返回 -1

支持 replace(str/pattern, str/function) 。如果是 str 则只能替换第一个。具体见书本 P127-128 。

支持 split(sign, num) 分割方法,其中 num 为返回的数组大小。

单体内置对象

Global

可以用 eval("statements") 来执行语句:

eval("function sayHi() { alert('HI') }")
sayHi()

禁止给 undefinedNaNInfinity 赋值,他们都是 Global 对象的属性。

在 Web 浏览器中,全局对象为 window

Math

Math 有许多可以用的特殊值,比如 EPI 等。

支持 min(n1, n2, ...)max(n1, n2, ...)

可以使用 Math.min.apply(Math, values) 来获取数组中的最小值。

支持 ceilroundfloor 三种舍入方式。

支持 random 方法,他返回一个介于 01 的随机数:

// 返回一个 1 到 10 的随机数
var num = Math.floor(Math.random() * 10 + 1)

也可以用 selectFrom(start, end) 方法来获取 [start, end] 中的随机数。

Math 支持 absexplogpowsqrt 及三角函数等。