当前位置:Gxlcms > JavaScript > JavaScript自学笔记(必看篇)

JavaScript自学笔记(必看篇)

时间:2021-07-01 10:21:17 帮助过:6人阅读

0-判断变量、参数是否初始化

  1. if(x){} //变量被初始化了或者变量不为空或者变量不为零

1-声明函数不需要声明返回值、参数类型,句尾甚至都不需要';'

  1. function sum(i1,i2){return i1+i2}

2-直接声明匿名函数立即使用

  1. var f=function(i1,i2){return i1+i2;}; alert(f(1,2));//普通匿名函数
  2. alert(function(i1,i2){return i1+i2;}(3,4));//直接声明,立即使用

3-js中没有类的概念,于是有些方法就长的像类了

  1. function Person(name,age){
  2. this.Name=name;//动态增加属性,类似于C#里的dynamic A = new ExpendoObject();
  3. this.Age=age;
  4. this.SayHello=function(){alert('Hello,My name is '+name+' I am '+age+' years old.')};
  5. }
  6. var p1=new Person('lorry',21);
  7. p1.SayHello(); //像类一样调用
  8. p1.Gender='男'; //动态增加‘性别'属性
  9. alert(p1.Gender);

4-Array对象就是数组,定义数组不用预先限定长度

  1. var arr=new Array();
  2. arr[0]=0;
  3. arr[1]=1;
  4. arr[2]=2;
  5. for(var i=0;i<=arr.length-1;i++){
  6. alert(arr[i]);
  7. }

5-Array是数组,也是Dictionary,也是Stack

  1. var dict=new Array();//作为Dictionary使用
  2. dict['我']='wo';
  3. dict['爱']='ai';
  4. dict['你']='ni';
  5. alert(dict['我']); //通过键值调用
  6. alert(dict.爱); //像调用属性一样调用(动态语言的特性)
  7. for(var k in dict){ //js中的遍历
  8. alert(k); //'我','爱','你'-->打印出的是key
  9. }
  10. for(var k of dict){ //js中的遍历
  11. alert(k); //'wo','ai','ni'-->打印出的是value
  12. }
  13. var arr = [1,2,3,4,5];//Array的简化创建方式
  14. var arr = {"lorry":21,"cloud":20};//字典风格的创建方式

6-遍历当前页面能够调用的所有元素

  1. var s=null;
  2. for(var k in document){//对象的属性都是以key的形式出现的
  3. s+=k+" ;";
  4. }
  5. alert(s);

7-使用类似Array的下标操作获取字符串某个指定位置的字符

  1. var s = 'Hello, world!';
  2. s[0]; // 'H'
  3. s[6]; // ' '
  4. s[12]; // '!'
  5. s[13]; // undefined 超出范围的索引不会报错,但一律返回undefined
  6. 需要特别注意的是,字符串是不可变的,如果对字符串的某个索引赋值,不会有任何错误,但是,也没有任何效果:
  7. var s = 'Test';
  8. s[0] = 'X';
  9. alert(s); // s仍然为'Test'

8-改大写小写

  1. var s = 'Hello';
  2. s.toUpperCase(); // 返回'HELLO'
  3. var s = 'Hello';
  4. s.toLowerCase(); // 返回'hello'

9-搜索指定字符串出现的位置

  1. var s = 'hello, world';
  2. s.indexOf('world'); // 返回7
  3. s.indexOf('World'); // 没有找到指定的子串,返回-1

10-获取字符串指定索引区间的子串

  1. var s = 'hello, world'
  2. s.substring(0, 5); // 从索引0开始到5(不包括5),返回'hello'
  3. s.substring(7);// 从索引7开始到结束,返回'world'

11-JavaScript的对象是一种无序的集合数据类型,它由若干键值对组成

  1. var xiaoming = {
  2. name: '小明',
  3. birth: 1990,
  4. school: 'No.1 Middle School',
  5. height: 1.70,
  6. weight: 65,
  7. score: null//最后一个键值对不需要在末尾加','
  8. };
  9. xiaoming.name; // '小明'
  10. xiaoming.birth; // 1990
  11. 访问属性是通过.操作符完成的,但这要求属性名必须是一个有效的变量名。如果属性名包含特殊字符,就必须用[]括起来:
  12. var xiaohong = {
  13. name: '小红',
  14. 'middle-school': 'No.1 Middle School'
  15. };
  16. xiaohong['middle-school']; // 'No.1 Middle School'
  17. xiaohong['name']; // '小红'
  18. xiaohong.name; // '小红'
  19. xiaohong.age; // undefined

