JavaScript自学笔记(必看篇)
作者:jingxian 发布时间:2024-11-11 23:24:38
标签:自学,javascript
0-判断变量、参数是否初始化
if(x){} //变量被初始化了或者变量不为空或者变量不为零
1-声明函数不需要声明返回值、参数类型,句尾甚至都不需要';'
function sum(i1,i2){return i1+i2}
2-直接声明匿名函数立即使用
var f=function(i1,i2){return i1+i2;}; alert(f(1,2));//普通匿名函数
alert(function(i1,i2){return i1+i2;}(3,4));//直接声明,立即使用
3-js中没有类的概念,于是有些方法就长的像类了
function Person(name,age){
this.Name=name;//动态增加属性,类似于C#里的dynamic A = new ExpendoObject();
this.Age=age;
this.SayHello=function(){alert('Hello,My name is '+name+' I am '+age+' years old.')};
}
var p1=new Person('lorry',21);
p1.SayHello(); //像类一样调用
p1.Gender='男'; //动态增加‘性别'属性
alert(p1.Gender);
4-Array对象就是数组,定义数组不用预先限定长度
var arr=new Array();
arr[0]=0;
arr[1]=1;
arr[2]=2;
for(var i=0;i<=arr.length-1;i++){
alert(arr[i]);
}
5-Array是数组,也是Dictionary,也是Stack
var dict=new Array();//作为Dictionary使用
dict['我']='wo';
dict['爱']='ai';
dict['你']='ni';
alert(dict['我']); //通过键值调用
alert(dict.爱); //像调用属性一样调用(动态语言的特性)
for(var k in dict){ //js中的遍历
alert(k); //'我','爱','你'-->打印出的是key
}
for(var k of dict){ //js中的遍历
alert(k); //'wo','ai','ni'-->打印出的是value
}
var arr = [1,2,3,4,5];//Array的简化创建方式
var arr = {"lorry":21,"cloud":20};//字典风格的创建方式
6-遍历当前页面能够调用的所有元素
var s=null;
for(var k in document){//对象的属性都是以key的形式出现的
s+=k+" ;";
}
alert(s);
7-使用类似Array的下标操作获取字符串某个指定位置的字符
var s = 'Hello, world!';
s[0]; // 'H'
s[6]; // ' '
s[12]; // '!'
s[13]; // undefined 超出范围的索引不会报错,但一律返回undefined
需要特别注意的是,字符串是不可变的,如果对字符串的某个索引赋值,不会有任何错误,但是,也没有任何效果:
var s = 'Test';
s[0] = 'X';
alert(s); // s仍然为'Test'
8-改大写小写
var s = 'Hello';
s.toUpperCase(); // 返回'HELLO'
var s = 'Hello';
s.toLowerCase(); // 返回'hello'
9-搜索指定字符串出现的位置
var s = 'hello, world';
s.indexOf('world'); // 返回7
s.indexOf('World'); // 没有找到指定的子串,返回-1
10-获取字符串指定索引区间的子串
var s = 'hello, world'
s.substring(0, 5); // 从索引0开始到5(不包括5),返回'hello'
s.substring(7);// 从索引7开始到结束,返回'world'
11-JavaScript的对象是一种无序的集合数据类型,它由若干键值对组成
var xiaoming = {
name: '小明',
birth: 1990,
school: 'No.1 Middle School',
height: 1.70,
weight: 65,
score: null//最后一个键值对不需要在末尾加','
};
xiaoming.name; // '小明'
xiaoming.birth; // 1990
访问属性是通过.操作符完成的,但这要求属性名必须是一个有效的变量名。如果属性名包含特殊字符,就必须用[]括起来:
var xiaohong = {
name: '小红',
'middle-school': 'No.1 Middle School'
};
xiaohong['middle-school']; // 'No.1 Middle School'
xiaohong['name']; // '小红'
xiaohong.name; // '小红'
xiaohong.age; // undefined
12-检测xiaoming是否拥有某一属性,用in操作符:
'name' in xiaoming;// true
'grade' in xiaoming;// false
***如果in判断一个属性存在,这个属性不一定是xiaoming的,它可能是xiaoming继承得到的:
'toString' in xiaoming; // true
***要判断一个属性是否是xiaoming自身拥有的,而不是继承得到的,可以用hasOwnProperty()方法:
xiaoming.hasOwnProperty('name'); // true
xiaoming.hasOwnProperty('toString'); // false
13-Map
var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);//二维数组初始化法
m.get('Michael'); // 95
var m = new Map();// 直接初始化一个空Map
m.set('Adam', 67); // 添加新的key-value
m.set('Bob', 59);
m.has('Adam'); // 是否存在key 'Adam': true
m.get('Adam'); // 67
m.delete('Adam'); // 删除key 'Adam'
m.get('Adam'); // undefined
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
for (var n of m) { // 遍历Map
alert(n[1] + '=' + n[0]);
}
14-iterable内置的forEach方法,它接收一个函数,每次迭代就自动回调该函数。
var a = ['A', 'B', 'C'];
a.forEach(function (element, index, array) {
// element: 指向当前元素的值
// index: 指向当前索引
// array: 指向Array对象本身
alert(element);
});
Set与Array类似,但Set没有索引,因此回调函数最多两个参数:
var s = new Set(['A', 'B', 'C']);
s.forEach(function (element, set) {
alert(element);
});
Map的回调函数参数依次为value、key和map本身:
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
m.forEach(function (value, key, map) {
alert(value);
});
var a = ['A', 'B', 'C'];
a.forEach(function (element) {
alert(element);
});
15-用Array的map()方法,传入我们自己的函数,就得到了一个新的Array作为结果:
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
arr.map(function(x){
return x*x;
}).forEach(function (element) {
alert(element);// [1, 4, 9, 16, 25, 36, 49, 64, 81]
});
16-用map()把Array的所有数字转为字符串:
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
arr.map(String); // ['1', '2', '3', '4', '5', '6', '7', '8', '9']
17-用Array的reduce()做累积计算
var arr = [];
for (var x = 1; x <= 100; x++) {
arr.push(x); //将1~100放入数组
}
alert(arr.reduce(function(x,y){
return x+y; //对arr的所有对象累积求和,返回求和结果
}));
18-用reduce()做一个牛逼的转换:把[1, 2, 5, 8, 0]变换成整数12580
var arr = [1, 2, 5, 8, 0];
alert(arr.reduce(function(x,y){
return x*10+y;
}));
19-用filter()把Array的某些元素过滤掉
var arr = [0,1,2,3,4,5,6,7,8,9];
alert(arr.filter(function(x){
return x%2===0;
}));//0,2,4,6,8 //返回true则保留
把一个Array中的空字符串删掉
var arr = ['A', '', 'B', null, undefined, 'C', ' '];
alert(arr.filter(function (s) {
return s && s.trim(); // 注意:IE9以下的版本没有trim()方法
})); // ['A', 'B', 'C']
20-Array的sort()方法默认把所有元素先转换为String再排序,于是...
[10, 20, 1, 2].sort(); // [1, 10, 2, 20]
因此如果要按数字大小排序,可以这么写:
var arr = [];
for (var x = 1; x <= 10; x++) {
arr.push(x);
}
document.write(arr+"<br/>");
document.write(arr.sort(function(x,y){
return x<y?true:false;
}));
若要忽略字母大小写影响,则要先转化为大写或小写
var arr = ['Google', 'apple', 'Microsoft'];
alert(arr.sort(function (s1, s2) {
var x1 = s1.toUpperCase();
var x2 = s2.toUpperCase();
return x1 < x2 ?false:true;
})); // ['apple', 'Google', 'Microsoft']
21-闭包(Closure)程序结构
①将函数作为返回值赋值给参数,调用该参数获得计算结果
var arr = [];
for(var n=1;n<101;n++){
arr.push(n);
}
function lazy_sum(arr){
var sum = function(){
return arr.reduce(function(x,y){
return x+y;
});
}
return sum;
}
var f = lazy_sum(arr);
alert(f());
②返回的函数并没有立刻执行,而是直到调用了f()才执行
function count() {
var arr = [];
for (var i=1; i<=3; i++) {
arr.push(function () {
return i * i;
});
}
return arr;
}
var results = count(); //results里存了3个function
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];
f1(); // 16 返回的函数引用了变量i,但它并非立刻执行。
f2(); // 16 等到3个函数都返回时,它们所引用的变量i已经变成了4,
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支持) //参数=>函数体
var f = x => x*x*x
alert(f(3)) //27
23-用generator产生斐波那契数列
function* fib(max){
var t,a=0,b=1,n=1;
while(n<=max){
yield a;
t=a+b;
a = b;
b = t;
n++;
}
return a;
}
for (var x of fib(10)) {//用for ... of循环迭代generator对象
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


猜你喜欢
- 转发和重定向:转发:一次请求和响应,请求的地址没有发生变化,如果此时刷新页面,就会出现重做现象。重定向:一次以上的请求和响应,请求地址发生一
- 我所希望的iframe功能是不要去控制父页面,如果他想要控制,哪从父页面里面加入什么代码能让他无法控制呢?假如iframe里面有这样的语句:
- 一、数组的创建方式一var a = new Array(); a[0]="wo"
- Python类的动态修改的实例方法相信很多朋友在编程的时候都会想修改一下已经写好的程序行为代码,而最常见的方式就是通过子类来重写父类的一些不
- 一、效果展示1、俄罗斯方块这个应该是玩起来最最简单的了…2、扫雷运气好,点了四下都没踩雷哈哈…3、五子棋我是菜鸡,玩不赢电脑人…
- ASP,一种最先广泛的流行在WEB行业的编程语言。严格的说,ASP还算不上的编程语言。不过,因为微软的大力支持,ASP这一路,走得非常顺利。
- 用清理软件清理电脑垃圾的时候,发现微信存了很多图片,进入路径一看,全是以.dat为格式的文件:尝试了直接把后缀名的.dat 改 .jpg和.
- 如果您还不太了解XML技术,您可以先看看此文:XML的语法、结构以及相关的一些技术 及 XML DOM介绍和例子XML中 CDATA的作用:
- 前言本文主要给大家介绍了关于Django跨域请求问题解决的几种方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。几种方法
- 前情提要:公司运营的一个商城系统,忽然发现订单提现功能有问题,有大量的商户体现金额和订单金额不一致。于是产生了需求,需要把提现表和供应商表作
- 报错:D:\Program Files\Anaconda3\lib\site-packages\matplotlib\figure.py:4
- 如下所示:#!/usr/bin/env python# -*- coding: utf-8 
- 前言对于会PhotoShop的人来说,抠图是非常简单的操作了,有时候几秒钟就能扣好一张图。不过一些比较复杂的图,有时候还是要画点时间的,今天
- 本文介绍了jquery在vue脚手架中的使用方式示例,分享给大家,具体如下:1:在各个vue文件中使用<script>impor
- 前言虽然一直在说“去IOE化”,但是在国企和政府,Oracle的历史包袱实在太重了,甚至很多业务逻辑都是写在Oracle的各种存储过程里面实
- python中shape()函数shape函数是numpy.core.fromnumeric中的函数,它的功能是读取矩阵的长度。1、shap
- 阅读上一篇:FrontPage XP设计教程3——网页的布局 FrontPage XP可以保证用户设计网页与不同的浏览器兼容,它所提供的样式
- 一张字体调整好的示例图:字体大小就是 fontsize 参数import matplotlib.pyplot as plt# 代码中的“..
- 1.条件语句几个注意点和C#不一样的。if a < 5 { return 0} else {
- 导读:最近使用Thinkphp5.1做开发,在使用LOG_PATH常量(日志路径)时发生报错,因为之前一直使用5.0的框架,换到5.1版本后