《JavaScript高级程序设计》

一、基本概念

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 种基本数据类型: UndefinedNullBooleanNumberString
  • 引用类型:对象。

基本类型值和引用类型值具 有以下特点:
基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中;
 从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本;
引用类型的值是对象保存在堆内存中;
 包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针;
 从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同 一个对象;
 确定一个值是哪种基本类型可以使用 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 是绝对相等的。
 *  ************************************
 */

你可能感兴趣的:(《JavaScript高级程序设计》)