12-检测xiaoming是否拥有某一属性,用in操作符:

  1. 'name' in xiaoming;// true
  2. 'grade' in xiaoming;// false
  3. ***如果in判断一个属性存在,这个属性不一定是xiaoming的,它可能是xiaoming继承得到的:
  4. 'toString' in xiaoming; // true
  5. ***要判断一个属性是否是xiaoming自身拥有的,而不是继承得到的,可以用hasOwnProperty()方法:
  6. xiaoming.hasOwnProperty('name'); // true
  7. xiaoming.hasOwnProperty('toString'); // false

13-Map

  1. var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);//二维数组初始化法
  2. m.get('Michael'); // 95
  3. var m = new Map();// 直接初始化一个空Map
  4. m.set('Adam', 67); // 添加新的key-value
  5. m.set('Bob', 59);
  6. m.has('Adam'); // 是否存在key 'Adam': true
  7. m.get('Adam'); // 67
  8. m.delete('Adam'); // 删除key 'Adam'
  9. m.get('Adam'); // undefined
  10. var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
  11. for (var n of m) { // 遍历Map
  12. alert(n[1] + '=' + n[0]);
  13. }

14-iterable内置的forEach方法,它接收一个函数,每次迭代就自动回调该函数。

  1. var a = ['A', 'B', 'C'];
  2. a.forEach(function (element, index, array) {
  3. // element: 指向当前元素的值
  4. // index: 指向当前索引
  5. // array: 指向Array对象本身
  6. alert(element);
  7. });
  8. Set与Array类似,但Set没有索引,因此回调函数最多两个参数:
  9. var s = new Set(['A', 'B', 'C']);
  10. s.forEach(function (element, set) {
  11. alert(element);
  12. });
  13. Map的回调函数参数依次为value、key和map本身:
  14. var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
  15. m.forEach(function (value, key, map) {
  16. alert(value);
  17. });
  18. var a = ['A', 'B', 'C'];
  19. a.forEach(function (element) {
  20. alert(element);
  21. });

15-用Array的map()方法,传入我们自己的函数,就得到了一个新的Array作为结果:

  1. var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
  2. arr.map(function(x){
  3. return x*x;
  4. }).forEach(function (element) {
  5. alert(element);// [1, 4, 9, 16, 25, 36, 49, 64, 81]
  6. });

16-用map()把Array的所有数字转为字符串:

  1. var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
  2. arr.map(String); // ['1', '2', '3', '4', '5', '6', '7', '8', '9']

17-用Array的reduce()做累积计算

  1. var arr = [];
  2. for (var x = 1; x <= 100; x++) {
  3. arr.push(x); //将1~100放入数组
  4. }
  5. alert(arr.reduce(function(x,y){
  6. return x+y; //对arr的所有对象累积求和,返回求和结果
  7. }));

18-用reduce()做一个牛逼的转换:把[1, 2, 5, 8, 0]变换成整数12580

  1. var arr = [1, 2, 5, 8, 0];
  2. alert(arr.reduce(function(x,y){
  3. return x*10+y;
  4. }));

19-用filter()把Array的某些元素过滤掉

  1. var arr = [0,1,2,3,4,5,6,7,8,9];
  2. alert(arr.filter(function(x){
  3. return x%2===0;
  4. }));//0,2,4,6,8 //返回true则保留
  5. 把一个Array中的空字符串删掉
  6. var arr = ['A', '', 'B', null, undefined, 'C', ' '];
  7. alert(arr.filter(function (s) {
  8. return s && s.trim(); // 注意:IE9以下的版本没有trim()方法
  9. })); // ['A', 'B', 'C']

