js的引用类型

1. 原生引用类型

引用类型的值(对象)是引用类型的一个实例。

引用类型有时候也被称为对象定义,因为它们描述的是一类对象所具有的属性和方法。

对象是某个特定引用类型的实例

引用类型也常被称为,但并不合适。尽管ECMAScript从技术上讲是一门面向对象的语言,但是它不具备传统的面向对象语言所支持的类和接口等基本结构。

1
2
3
var person = new People();
//person 新实例保存在变量person中
//People 引用类型

上述代码创建了People引用类型的一个新实例

然后把该实例保存在了变量person中

而使用的构造函数是People,这个People只为新对象person定义了默认的属性和方法

2. Object类型

3. Array类型

4. Date类型

5. RegExp类型

6. Function类型

7. 基本包装类型

为了便于操作基本类型值,ECMAScript还提供了3个特殊的引用类型:Boolean、Number和String。这些类型与其他引用类型相似,但同时也具有与各自的基本类型相应的特殊行为。

实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据。

1
2
3
4
5
6
7
8
9
var s1 = "some text";
var s2 = s1.substring(2);
//这两行代码相当于
//1. 创建String类型的一个实例;
var s1 = new String("some text");
//2. 在实例上调用指定的方法;
var s2 = s1.substring(2);
//3. 销毁这个实例
s1 = null;

引用类型与基本包装类型的主要区别就是对象的生存期。使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象,则只存在于一行代码的执行瞬间,然后立即被销毁。这意味者我们不能再运行时为基本类型值添加属性和方法

1
2
3
4
var s1 = "some text";
s1.color = "red";//这行代码执行完毕之后创建的String对象已经被销毁了
//下面这行代码执行的时候有创建了一个自己的新String对象,然后String对象没有color这个方法。
console.log(s1.color);//undefined

7.1 Boolean类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var falseObject = new Boolean(false);
//是一个Boolean实例
console.log(falseObject);//Boolean {false}
//布尔表达式中的所有对象都会被转成true
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

最好永远不要使用Boolean对象

7.2 Number类型

也不建议直接实例化Number对象

7.2.1 valueOf() toLocaleString() toString()

toString(n)可以用来返回n进制数值的字符串形式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var numberObject = new Number(10);

//返回对象表示的基本类型的数值
console.log(numberObject.valueOf());//10
console.log(typeof numberObject.valueOf());//number

//返回字符串形式的数值
console.log(numberObject.toLocaleString());//10
console.log(typeof numberObject.toLocaleString());//string

//返回字符串形式的数值
console.log(numberObject.toString());//10
//返回2进制的字符串形式
console.log(numberObject.toString(2));//1010
console.log(typeof numberObject.toString(8));//string
console.log(typeof numberObject.toString());//string

var numberValue = 10;

console.log(numberValue.toString(2));//1010
console.log(typeof numberValue.toString(8));//string

7.2.2 toFixed(n)

返回数值的n为精度的字符串表示

1
2
var num = 10;
console.log(num.toFixed(3));//"10.000"

ie8以及ie8之前的游览器对{(-0.94,-0.5],[0.5,0.94)}之间的值返回的是0,而不是-1或者1

7.2.3 toExponential(n)

返回指定n为的小数位数的字符串

1
2
3
var num = 99;
console.log(num.toExponential(1));//"9.9e+1"
console.log(typeof num.toExponential(1));//string

7.2.4 toPrecision(n)

返回数值的n位数的表示形式

会根据要处理的数值决定到底是调用toFixed()还是调用toExponential()这三个方法都可以通过向上或向下舍入,做到以最准确的形式来表示带有正确小数位的值。

1
2
3
4
5
6
var num = 99;
console.log(num.toPrecision(1));//1e+2
//一位数无法精准的表示99,所以向上舍入为100

console.log(num.toPrecision(2));//99
console.log(num.toPrecision(3));//99.0

7.3 String类型

8. 单体内置对象

  • Global
  • Math

8.1 概念

ECMA-262对内置对象的定义是:由ECMAScript实现提供的、不依赖于宿主环境的对象,这些对象在ECMAScript程序执行之前就已经存在了。

简而言之,它们在你使用之前已经实例化了。

8.2 Global

8.2.1 URI编码方法

1
2
3
4
5
6
7
8
var uri = "http://www.baidu.com/home balue.html#12@1?1";

console.log(encodeURI(uri));
//console.log(decodeURI(uri));
//"http://www.baidu.com/home%20balue.html#12@1?1"
console.log(encodeURIComponent(uri));
//console.log(decodeURIComponent(uri));
//"http%3A%2F%2Fwww.baidu.com%2Fhome%20balue.html%2312%401%3F1"

