javascript语言精粹总结

一、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?: 只做简单的匹配,并不捕获所匹配的文本?= 匹配后,文本会倒回到它开始的地方,实际上并不匹配任何东西。?! 匹配失败后才继续向前进行匹配

七、代码风格

  1. 尽量只有唯一的全局变量。因为全局变量可以被程序任何部分在任意时间修改。降低程序的可靠性。
  2. 在每个函数开头声明我的所有变量。
  3. 在if中不使用赋值语句。我们要做的是===
  4. 不使用块注释 因为一些正则也会出现/ * * /
  5. 少用with语句和eval语句(以及 setTimeout、setInterval、Function提供了访问javascript编译器的机会)
  6. ++ --少用,会引起缓冲区溢出。i+=1
  7. 类型的包装对象,主要用来操作基本类型的。不要使用new String 、new Number 、new Boolean
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值