一、基本概念
1、parseInt、parseFloat
parseInt('123',10) // 第二个参数为转换进制,默认为10
parseFloat('12.12') //不接受第二个参数
parseFloat('12.12.123') // 12.12 制取第一个小数点,其他的剔除
二、变量、作用域和内存问题
1、String类型:
ECMAScript中,字符串不是引用类型。
2、垃圾收集
## 显式赋值Null,以便垃圾收集器收集。
function createPerson(name){
var localPerson = new Object();
localPerson.name = name;
}
var globalPerson = createPerson("Nicholas");
globalPerson = null; // 手工解除 globalPerson 的引用,方便垃圾收集器收集
小结:
JavaScript 变量有两种类型:基本类型
和引用类型
。
- 基本类型包含以下 5 种基本数据类型:
Undefined
、Null
、Boolean
、Number
和String
。 - 引用类型:对象。
基本类型值和引用类型值具 有以下特点:
基本类型
值在内存中占据固定大小的空间
,因此被保存在栈内存
中;
从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本;
引用类型
的值是对象
,保存在堆内存
中;
包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针;
从一个变量向另一个变量复制引用类型的值
,复制的其实是指针
,因此两个变量
最终都指向同 一个对象
;
确定一个值是哪种基本类型
可以使用 typeof
操作符,而确定一个值是哪种引用类型
可以使用 instanceof
操作符。
离开作用域的值将被自动标记为可以回收,因此将在垃圾收集期间被删除。
“标记清除”
是目前主流的垃圾收集算法,这种算法的思想是给当前不使用的值加上标记
,然
后再回收其内存。
三、引用类型
1、Array
## 1、toString()、toLocalString()、valueOf()
var colors = ["red", "blue", "green"]; // 创建一个包含 3 个字符串的数组
console.log(colors.toString()); // "red,blue,green"
console.log(colors.valueOf()); // ["red","blue","green"]
console.log(colors); // ["red","blue","green"]
2、Array 的迭代方法
每个方法都接收两个参数:要在每一项上运行的函数和 (可选的)运行该函数的作用域对象——影响 this 的值。
传入这些方法中的函数会接收三个参数:数组项的值
、该项在数组中的位置
和数组对象本身
。
every():对数组中的每一项运行给定函数,如果该函数对每一项
都返回 true,则返回 true。
some():对数组中的每一项运行给定函数,如果该函数对任一项
返回 true,则返回 true。
filter():对数组中的每一项运行给定函数,返回该函数会返回 true
的项组成的数组
。
forEach():对数组中的每一项运行给定函数。这个方法没有返回值
。
map():对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。
以上方法都不会修改数组中的包含的值。
## every()、some()
var numbers = [1,2,3,4,5,4,3,2,1];
var everyResult = numbers.every(function(item, index, array){
return (item > 2);
});
alert(everyResult); //false
var someResult = numbers.some(function(item, index, array){
return (item > 2);
});
alert(someResult); //true
## filter()
var numbers = [1,2,3,4,5,4,3,2,1];
var filterResult = numbers.filter(function(item, index, array){
return (item > 2);
});
alert(filterResult); //[3,4,5,4,3]
## map()
var numbers = [1,2,3,4,5,4,3,2,1];
var mapResult = numbers.map(function(item, index, array){
return item * 2;
});
alert(mapResult); //[2,4,6,8,10,8,6,4,2]
## forEach()
var numbers = [1,2,3,4,5,4,3,2,1];
numbers.forEach(function(item, index, array){
item++;
});
console.log(numbers); // [1,2,3,4,5,4,3,2,1]
由于 forEach没有返回值,且第一个参数的函数不会影响原数组,所以该方法基本只适用于遍历取值。
3、Array 的排序 sort(function(a,b){...})
回调函数中:
a < b
返回负数
则不调换a、b的位置
;返回正数
则调换a、b的位置
;0
则不变
var a = [0,4,5,20,12,25,15];
a.sort(function(a,b){
return a-b; // 升序排列
return b-a; // 降序排列
})
四、面向对象
1、继承
/**
* 继承关系-- prototype
*/
function Animal() {
this.name = 'animal';
}
Animal.prototype.sayName = function() {
alert(this.name);
};
function Person() {}
console.log(Person.prototype.constructor); // [Function: Person]
// 人继承自动物
Person.prototype = Animal.prototype;
console.log(Person.prototype.constructor); // Function: Animal]
// 更新构造函数为人
Person.prototype.constructor = 'Person';
var person = new Person();
console.log(Person.prototype); // { sayName: [Function] }
console.log(person.__proto__); // { sayName: [Function] }
console.log(person.__proto__ === Person.prototype); // true
/**
* ************************************
* ********* 实例对象的__proto__ 与该实例对象的构造函数的 prototype 是绝对相等的。
* ************************************
*/