在JS 中一切都是对象
JS是一门面向对象的语言,但它不使用类。JS是基于原型的。
字符串、数值、数组、函数...都可以是对象。此外还能自定义对象。且对象是一种特殊的数据,拥有属性和方法。
创建JS对象有两种方法
- 使用Object定义并创建对象
// 以构造函数的形式来调用
new Object([value]) // value可以是任何值
// 等价于 o = new Boolean(true);
var o = new Object(true);
// 创建对象并添加属性
person=new Object();
person.firstname="John";
person.lastname="Doe";
person.age=50;
person.eyecolor="blue";
// 字面量
person={firstname:"John", lastname:"Doe", age:50, eyecolor:"blue"};
- 使用对象构造器(使用函数来定义对象,然后创建新的对象实例)
function person(firstname,lastname,age,eyecolor)
{
this.firstname=firstname;
this.lastname=lastname;
this.age=age;
this.eyecolor=eyecolor;
// 将方法赋予对象
this.changeName=changeName;
function changeName(name){
this.lastname=name;
}
}
var myFather=new person("John","Doe",50,"blue");
myFather.changeName("adwa");
JavaScript 的对象是可变的
对象是可变的,它们是通过引用来传递的。
var x = person; // 不会创建 person 的副本,是引用
实现深拷贝可以看这个博客:
https://www.cnblogs.com/hyns/p/12405328.html
JS Prototype对象
所有的JS对象都有的prototype属性指向自己的prototype对象。所有的对象都会从自己的prototyoe对象中继承属性和方法。所有 JavaScript 中的对象都是位于原型链顶端的 Object 的实例。
JS对象还会有一个指向原型对象的链。当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。
添加属性和方法
有的时候我们想要在所有已经存在的对象添加新的属性或方法。
另外,有时候我们想要在对象的构造函数中添加属性或方法。
使用 prototype 属性就可以给对象的构造函数添加新的属性:
function Person(first, last, age, eyecolor) {
this.firstName = first;
this.lastName = last;
this.age = age;
this.eyeColor = eyecolor;
}
// 这样是不行的
Person.nationality = "English";
// 要在原型对象上添加
Person.prototype.nationality = "English";
通常使用构造器(函数体)定义属性,使用原型对象(prototype)定义方法。
如此,构造器只包含属性定义,而方法则分装在不同的代码块,使代码更具可读性。
注意:千万不能使用字面量的形式定义方法,因为原型会被重写。
function Fn() {};
// 定义属性
Fn.prototype.a = 1;
Fn.prototype.b = 2;
// 字面量定义方法,原型被重写,原有属性和方法被更新
Fn.prototype = {
c : function() {
return this.a + this.b;
}
}
var foo = new Fn();
foo.c(); // NaN
foo.a; // undefined
foo.b; // undefined
Number对象
注意:JS不定义不同的数字类型,所有的数字其实都是浮点类型且均为64位。
遵循 IEEE 754 规范,采用双精度存储(double precision)
其中前52位(0-51)可以用来表示基数,后11位(52-62)表示指数。最后一位(63)表示符号。
- 科学计数法
var y = 123e5; // 12300000
var z = 123e-5; // 0.00123
- 八进制和十六进制
var y = 0377; // 0开头八进制
var z = 0xFF; // 0x开头十六进制
// 默认十进制
toString 方法可以输出对应进制数
var myNumber=128;
myNumber.toString(16); // 返回 80
myNumber.toString(8); // 返回 200
myNumber.toString(2); // 返回 10000000
- Infinity 无穷大 和 NaN 非数字类型
当数字超过JS数字类型表示范围则是无穷大,Infinity或者-Infinity。Infinity也是数字类型。 - 一些属性和方法
RegExp对象,正则
- 创建,两种方法
var patt=new RegExp(pattern,modifiers);
var patt=/pattern/modifiers;
modifiers是修饰符,i是不区分大小写,g表示全局匹配(匹配所有的),m表示多行匹配。