《Javascript高级程序设计》阅读笔记 ----第5章

对象类型

  1. 属性名可以是数字,或者有空格的字符串。这些特殊的属性都会被转为字符串。这种属性访问时不能用点运算符,只能用中括号
var person = {
  5:12,
  'my age': 10
}
person["my age"]  //10
person["5"] //12
person[5] //12

数组

  1. 利用数组的length可以在数组尾部增加值

    var arr = ["apple", "banana"];
    arr[arr.length] = "orange";
    console.log(arr);
    // [ 'apple', 'banana', 'orange' ]
    
  2. 检测数组

    1. instanceof
    2. isArray(): instanceof假定的是单一的全剧环境。假如一个页面有多个框架,那么不同框架的Array构造函数也会不同。isArray()解决的就是,不管来自哪个全局环境,都只判断某个值是不是数组
  3. 转换方法
    toString(): 返回由数组中每个值的字符串形式拼接而成的一个以逗号分割的字符串
    toLocaleString(): 返回由数组中每个值的字符串形式拼接而成的一个以逗号分割的字符串
    valueOf(): 返回的还是数组

    var arr = [true, "banana"];
    console.log(arr.toString());
    console.log(arr.toLocaleString());
    console.log(arr.valueOf());
    
    /*
    true,banana
    true,banana
    [ true, 'banana' ]
    */
    

    join('||'): 以参数作为分割符连接数组中的元素

    • push(): 在尾部加入任意个元素,返回新长度
    • pop():在尾部删除最后一个元素,返回这个元素
  4. 队列

    • push()
    • shift():在头部删除第一个元素,返回这个元素
  5. 相反队列

    • pop()
    • unshift():在头部加入任意个元素,返回新长度
  6. 排序方法

    • reverse(): 将数组元素顺序倒置
    • sort(function):若没有指定function,则将所有元素使用toString()转化后进行字符串比较(字典序)
  7. 操作方法

    • concat(): 创建当前数组的一个副本,将参数加入到副本的末尾。参数不管是单个值还是数值,最后都会抽取出单个值加入。 新数组和原数组相互独立。

      var arr = [true, "banana"];
      arr2 = arr.concat("orange", ["black", "pink"]);
      console.log(arr2)
      // [ true, 'banana', 'orange', 'black', 'pink' ]
      
    • slice:按左闭右开切分出原数组的一部分。新数组和原数组相互独立。若参数为负数,则用数组长度加上负数作为切分位置。

      var arr = [true, "banana", "orange"];
      arr2 = arr.slice(0,1)
      console.log(arr2)
      // [ true ]
      
    • splice(index, num, a, b, ....): 从index开始删除num个元素,并插入a, b, … 若num为零,则单纯为插入,若没有a, b … 则单纯为删除。

  8. 查找方法

    • indexOf(ele, 【start】): 从start开始左到右查找ele所在的下标。
    • lastIndexIOf(ele, 【start】): 从start开始右到左查找ele所在的下标。
  9. 迭代方法
    arg: function(item, index, array) {}

    • every(arg): 对数组中的每一项运行函数,若每一项都返回true,则返回true
    • filter(arg):对数组中的每一项运行函数,返回该函数返回true的值组成的数组
    • forEach(arg):对数组中的每一项运行函数,没有返回值
    • map(arg):对数组中的每一项运行函数,返回调用结果组成的数组
    • some(arg):对数组中的每一项运行函数,若有一项返回true,则返回true
    var numbers = [1, 2, 3, 4, 5, 6]
    console.log(
      numbers.every((item, index, array)=>{
        return item > 2;
      })
    ) //false
    
    console.log(
      numbers.some((item, index, array) => {
        return item > 2;
      })
    ) //true
    
    
    numbers.forEach((item, index, array)=> {
      item = item + 1
    })
    
    console.log(numbers) //[ 1, 2, 3, 4, 5, 6 ]
    /*
    此处原数组的值并没有改变。原因可见上一章关于函数的笔记。
    item 作为 函数的参数传进去,都是按值传递的,因此改变item并不会改变原数组的值。
    但假如原数组中的元素是引用型,传进参数的就是这个对象在堆内存中的地址,
    因此作属性改变时,改变会作用到原对象
    
    */
    
    console.log(
      numbers.filter((item, index, array)=>{
        return item > 2;
      })
    ) //[ 3, 4, 5, 6 ]
    
    console.log(
      numbers.map((item, index, array)=> {
        return item + 1;
      })
    )//[ 2, 3, 4, 5, 6, 7 ]
    
    
  10. 缩小方法

    • reduce
    • reduceRight()
    reduce(function(prev, curr, index, array){
    	return value;
    })
    

    每次迭代取数组中的两个值,将返回值作为下一次迭代的prev

