JavaScript学习笔记(一)

来源:互联网 发布:金仕达交易软件 官网 编辑:程序博客网 时间:2024/05/17 06:27

学习JS时的笔记,主要教程为:廖雪峰JS教程第一章到面向对象编程那一章。–[ 廖雪峰JS教程 ]

1:控制台console可以直接测试js代码;

2:js数据做比较时,有==和===,第一个不考虑数据类型,第二个考虑,坚持用第二个;

3:浮点数运算过程中会产生误差,所以比较浮点数用差比较某个阈值:Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true

4:’use strict’;保证变量得到var声明,在JS的第一行代码写上;

6:教程有多个函数功能,不记录下来;

7:声明对象:
var xiaoming = {
name: ‘小明’,
weight: 65,
score: null
//用逗号隔开,最后一个不带符号
};

8:NaN:not a number 无法计算结果时用NaN表示;并且NaN跟所有值(包括自己)都不相等,判断一个值是否为NaN:isNaN();

9:JS中变量能够用_和$开头,但是不能用数字开头;

10:JS是动态语言,同一个变量能够反复赋值,而且可以赋不同类型的变量;相对应的静态语言则是定义变量的时候必须制定变量类型,如果赋值的时候类型不匹配就会报错;

11:一个变量没有通过var就被使用,那么该变量会被自动声明为全局变量,在同一个界面的不同的JS文件中,若同一个变量都没用var声明,并且都使用了该变量,那会造成难以调试的结果;

12:字符串s=’qwer’;s[0]=’q’,如果修改:s[0]=’1’,不起任何作用也不会报错(但是数组会改变!);
字符串操作:toUpperCase()、toLowerCase把字符串全变大写/小写;
indexOf()搜索字符串出现的位置,返回数字;
substring(a,b)从a开始索引到b,substring(a)从a开始索引到结束。

13:数组:indexOf和字符串一样,slice和substring一样,push数组后加元素,pop数组后删元素;unshift头部加元素,shift头部减去元素;sort排序;reverse反转,splice修改数组万能方法splice(从第n个元素开始,删除x个元素,添加元素A1,添加元素A2……);concat连接一个数组生成一个新数组;join(‘‘)把数组中的元素用连接起来;

14:对象中若属性名有特殊字符,则用”括起来,而且无法使用.操作符,例如xiaoming.name和xiaoming[‘name’];对象可以动态增加或删除属性,删除用delete;‘name’ in xiaoming;查询xiaoming是否拥有某一属性;判断对象自身拥有而不是继承到的属性:xiaoming.hasOwnProperty(‘name’);

15:JS的if else语句和C++的基本一样;

16:JS的for循环可以有C++的for(;;);也可以有python的for in,for in对数组的循环得到的是string而不是number;

17:Map:键值对结构。例:var m=new Map([[‘name’,’xiaoming’],[‘age’,20]]);
使用Map能极快的查询到key对应的value;查询方法:m.get(‘name’);增加Map数据:m.set(‘school’,’HIT’);

18:Set:和Map类似,但是只有key没有value。例:var s=new Set([1,2,3]);增减:add,delete

19:Map和Set是和Array对应起来的。Array、Map和Set都属于iterable类型。

20:JS调用函数传参就算传多了参数也没事。(JS允许接收任意个参数)

21:关键字arguments:调用函数中自动生成的一个类似数组(但是不是数组)的东西,存储参数。一般用来判断参数个数。

22:rest:function foo(a, b, …rest) {} rest是一个自动生成的数组,里面的数据是由第三个参数到最后一个参数组成的。

23:JS函数可以嵌套,内部函数可以使用外部函数定义的变量,当反过来不行。但是当内部函数和外部函数的变量重名时,内部函数将“屏蔽”外部函数的变量。

24.内部函数并不是直接执行的,若外部函数想要执行内部函数,还需要调用。

25:变量提升:JavaScript的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部。只提升变量声明,不提升变量值。

26:全局变量(包括顶层函数)会绑定在window上,即全部变量arr和window.arr是一个东西。不同的JS文件如果使用了相同名字的全局变量,或者是相同名字的顶层函数,会造成很难发现的命名冲突。所以减少冲突的一个方法是把一个JS文件中所有的全局变量和函数全部绑定到一个全局变量中。例如声明全局变量arr,先声明一个名字空间:var MyName={};然后MyName.arr=…………

