记录方法及知识点,避免后期遗忘
null和undefined
null代表一个空值,undefined代表值未定义。
==和===
==会自动转换数据类型再比较。===不会自动转换数据类型,如果数据类型不一致,则返回false。
例如:false == 0 : true,false === 0:false
数组
var arry = new Array(1,2,3);
var array = [1,2,3];
对象
var model = {
name:"Chenxy",
age:20
}
Json
var model = {
"Name": "Chenxy",
"hooby": ["Eat", "Play", "Game"]
}
strict模式与全局变量
如果变量不用var申明,则视为全局变量。如存在多个同名的全局变量则会冲突。
为修复此问题,推出strict模式,如未声明则异常。启动方法为在js代码上加上 'use strict';
转义字符
\n 换行,\t 制表符,\\ 就是\
字符串方法
var ToUpper = strText.toUpperCase(); console.log("全部变大写:"+ToUpper); var ToLower = strText.toLowerCase(); console.log("全部变小写:"+ToLower); var IndexOf = strText.indexOf("jq"); console.log("返回指定字符出现的位置,如果没有则-1:"+IndexOf); var SubStr = strText.substring(0,3); console.log("返回指定区间字符串:"+SubStr);
数组方法
var arr = [10,20,30,'40']; var IndexOf = arr.indexOf(20); console.log("返回指定的索引,如果没有则-1:"+IndexOf); var Slice = arr.slice(2,3); console.log("截取部分元素,返回一个新的array,如果不写第二个则默认截取到最后:"+Slice); arr.push(50,60); //向末尾添加若干元素 arr.unshift(5,6); //向头部添加若干元素 arr.pop();//删除最后一个元素 arr.shift();//删除第一个元素 arr.sort(); //排序 arr.reverse(); //倒序 arr.splice(2,3,80,90); //从索引2开始删除三个元素,然后添加两个元素 var arr2 = ['A','B','C']; arr.concat(arr2); //合并两个数组 arr.concat(1,2,[3,4]); //自动将数组拆开,并组合 var join = arr.join('-'); console.log("每个元素都用指定连接符连接:"+join);
in操作符
查询对象中是否包含某一个属性。包含为true,反之为false。
例子:'name' in obj;
Map和Set
一组键值对的结构,拥有极快的查找速度。键不可以重名,如果重名则会替换之前那个
var sMap = new Map(); //初始化空Map sMap.set("A",67); //添加一个 sMap.set("B",70); sMap.has("A"); //判断是否存在 sMap.get("A"); //获取对应值 sMap.delete("A"); //删除key
Set没有重复的Key,重复元素会被自动过滤。剩下的和Map相同
arguments
调用者传入的所有参数。直接方法里面写即可
rest
多余的参数以数组的形式交给变量rest。例:function a(a,b,..rest){}
this
只获取被调用的对象。
apply
修复this指向对象。两个参数,第一个是需要绑定的this变量,第二个是参数。例子:getA.apply(xiaoming,[1,2,3]); //this指向小明,参数为123
call
跟apply相似,只不过是顺序输入。getA.call(xiaoming,1,2,3);
装饰器
利用apply,可以重写window内置方法。举例:
var oldParInt = window.parseInt; window.parseInt = function(){ alert(1); return oldParInt.apply(null,arguments); }
Map
遍历于数组,可以让数组中每个元素都执行某个方法。例:
function pow(x) { return x*x; } var arr = [1,2,3,4,5,6]; arr.map(pow);
reduce
函数必须接收两个值,遍历与数组,进行累加计算。例:
function pow(x,y) { return x*y; } var arr = [1,2,3,4,5,6]; arr.reduce(pow);
filter
过滤某些元素,返回剩下的元素。例,删除偶数只留下奇数:
var arr = [1,2,3,4,5,6];
var r = arr.filter(function(x){ return x % 2 != 0; }); console.log(r);
闭包私有变量
用javascript实现一个私有变量的效果,如下:
function ZiZeng(x) {
var z = x || 0; return { add: function() { z += 1; return z; } } } var zi = ZiZeng(); console.log(zi.add(1));
generator
除了return以外,可以返回多次使用yield。例子:循环输出效果
function* AddNum(max)
{
var qishi = 0; while (qishi < max){ yield qishi; qishi++; } return qishi; } for(var x of AddNum(5)) { console.log(x); }
注意:function*
typeof 与 instanceof
typeof 返回对象类型,例:typeof 1; //'number'
instanceof 用于判断一个变量是否某个对象的实例,例:"chenxy" instanceof String; //true
new object与object
var n = new Number(123); //实际上类型已经是object,所以类型尽量不要加new
var n = Number('123'); //转换为Number类型,类似于方法parseInt()
数字转换字符串
123.toString(); //异常,应写为 123..toString() 或 (123).toString()
正则表达式
\d 匹配数字,
\w 匹配字母或数字,
\s Tab或者空格
. 匹配任意字符,
* 任意个字符(包括0个),
+ 表示至少一个字符,
? 表示0或1个,
{n} 表示n个,
{n,m} 表示n-m个
[] 表示范围,比如:[0-9a-zA-Z\_] 可以匹配一个数字、字母或者下划线
A|B 匹配A或B,例如:[J|j]ava 可以匹配 Java 或 java
^表示行开头,例如:^\d
$表示行结束,例如:$\d
Javascript中,两种方法可以定义正则表达式
第一种:直接写,var a = /ABC\-001/;
第二种:实例化一个RegExp,var a = new RegExp('ABC\\-001');
判断是否匹配
var re = /^\d{3}$/;
re.test('000'); //true
切分字符串
'a b c d'.split(/\s+/); //['a','b','c']
分组
()表示要提取的分组。匹配成功以后会返回一个Array,第一个是本身,后面是匹配成功的字符串。例如:
var re = /^(\d{3})-(\d{3,8})$/;
re.exec('010-123456'); //['010-123456','010','123456']
Json
Json一个六种数据类型。number、boolean、string、null、array、object。
定死了字符串必须是 UTF-8,必须用双引号
序列化
var xiaoming = {
name:'晨星宇', age:22, skills:['Javascript','C#','Oracle'] }; console.log(JSON.stringify(xiaoming)); //{"name":"晨星宇","age":22,"skills":["Javascript","C#","Oracle"]} console.log(JSON.stringify(xiaoming,null,' ')); //格式化 console.log(JSON.stringify(xiaoming,['name','skills'])); //筛选键值,{"name":"晨星宇","skills":["Javascript","C#","Oracle"]}
还可以传入一个函数,这样每个键值都会被函数先处理
function convert(key, value) {
if (typeof value === 'string') { return value.toUpperCase(); } return value; } JSON.stringify(xiaoming, convert, ' ');
还可以自定义一个toJson方法,直接返回序列化的数据
var xiaoming = {
name:'晨星宇', age:22, skills:['Javascript','C#','Oracle'], toJSON:function(){ return { "Name":this.name, "Age":this.age }; } };
反序列化
console.log(JSON.parse('{"name":"晨星宇","age":22,"skills":["Javascript","C#","Oracle"]}'));
面向对象的JS
Js不去分类和实例的概念,都是通过原型(prototype)来实现面向对象编程的。举例:
比如说,我想买麦当劳,但是我们没有这个类。但现在有一个肯德基的类,如下:
var KFC = {
name:'kfc', money:200, eat:true };
除了名字不一样,剩下挺相似,就用这个。如下:
var KFC = {
name:'kfc', money:200, eat:function(){ console.log("开吃"); } }; function Create(name) { var s = Object.create(KFC); s.name = name; return s; } var M = Create("McDonald"); M.eat();
M._proto_ = KFC 低版本IE不支持这种指向,尽量不要使用
原型链
上面Create这个函数,原型链为:Create ---> Function.prototype ---> Object.prototype ---> null
构造函数
function Hello(Name)
{
this.name = Name; this.hello = function (){ alert('Hello' + Name); } } var xiaoming = new Hello("XiaoMing"); xiaoming.hello();
注意,一定要加上new
继承
因为两个方法原型链相同,所以需要修复原型链的关系。才可实现继承,具体方法如下:
//修复原型链
function inherits(Child,Parent)
{
var F = function(){} F.prototype = Parent.prototype; Child.prototype = new F(); Child.prototype.constructor = Child; } function Student(props) { this.name = props.name || 'Chenxy'; } Student.prototype.hello = function(){ alert('Hello,'+this.name+'!'); } function PrimaryStudent(props) { Student.call(this,props); this.grade = props.grade || 1; } //实现原型链 inherits(PrimaryStudent,Student); //调用方法 var pri = new PrimaryStudent("Chenxy"); pri.hello();