Date类型

  1. 创建: new Date(): 无参数则创造当前时间,有参数则内部调用parse
  2. 根据字符串生成date:Date.parse()

RegExp

字面量形式:
var expression = /pattern/flags

使用构造函数形式:
var expression = new RegExp("pattern", "flag")

使用构造函数形式,参数为string,因此对于一些转义字符,要进行双重转义

flags:

  1. g:全局
  2. i:不区分大小写
  3. m:多行

方法:

  • exec() 为捕获组而设计。参数:要应用模式的字符串。返回值:一个数组。数组的第一个元素是与整个模式匹配的字符串,其他项是与捕获组相匹配的字符串。一个捕获组即模式中用括号包起来的部分
    引用自
    在这里插入图片描述
  • test():测试某个字符串是否符合模式

Function

函数声明和函数定义

Js中解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问),而函数表达式,则需要等到解析器执行到它所在的代码行,才会真正被解释执行。

函数作为参数

应用场景:hbxEat()中不论调用什么Eat()函数,都需要附带hbx这个值

function hbxEat(eat, foodnum) {
  var name = "hbx";
  var left = eat(foodnum);
  console.log(name + " eat and left " + left );
}

function eatapple(applenum) {
  console.log("original apple: " + applenum);
  applenum--;
  return applenum;
}

function eatpear(pearnum) {
  console.log("original pear: " + pearnum);
  pearnum--;
  return pearnum;
}


var apple = 10;
var pear = 5;


hbxEat(eatapple, apple);
hbxEat(eatpear, pear);
/*
original apple: 10
hbx eat and left 9
original pear: 5
hbx eat and left 4
*/

函数作为返回值

闭包:

  • 保存局部变量

arguments

每个函数都有一个arguments类数组对象,保存所有的参数

arguments使用

function eat(somefood) {
  for (let arg of arguments) {
    console.log("eat " + arg);
  }
}


eat("apple", "pear", "tomato");
/*
eat apple
eat pear
eat tomato
*/

附:for...in, for...of, forEach方法辨析引用

forEach():不能中断,只能用于array
for...in:可以中断,只能用于”enumerable“对象
for...of :可以用于“很多“对象

对于mapfor...in遍历的是keyfor...of遍历的是value

function eat(somefood) {
  console.log(arguments);
  for (let arg in arguments) {
    console.log("eat " + arg);
  }
}


eat("apple", "pear", "tomato");

/*
[Arguments] { '0': 'apple', '1': 'pear', '2': 'tomato' }
eat 0
eat 1
eat 2
*/

callee

arguments对象还有一个属性callee,指向本函数。用处:在递归时去除函数与函数名耦合。

去耦合例子

function factorial(num) {
	if (num <= 1) {
		return 1;
	}
	else {
		return num * arguments.callee(num-1);
	}
}

caller

每个函数都有一个属性caller,指向调用本函数的函数。当函数是全局函数时,这个值为null

function outer() {
  inner();
}

function inner() {
  console.log(inner.caller);
}

outer();

//[Function: outer]

this

指的是当前函数执行的环境对象(不是指这个函数)。当在函数的全局作用域调用这个函数时,指的是window

call & apply

改变函数执行的环境对象(this)

  1. apply(this, arguments | [])
  2. call(this, a1, a2, a3)

可以实现对象和方法的解耦

bind

创建一个this确定的函数
functionA = functionB.bind(objectC)

length

函数属性length,返回函数期望获得的参数个数

基本包装类型

String,Boolean,Number。这些类型是对基本类型的包装,封装了一些方法,成为一个对象。

var s1 = "absd";
var s2 = s1.substring(2);
console.log(s2);

执行过程:

  • 将s1基本类型封装成String类型,
  • 使用substring方法
  • 销毁该包装类型

String

一些常用的方法

  1. trim():创建一个字符串的副本,删除前置和后置的所有空格,然后返回结果。
  2. toLowerCase() / toUpperCase():大小写转换
  3. indexOf():查找子串的位置
  4. concat():连接
  5. slice(start, end) / substring(start, end):生成子串,不影响原串
  6. length():长度

Global对象

兜底儿对象。不属于任何其他对象的属性和方法,都是他的属性和方法。

Math对象

  1. Math.ceil():向上舍
  2. Math.floor():向下舍
  3. Math.round():标准舍
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值