Javascript程序设计第三版,chapter4-5

本文详细探讨了JavaScript中的变量及其类型,包括类型检测的typeof和instanceof方法。接着介绍了执行环境与作用域的特点,强调了JavaScript没有块级作用域。在第五章中,详细阐述了引用类型,如Object、Array、Date、RegExp和Function,讨论了数组的各种操作方法以及Date对象的使用。最后,提到了基本包装类型和单体内置对象的概念,为全面掌握JavaScript编程提供了关键知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Javascript程序设计第三版,chapter4-5

第四章 变量、作用域、内存问题

4.1 变量及类型
  • 类型检测(typeof:基本类型与instanceof:引用类型
  • typeof检测基本类型:string, number, boolean, undefined, object.
// 使用
var s = 'hello';
var i = 0;
var n = null;
var o = new Object();

alert(s);   // string
alert(i);   // number
alert(n);   // object
alert(o);   // object
...
  • instanceof检测引用类型,即检测某一对象是哪一种类型的对象,如:对象是否为Array,Regexp,Date,等;
// 使用
alert(p instanceof Object); // p变量是否为Object对象
alert(a instanceof Array); // a变量是否为Array对象
4.2 执行环境与作用域
  • Javascript没有块级作用域

即:不像其他类C的语言中,由{……}里面的代码都是块级作用域,作用环境只在括号内。而javascript当中没有块级作用域,所以块级代码中定义的变量会在块级代码执行完毕后,作用域依然存在于全局环境中。

// if、for、等块级代码中定义的变量
for (var i = 0; i < 10 i++)
{
    // 块级作用域中的变量
    var test = i;
}

// 结果为:10;
// 原因:for中定义的变量,在执行完循环之后依然存在于全局环境中
alert(i);
  • 函数中定义的变量,在函数外部不能访问
// 函数中定义的变量作用域只在函数内,函数外不能访问内部变量
// 若要访问,可以参考:闭包;
function scope(a, b) 
{
    var sum = a + b;
    return sum;
}

// 结果:sum is not defined
// 原因:函数外部不能访问内部定义的变量
alert(sum);

第五章 引用类型

Object

创建方式:new与{}

    // 任何对象都可以通过new Object()创建
    var person = new Object();
    var dog = new Object();

    // 扩展属性
    person.name = "Jack";
    person.age = 29;

    // 扩展方法
    person.walk = function () {alert("person walking"};

    /*** 对象字面量创建对象 ***/
    var person = {
        name: "jack",
        age: 29
        walk: function(){alert("walking")}
    };

Array

// 空数组
var a1 = new Array();

// 指定个数的(实际js中数据长度是可变的)
var a2 = new Array(3);

// 创建,初始化
var a3 = new Array("John", "Jack", "Tom");

 数组字面量定义方式
// 空数组
var b1 = [];

// 指定内容
var b2 = ["red", "black", "gray"];

// 切记不要使用多个逗号,而之间没任何成员
var b3 = [,,,,,,];  // 会创建含有七个成员的数组,但实际是没有内容的,尽量不要这么做

// 数组长度,可变,可赋值
// b2数组的长度就变成了10,且下标3-9的成员都是未定义undefined,没有具体值
b2.length = 10;
  • 检查对象是否为数组方法:instanceof Array或者Array.isArray()方法

    • instanceof使用前提:假设只有一个全局作用域;
    • Array.isArray(obj):与在哪个全局作用域无关
  • 转换方法

    • toLocaleString():数组的以逗号隔开的字符串
    • toString():数组转化成以逗号隔开的字符串
    • valueOf():返回的依旧是数组
    • join():指定分隔符来返回数组字符串,不传值时默认用逗号
  • 数组栈(后进先出LIFO,push+shift)和队列(先进先出FIFO,pop+unshift)方法

    • push:尾部添加
    • pop:尾部删除
    • shift:头部删除
    • unshift:头部添加
  • 重排序方法

    • sort:默认以字符串比较,如果需要进行数值比较,需要给其传入一个比较函数
        function compare(a, b)
        {
            // 升序排列
            if (a < b) return -1;
            else if (a > b) return 1;
            else return 0;
    
            // 降序排列
            if (a < b) return 1;
            else if (a > b) return -1;
            else return 0;
        }
    
        // 简化
        function compare(a, b)
        {
            // 直接以0作为界限
            return a - b;
        }
    • reverse:反转数组
  • 其他数组处理函数

    • concat:追加数组,会另外复制一份数组返回,源数组无影响
        var a = ['a1', 'a2', 'a3'];
        var b = a.concat('b1', ['c1', 'c2']);
        // b 的输出结果为连结后的新数组,a不变
        alert(b);   // ==> a1,a2,a3,b1,c1,c2
    • slice:截取数组,只有一个参数时从该处开始直到数组结尾进行截取返回;有两个参数(index, count)时,表示从下标为index开始截取count个成员,组成新的数组返回,源数组不变。

          var a = [1, 2, 3, 4, 5, 6, 7, 8];
          var b1 = a.slice(3);    // 结果:4,5,6,7,8
          var b2 = a.slice(3, 2); // 结果:4,5
    • splice:该方法有多个功能,会根据参数的不同实现,删除,插入,替换功能,返回结果都是从源数组中删除的项

      1. 删除:只指定两个参数splice(start, count);
      2. 插入:至少指定三个参数splice(start, 0, value1, value2, …); start指定插入的位置, 0:表示要删除的项,不为0时可以同时实现替换,value1, value2, …表示要插入的数据;
      3. 替换:至少三个参数splice(start, count, value1, value2, …); start需要替换的起始位置,count删除这么多项,然后插入value1, value2, …实现原理和插入一样;
  • indexOf(左->右)和lastIndexOf(右->左):查找指定项的位置,接受的参数有两个(value, [start]), value:需要查找的值,start:从哪里开始查找;没找到返回-1

    // 两个方法查找时进行比较都是采用“===”全等
    var a = [1, 2, 3, 4, 5, 6, 5, 8, 10, 2, 1];
    var b1 = a.indexOf(3, 0); // 从左->右查找第一个3,从下标0开始
    var b2 = a.lastIndexOf(3, 0); // 从右到左查找第一个3,从最后一个开始

    var c1 = a.indexOf(5, 5); // 6
    var c2 = a.lastIndexOf(5, 5); // 4
  • 迭代方法:循环遍历数组,用指定函数条件来判断数组内的元素是否符合条件, 使用方法(every也可以是:some, filter, forEach, map):
    array.every(function(item, index, array){return item > 2})

    • every:数组中每个成员都满足function里的条件;

      var numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1];
      var everyResult = numbers.every(function(item, index, array){ return item > 2});
    • filter:过滤出符合function里条件的成员,组成新数组返回;

          var filterResult = numbers.filter(function(item, index, array){ return item > 2}); // => [3, 4, 5, 4, 3] 
    • forEach:没有返回值,作用只用于遍历数组中每一项,并针对每一项作出相应的操作;

          numbers.forEach(function(item, index, array){ //执行一定操作 }); // 只做遍历,然后在函数中处理,无返回值
    • some:只要有满足条件的,就返回true;

          var someResult = numbers.some(function(item, index, array){ return item > 2}); // 返回boolean值,只要有一个满足条件就返回true
    • map:对每个成员进行操作之后,重新组成新的数组返回;

      var mapResult = numbers.map(function(item, index, array){ return item * 2}); // 即:将每个成员乘2之后组成新的数组返回
  • 归并方法(reduce和reduceRight):递归调用,处理函数的返回值作为自身的第一个参数传入;reduce是从左到右遍历,reduceRight是从右到左遍历;

    var arr = [1, 2, 3, 4, 5];
    var sum = arr.reduce(function(prev, cur, index, array){
        // 返回的值传递给了prev,递归下去直到数组遍历结束
        return prev + cur;
    });

    // reduceRight用法和reduce一样

Date

RegExp

Function

基本包装类型

单体内置对象

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若叶岂知秋vip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值