27:for(var i=0;i<100;i++){};之后i会内函数内部保留并且值为100。用let代替var可以声明一个块级作用域的变量。

28:定义常量:const PI=3.14;即使后面给PI赋值,浏览器可能不报错,但无效果。

29:方法:给对象绑定一个函数,那么这个函数就是对象的方法了。

30:this:在一个方法内部,this是个始终指向当前对象的特殊变量。比如变量xiaoming有birthday属性,那么方法中的this.birthday和xiaoming.birthday一样。单独调用函数时,this指向全局变量window
。【要想this指向正确,必须用obj.xxx()形式调用】

31:在对象内声明函数时,该函数的内部函数的this指向window(而改函数this指向对象)。所以在声明函数时写上:var that=this;那么that就一定指向对象了。在声明函数的内部函数中使用that保证指向的对象正确。

32:函数可以用apply指定this指向哪个对象。如函数fun:fun.apply(对象,[]);[]为函数参数。与apply类似的是call(),apply把参数打包成数组传入,而call按顺序传送。例如:
Math.max.apply(null, [3, 5, 4]); // 5
Math.max.call(null, 3, 5, 4); // 5

33:高阶函数:可以接收另一个函数做参数的函数为高阶函数。

34:map:相当于一个for循环把给定的参数全部调用函数fun().例如数组arr,arr.map(fun)意思是把函数fun作用在arr所有的元素中并生成一个新的数组。

35:reduce和map类似,map中的参数个数是一个,而reduce参数个数是两个。reduce是把前面两个参数调入函数后生成的结果和下一个参数作为函数的参数,以此类推。

36:filter:用于把数组中的某些元素过滤,用法和map类似。

37:[sort]排序规则!把数字转化成string再按ASCII码排序!!例:[10, 20, 1, 2].sort(); // [1, 10, 2, 20]!但是sort也是高阶函数,可以按照类似reduce方法进行操作。

38:sort会直接对调用sort的数组进行修改,即:
var a1 = [‘B’, ‘A’, ‘C’];
var a2 = a1.sort();
有a1===a2===[‘A’,’B’,’C’];注:sort和C++的sort函数有很大的区别,不要弄混了。

39:闭包可以模仿面向对象的编程风格。闭包解释是:闭包外层是一个函数,内层也有函数,return内层函数,函数在真正调用时候执行,执行闭包后,闭包内部变量会存在,而闭包内部函数的内部变量不存在。[PS:没有特别理解闭包,还要加强理解。]

40:一种对闭包的理解:闭包就是定义在一个函数内部的函数||能够读取其他函数内部变量的函数。两个用处:一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。

41:闭包使函数中的变量保存在内存中,对内存消耗大,所以不能滥用闭包。解决方法:在退出函数之前,将不使用的局部变量全部删除。

42:闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

43:当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。

44:简而言之,闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。

45:箭头函数:x=>x*x;等于function(x){return x*x;}

46:箭头函数的this在对象的方法中始终指向对象。(this在箭头函数中与此法作用域(外层调用者obj)绑定了)。

47:在使用箭头函数的时候,apply和call等函数的第一个参数会自动被忽略。

48:generator(生成器):可以用yield多次返回,但是不是一次性返回,每次都需要.next()
function* foo(x) {
yield x + 1;
yield x + 2;
return x + 3;
}

49:JS中NULL类型是object,array类型也是object。

50:Date是JS中表示日期的函数,包装了很多方法。

51:RegExp正则表达式:用来匹配字符串或者进行字符串操作。

52:Json:JavaScript Object Notation,一种数据交换格式。json规定必须使用双引号”“。

53:面向对象:JS中不区分类和实例的概念,对于C++和JAVA的面向对象是有区别的。JS中通过原型(prototype)来实现面向对象。

54:JavaScript的原型链和Java的Class区别就在,它没有“Class”的概念,所有对象都是实例,所谓继承关系不过是把一个对象的原型指向另一个对象而已。

55:构造函数:绑定this指向新创建的对象,在创建对象时用new(不用的话就是个普通函数,用了的话构造函数就自己return this)。

0 0