一般来说,我们使用encodeURIComponent()方法的时候比使用encodeURI()更多,因为实践中更常见的是对查询字符串参数而不是对基础URI进行编码

escape()unescape()在ECMA-262第三版中已经被废弃,这两个方法只能正确的编码ASCII字符,不适合产品级的代码,不要使用。

8.2.2 eval()方法

只接受一个参数,即要执行的ECMAScript字符串

1
2
3
4
5
var str = "hello wordl!";
eval("console.log(str)");
//等同于!!!!!!
varstr = "hello world!";
console.log(str);

严格模式下,在外部访问不到eval()中创建的任何变量或函数;为eval赋值也会导致错误。

eval()功能虽然强大,但是尽量别使用,尤其是在用它执行用户输入数据的情况下。否则可能会有恶意用户输入对你网站不利的代码(即代码注入)

8.2.3 Global对象的属性

属性 说明 分割线 属性 说明
undefined 特殊值undefined Date 构造函数Date
NaN 特殊值NaN RegExp 构造函数RegExp
Infinity 特殊值Infinity Error 构造函数Error
Object 构造函数Object EvalError 构造函数EvalError
Array 构造函数Array RangError 构造函数RangError
Function 构造函数Function ReferenceError 构造函数ReferenceError
Boolean 构造函数Boolean SyntaxError 构造函数SyntaxError
String 构造函数String TypeError 构造函数TypeError
Number 构造函数Number URIError 构造函数URIError

8.2.4 window对象

web游览器都是将全局对象作为window对象的一部分加以实现的。

在没有给函数明确指定this值的情况下,this的值就是Global对象

1
2
3
4
var global = function () {
return this;
}
//返回的这个this就是global对象

8.3 Math对象

8.3.1 Math对象的属性

属性 说明
Math.E 常量e的值
Math.LNn n的自然对数
Math.LOGn 以n为底的对数
Math.PI π的值
Math.SQRTn_m n/m的平方根
Math.SQRTn n的平方根

8.3.2 min()和max()方法

1
2
3
4
5
6
7
8
9
var max = Math.max(3, 54, 32, -2);
var min = Math.min(3, 54, 32, -2);

console.log(max);//54
console.log(min);//-2

var arr = [1, 2, -12, 12, 0];
var maxArr = Math.max.apply(Math, arr);
console.log(maxArr);//12

8.3.3 舍入方法

1
2
3
4
5
6
7
8
9
10
11
console.log(Math.ceil(25.9));//26
console.log(Math.ceil(25.5));//26
console.log(Math.ceil(25.1));//26

console.log(Math.round(25.9));//26
console.log(Math.round(25.5));//26
console.log(Math.round(25.1));//25

console.log(Math.floor(25.9));//25
console.log(Math.floor(25.5));//25
console.log(Math.floor(25.1));//25

8.3.4 random()方法

返回大于等于0小于1的一个随机数

从某个整数范围内随机选择一个值

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

1
2
3
4
5
//随机选择一个1到10之间的数值
var num1 = Math.floor(Math.random()*10+1);

//随机选择一个2到10之间的数值
var num2 = Math.floor(Math.random()*9+2);
1
2
3
4
5
6
7
8
function random(lowerValue, upperValue) {
var range = upperValue - lowerValue + 1;

return Math.floor(Math.random() * range + lowerValue);
}

var num = random(2, 10);
console.log(num);

随机取得数组中的一个项

1
2
3
4
5
6
7
8
9
function random(lowerValue, upperValue) {
var range = upperValue - lowerValue + 1;

return Math.floor(Math.random() * range + lowerValue);
}

var arr = ["red", "green", "yellow"];
var color = arr[random(0, arr.length - 1)];
console.log(color);

8.3.5 其他方法

方法 说明 分割线 方法 说明
Math.abs(num) 返回num的绝对值 Math.asin(x) 返回x的反正弦值
Math.exp(num) 返回Math.E的num次幂 Math.atan(x) 返回x的反正切值
Math.log(num) 返回num的自然对数 Math.atan2(y, x) 返回y/x的反正切值
Math.pow(num, power) 返回num的power次幂 Math.cos(x) 返回x的余弦值
Math.sqrt(num) 返回num的平方根 Math.sin(x) 返回x的反正弦值
Math.acos(x) 返回x的反余弦值 Math.tan(x) 返回x的正切值