20-Array的sort()方法默认把所有元素先转换为String再排序,于是...

  1. [10, 20, 1, 2].sort(); // [1, 10, 2, 20]
  2. 因此如果要按数字大小排序,可以这么写:
  3. var arr = [];
  4. for (var x = 1; x <= 10; x++) {
  5. arr.push(x);
  6. }
  7. document.write(arr+"<br/>");
  8. document.write(arr.sort(function(x,y){
  9. return x<y?true:false;
  10. }));
  11. 若要忽略字母大小写影响,则要先转化为大写或小写
  12. var arr = ['Google', 'apple', 'Microsoft'];
  13. alert(arr.sort(function (s1, s2) {
  14. var x1 = s1.toUpperCase();
  15. var x2 = s2.toUpperCase();
  16. return x1 < x2 ?false:true;
  17. })); // ['apple', 'Google', 'Microsoft']

21-闭包(Closure)程序结构

 

  1. ①将函数作为返回值赋值给参数,调用该参数获得计算结果
  2. var arr = [];
  3. for(var n=1;n<101;n++){
  4. arr.push(n);
  5. }
  6. function lazy_sum(arr){
  7. var sum = function(){
  8. return arr.reduce(function(x,y){
  9. return x+y;
  10. });
  11. }
  12. return sum;
  13. }
  14. var f = lazy_sum(arr);
  15. alert(f());
  16. ②返回的函数并没有立刻执行,而是直到调用了f()才执行
  17. function count() {
  18. var arr = [];
  19. for (var i=1; i<=3; i++) {
  20. arr.push(function () {
  21. return i * i;
  22. });
  23. }
  24. return arr;
  25. }
  26. var results = count(); //results里存了3个function
  27. var f1 = results[0];
  28. var f2 = results[1];
  29. var f3 = results[2];
  30. f1(); // 16 返回的函数引用了变量i,但它并非立刻执行。
  31. f2(); // 16 等到3个函数都返回时,它们所引用的变量i已经变成了4,
  32. f3(); // 16 因此最终
结果为16 ***返回闭包时牢记:返回函数不要引用任何循环变量,或者后续会发生变化的变量! ③如果一定要引用循环变量怎么办? 方法是再创建一个函数,用该函数的参数绑定循环变量当前的值, 无论该循环变量后续如何更改,已绑定到函数参数的值不变: function count() { var arr = []; for (var i=1; i<=3; i++) { arr.push(function(n){ return function(){ return n*n; } }(i)); } return arr; } var results = count(); var f1 = results[0]; var f2 = results[1]; var f3 = results[2]; alert(f1()); // 1 alert(f2()); // 4 alert(f3()); // 9 ④在没有class机制,只有函数的语言里,借助闭包,可以封装一个私有变量 function creat_counter(init){ var n = init||0; return{ add:function(){ n+=1; return n; } } } var c = creat_counter(); alert(c.add());//1 alert(c.add());//2 alert(c.add());//3 ***在返回的对象中,实现了一个闭包,该闭包携带了局部变量n,并且,从外部代码根本无法访问到变量n。 换句话说,闭包就是携带状态的函数,并且它的状态可以完全对外隐藏起来。 ⑤利用Math.pow(x, y)计算x^2或x^3 //Math.pow(x, y)-->x^y function make_pow(y){ return function(x){ return Math.pow(x,y); } } var pow2 = make_pow(2) var pow3 = make_pow(3) alert(pow2(3))//9 alert(pow3(3))//27

22-箭头函数(目前仅firefox支持) //参数=>函数体

  1. var f = x => x*x*x
  2. alert(f(3)) //27

23-用generator产生斐波那契数列

  1. function* fib(max){
  2. var t,a=0,b=1,n=1;
  3. while(n<=max){
  4. yield a;
  5. t=a+b;
  6. a = b;
  7. b = t;
  8. n++;
  9. }
  10. return a;
  11. }
  12. for (var x of fib(10)) {//用for ... of循环迭代generator对象
  13. document.write(x+' '); // 依次
输出0, 1, 1, 2, 3 } 用generator产生一个自增的ID(无需全局变量) function* next_id(){ for(var x = 1; x < 100; yield x++ ); } var g = next_id(); alert(g.next().value);//1 alert(g.next().value);//2 alert(g.next().value);//3

以上就是小编为大家带来的JavaScript自学笔记(必看篇)全部内容了,希望大家多多支持脚本之家~

人气教程排行