一、javascript语法
Number
它在内部被表示为64位的浮点数,而且它没有分离出整数,1.0===1.好处是完全避免短整型溢出的问题。
string
- 字符串字面量可以包含在一对单引号或者双引号中,javascript中所以字符都是16位的。
- 字符串有一个length属性。
- 完全相同的字符+字符串顺序一样的字符串被认为是相同的字符串。
- 字符串连接有很多种,例如concat、slice、+,array.join()一般用+号比较好,根据浏览器的不同在提高性能方面也有不同。
二、对象
对象字面量
如果属性名不是标识符(字母开头,后面也可以加下划线、字母、数字),那么需要用“”括起来属性名,例如first-name。
var obj={
name:“leo”,
age:“22”
}
原型
原型连接在更新时不起作用。就是我们对某个对象做出改变时,他会触及该对象的原型。只有在检索时,会起作用。当我们找不到该对象的某个属性时,可以去其原型对象中找。
枚举
- for in可以遍历所有的可枚举的属性,包括原型上的。你可以通过hasOwnProperty来过滤一些你不想要的值。
- for in遍历出现的属性名的顺序不确定,如果你想要属性以特定的顺序出现,可以避免使用for in,而是将属性名以正确顺序放在一个数组中。
三、函数
函数调用
- 除了函数声明事定义的形参外,每个函数还接受两个附加的参数:this和arguments。
- 函数调用时,this邦定在全局对象上,但是当一个内部函数被调用是,应该将this邦定在外部函数的this变量上。解决办法:
function doubels(){
var that=this;//解决办法
var helper=function(){
return that.value;
}
helper();
}
递归
递归是可以直接或者间接调用自己的函数。可以非常高效地操作树形结构,例如DOM。一些语言也通过尾递归进行优化,目前javascript并没有提供尾递归优化。
回调
如果网络传输或者服务器很慢,采用异步请求,解决浏览器的阻塞问题。回调是异步请求之一,其中还包括promise、asyns/await、事件监听等等。
级联(一条语句一次调用一个对象的很多方法)
一些方法没有返回值,我们可以通过级联让这些方法返回this而不是undefined。
$('.mydiv').move(200,200).color('red').........;
柯里化
把多参数函数转化为一系列单参数函数并进行调用的技术。
Function.prototype.curry=function(){
var args=Array.prototype.slice.apply(arguments);
var _this=this;
return function(){
return _this.apply(null,args.concat(Array,prototype.slice.apply(arguments)));
}
}
记忆
在计算机领域,记忆主要用于加速程序计算的一种优化技术,它使得函数避免重复演算。
//一个简单斐波那契数列的优化
var fibonacci=function(){
//1.名为memo的数组保存我们的存储结果
var memo=[0,1];
var fib=function(n){
//2.存储结果隐藏在闭包中
var result=memo[n];
if(typeof result !=='number'){
return result=fib(n-1)+fib(n-2);
}
//3.如果结果存在,就返回这个结果。
return result;
};
return fib;
}
四、继承
new的实现
function _new(){
//1.创建一个新对象
var obj={};
//将构造函数的作用域指向这个新对象
var other=this.apply(obj,arguments);
//如果它的返回值不是一个对象,那么就返回新对象
return (typeof other === 'object'&& other)||obj;
}
函数化
我们所看到的继承模式的一个弱点及时没办法保护隐私。有些程序员会考虑接受一种伪装隐私的模式,就是给属性起一个奇奇怪怪的名字。我们可以通过应用模块模式来保护隐私。
var constructor=function(spec,my){
var that,其他的私有实例变量;
my=my ||{};//秘密共享的容器
把共享的变量和函数添加到my中
that=一个新对象
扩充that添加特权方法
return that;
}
五、数组
删除
数组删除会留下一个空洞。可以通过splice解决。
var arr=[1,2,3,4]
delete arr[2]//arr=[1,2,undefined,4]
arr.splice(2,1);//[1,2,4]
array.sort()
sort方法对array中的内容进行排序,但是不能正确的给一组数字排序。需要通过自己的比较函数代替默认的比较函数。
不稳定的。稳定性是指排序后相等值的相对位置没有发生变化。
//数字的升序
arr.sort(function(a,b){
return a-b;
})
//字符串排序
var m=['aa','bb'.'a',2,4,1,6];
m.sort(function(a,b){
if(a===b){
return 0;
}
if(typeof a===typeof b){
return a<b ? -1: 1;
}
return typeof a < typeof b ? -1 : 1;
});
//m=[1,2,4,6,'a','aa','bb']
六、正则表达式Regexp
处理正则表达式的方法
regexp.exec(string) | 返回一个数组 |
---|---|
regexp.test(string) | 匹配返回true 不要使用/g |
string match(regexp) | /g,如果没有g和regexp.exec()结果相同 |
string.replace(searchvalue,replacevalue) | str.replace(/c/g,‘b’) |
string.search(regexp) | text.search(/[" ']/)会返回第一个匹配的首字符的位置,没有返回-1 |
string.split() | 如果是正则,有的系统会排出空字符串,有的不会 |
regexp对象的属性
属性 | 用法 |
---|---|
global | 如果标识g被使用,值为true |
ignoreCase | 标识i使用,值为true |
lastIndex | 下一次exec匹配开始的索引。初始值为0 |
multiline | 标识m(换行)被使用,值为true |
source | 正则表达源码文本 |
正则表达式转义
/d | [0-9]数字 |
---|---|
/s | 空白 |
/w | [0-9A-Za-z]字母和数字 |
/b | 边界 |
正则表达式字符转义
字符类中需要转义的特殊字符:- / [ \ ] ∧
正则表达式分组
捕获型 | 非捕获型 | 向前正向匹配 | 向前负向匹配 |
---|---|---|---|
任何匹配这个分组的字符都会捕获,每个捕获型分组会被指定一个数字,正则表达式中第一个捕获( 的分组1,第二个捕获 (是分组2 | ?: 只做简单的匹配,并不捕获所匹配的文本 | ?= 匹配后,文本会倒回到它开始的地方,实际上并不匹配任何东西。 | ?! 匹配失败后才继续向前进行匹配 |
七、代码风格
- 尽量只有唯一的全局变量。因为全局变量可以被程序任何部分在任意时间修改。降低程序的可靠性。
- 在每个函数开头声明我的所有变量。
- 在if中不使用赋值语句。我们要做的是===
- 不使用块注释 因为一些正则也会出现/ * * /
- 少用with语句和eval语句(以及 setTimeout、setInterval、Function提供了访问javascript编译器的机会)
- ++ --少用,会引起缓冲区溢出。i+=1
- 类型的包装对象,主要用来操作基本类型的。不要使用new String 、new Number 、new Boolean